热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

我有一个Recyclerview和一个包含5000个项目的列表,但我只想一次加载100个项目

如何解决《我有一个Recyclerview和一个包含5000个项目的列表,但我只想一次加载100个项目》经验,为你挑选了1个好方法。

Recyclerview在我的测试应用程序中实现了一个.目前,我将大约5000项数据拉入模型,并使用此列表加载我的视图.一切都很棒,表现很好,但我并不特别想要加载所有5000件物品.我宁愿加载100个项目,一旦用户点击底部,加载下一个100,并基本上使它成为一个不断增长的列表.

我可以实现onScrollListener反对Recyclerview我到达结束时的检测,但我的问题(这听起来很简单)是,告诉Recyclerview加载只有100直到我说的最佳方法是什么?

我的适配器:

public class MyAdapter extends RecyclerView.Adapter {

    private List mFeedList;

    public MyAdapter(List feedList) {
        this.mFeedList = feedList;
    }

    public void setFeedList(List 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();
            }
        }
    }
}

考虑到这种情况,我认为传递一个较小的清单是可能的,但它感觉不完全正确.



1> Hamz4h_..:

好的,毕竟这并不是特别困难 - 我认为我的主要问题是过度思考这个场景......

所以我做的第一件事就是获取适当的数据(在这种情况下通过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();产生一个很好的平滑更新的方法.除了基础知识之外,还有很多清理工作要做.

谢谢你的方向!


推荐阅读
author-avatar
hy
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有