У меня есть Recyclerview и список с 5000 элементами, но я хочу только загрузить по 100 предметов одновременно

Я Recyclerview в своем тестовом приложении. В настоящее время я беру около 5000 единиц данных в модель и загружаю свое представление в этот список. Все отлично, и прекрасно работает, но я не особо хочу загружать все 5000 предметов. Я бы предпочел загрузить 100 предметов, и как только пользователь ударит снизу, загрузите следующие 100 и по существу сделайте его постоянно растущим списком.

Я могу реализовать onScrollListener против Recyclerview чтобы выполнить обнаружение, когда я дошел до конца, но моя проблема (так же просто, как это звучит) заключается в том, что лучший способ сказать Recyclerview загружать только 100, пока я не скажу?

Мой адаптер:

 public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> { private List<ImageFeed> mFeedList; public MyAdapter(List<ImageFeed> feedList) { this.mFeedList = feedList; } public void setFeedList(List<ImageFeed> feedList) { mFeedList = feedList; } @Override public MyAdapter.ViewHolder onCreateViewHolder(ViewGroup vGroup, int i) { View v = LayoutInflater.from(vGroup.getContext()).inflate(R.layout.recycler_list, vGroup, false); return new MyAdapter.ViewHolder(v); } @Override public void onBindViewHolder(final MyAdapter.ViewHolder viewHolder, int i) { String mTitle = mFeedList.get(i).getTitle(); ...//Do other stuff } @Override public int getItemCount() { return mFeedList.size(); } public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener { protected ImageView mImageView; protected TextView mTitle; protected ProgressBar mLoader; private int mItemId; public ViewHolder(View itemView) { super(itemView); this.mImageView = (ImageView) itemView.findViewById(R.id.imgItem); this.mTitle = (TextView) itemView.findViewById(R.id.txtTitle); this.mLoader = (ProgressBar) itemView.findViewById(R.id.mLoaderProgress); this.mImageView.setOnClickListener(this); itemView.setOnClickListener(this); } public void setItem(int item) { this.mItemId = item; } @Override public void onClick(View v) { if (v instanceof ImageView) { Toast.makeText(v.getContext(), "Image view clicked: " + this.mItemId, Toast.LENGTH_SHORT).show(); } else { Toast.makeText(v.getContext(), this.mItemId + " ", Toast.LENGTH_SHORT).show(); } } } } 

Думая о сценарии, я бы подумал, что переход к меньшему списку возможен, но он не чувствует себя совершенно правильно.

Хорошо, так что это не было особенно сложно в конце концов – я думаю, что моя главная проблема была в том, что я думал о сценарии …

Поэтому первое, что я делаю, это получить соответствующие данные (в данном случае через JSON) и сохранить их в массиве JSON для манипуляции позже – в настоящее время я все еще получаю полный набор (Ie 5000), но это легко заменяется.

Это делается через AsyncTask с неопределенным индикатором выполнения. Как только он будет завершен, я разбираю JSON до 20 элементов и загружаю его в адаптер.

После этого у меня есть Recyclerview.onScrollListener ….

 mRecyclerView.setOnScrollListener(new RecyclerView.OnScrollListener() { @Override public void onScrolled(RecyclerView recyclerView, int dx, int dy) { super.onScrolled(recyclerView, dx, dy); mOnScreenItems = mRecyclerView.getChildCount(); mTotalItemsInList = llm.getItemCount(); mFirstVisibleItem = llm.findFirstVisibleItemPosition(); if (mLoadingItems) { if (mTotalItemsInList > mPreviousTotal) { mLoadingItems = false; mPreviousTotal = mTotalItemsInList; } } if (!mLoadingItems && (mTotalItemsInList - mOnScreenItems) <= (mFirstVisibleItem + mVisibleThreshold)) { new AsyncLoadTask().execute(); mLoadingItems = true; } } @Override public void onScrollStateChanged(RecyclerView recyclerView, int newState) { super.onScrollStateChanged(recyclerView, newState); } }); 

Когда он приближается к концу или попадает в нижнюю часть, начинается новый AsynTask для загрузки дополнительных элементов в список. Затем onPostExecute() обновляет адаптер через свой mMyAdapter.notifyDataSetChanged(); Метод, обеспечивающий приятное плавное обновление. Много утилит, чтобы сделать, но основы есть.

Спасибо за руководство парней!