How to implement endless list with RecyclerView?

前端 未结 30 2663
无人及你
无人及你 2020-11-22 02:22

I would like to change ListView to RecyclerView. I want to use the onScroll of the OnScrollListener in RecyclerView to determine if a

30条回答
  •  不知归路
    2020-11-22 03:12

    Here my solution using AsyncListUtil, in the web says: Note that this class uses a single thread to load the data, so it suitable to load data from secondary storage such as disk, but not from network. but i am using odata to read the data and work fine. I miss in my example data entities and network methods. I include only the example adapter.

    public class AsyncPlatoAdapter extends RecyclerView.Adapter {
    
        private final AsyncPlatoListUtil mAsyncListUtil;
        private final MainActivity mActivity;
        private final RecyclerView mRecyclerView;
        private final String mFilter;
        private final String mOrderby;
        private final String mExpand;
    
        public AsyncPlatoAdapter(String filter, String orderby, String expand, RecyclerView recyclerView, MainActivity activity) {
            mFilter = filter;
            mOrderby = orderby;
            mExpand = expand;
            mRecyclerView = recyclerView;
            mActivity = activity;
            mAsyncListUtil = new AsyncPlatoListUtil();
    
        }
    
        @Override
        public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
            View itemView = LayoutInflater.from(parent.getContext()).
                    inflate(R.layout.plato_cardview, parent, false);
    
            // Create a ViewHolder to find and hold these view references, and
            // register OnClick with the view holder:
            return new PlatoViewHolderAsync(itemView, this);
        }
    
        @Override
        public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
            final Plato item = mAsyncListUtil.getItem(position);
            PlatoViewHolderAsync vh = (PlatoViewHolderAsync) holder;
            if (item != null) {
                Integer imagen_id = item.Imagen_Id.get();
                vh.getBinding().setVariable(BR.plato, item);
                vh.getBinding().executePendingBindings();
                vh.getImage().setVisibility(View.VISIBLE);
                vh.getProgress().setVisibility(View.GONE);
                String cacheName = null;
                String urlString = null;
                if (imagen_id != null) {
                    cacheName = String.format("imagenes/imagen/%d", imagen_id);
                    urlString = String.format("%s/menusapi/%s", MainActivity.ROOTPATH, cacheName);
                }
                ImageHelper.downloadBitmap(mActivity, vh.getImage(), vh.getProgress(), urlString, cacheName, position);
            } else {
                vh.getBinding().setVariable(BR.plato, item);
                vh.getBinding().executePendingBindings();
                //show progress while loading.
                vh.getImage().setVisibility(View.GONE);
                vh.getProgress().setVisibility(View.VISIBLE);
            }
        }
    
        @Override
        public int getItemCount() {
            return mAsyncListUtil.getItemCount();
        }
    
        public class AsyncPlatoListUtil extends AsyncListUtil {
            /**
             * Creates an AsyncListUtil.
             */
            public AsyncPlatoListUtil() {
                super(Plato.class, //my data class
                        10, //page size
                        new DataCallback() {
                            @Override
                            public int refreshData() {
                                //get count calling ../$count ... odata endpoint
                                return countPlatos(mFilter, mOrderby, mExpand, mActivity);
                            }
    
                            @Override
                            public void fillData(Plato[] data, int startPosition, int itemCount) {
                                //get items from odata endpoint using $skip and $top
                                Platos p = loadPlatos(mFilter, mOrderby, mExpand, startPosition, itemCount, mActivity);
                                for (int i = 0; i < Math.min(itemCount, p.value.size()); i++) {
                                    data[i] = p.value.get(i);
                                }
    
                            }
                        }, new ViewCallback() {
                            @Override
                            public void getItemRangeInto(int[] outRange) {
                                //i use LinearLayoutManager in the RecyclerView
                                LinearLayoutManager layoutManager = (LinearLayoutManager) mRecyclerView.getLayoutManager();
                                outRange[0] = layoutManager.findFirstVisibleItemPosition();
                                outRange[1] = layoutManager.findLastVisibleItemPosition();
                            }
    
                            @Override
                            public void onDataRefresh() {
                                mRecyclerView.getAdapter().notifyDataSetChanged();
                            }
    
                            @Override
                            public void onItemLoaded(int position) {
                                mRecyclerView.getAdapter().notifyItemChanged(position);
                            }
                        });
                mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
                    @Override
                    public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
                        onRangeChanged();
                    }
                });
            }
        }
    }
    

提交回复
热议问题