我在我的测试应用程序中实现了Recyclerview.目前,我将大约5000项数据拉入模型,并使用此列表加载我的视图.一切都很棒,表现很好,但我并不特别想要加载所有5000件物品.我宁愿加载100个项目,一旦用户点击底部,加载下一个100,并基本上使它成为一个不断增长的列表.
我可以针对Recyclerview实现onScrollListener来检测我何时到达结束但我的问题(这听起来很简单)是什么,告诉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数组中以便稍后进行操作 – 目前我仍然可以获得全套数据(即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()更新适配器;方法导致更好的平滑更新.除了基础知识之外,还有很多清理工作要做.
谢谢你的方向!