RecyclerView load more with ProgressBar error

前端 未结 1 1360
孤街浪徒
孤街浪徒 2021-01-24 08:55

I\'m trying to create Recyclerview onLoadMore with ProgressBar at the bottom. I\'ve tried this solution, but method onLoadMore in my Activity

1条回答
  •  小蘑菇
    小蘑菇 (楼主)
    2021-01-24 09:43

    Sample Code:

    MainActivity:

    package com.example.sabari.recyclerviewsample;
    
    import android.os.Bundle;
    import android.support.v7.app.AppCompatActivity;
    import android.support.v7.widget.DefaultItemAnimator;
    import android.support.v7.widget.LinearLayoutManager;
    import android.support.v7.widget.RecyclerView;
    import android.util.Log;
    
    import java.util.ArrayList;
    import java.util.List;
    
    public class MainActivity extends AppCompatActivity {
    
        private static RecyclerViewAdapter adapter;
        private LinearLayoutManager layoutManager;
        private static RecyclerView recyclerView;
        private List data = new ArrayList<>();
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            getNextItems();
            recyclerView = (RecyclerView) findViewById(R.id.recycler_view);
            layoutManager = new LinearLayoutManager(this);
            recyclerView.setHasFixedSize(false);
            recyclerView.setLayoutManager(layoutManager);
            adapter = new RecyclerViewAdapter(data, this, recyclerView);
            recyclerView.setAdapter(adapter);
            recyclerView.setItemAnimator(new DefaultItemAnimator());
    
            adapter.setOnLoadMoreListener(new RecyclerViewAdapter.OnLoadMoreListener() {
                @Override
                public void onLoadMore() {
                    Log.i("LoadMore", "onLoadMore called");
                    //add progress item
                    data.add(null);
                    adapter.notifyDataSetChanged();
    
                    Log.i("LoadMore", "Loading new data... (" + 5 + ") posts");
                    //remove progress item
                    data.remove(data.size() - 1);
    
                    getNextItems();
    
                    adapter.notifyDataSetChanged();
                    //add items one by one
    
                    adapter.setLoaded();
                }
            });
    
        }
    
        private void getNextItems() {
            int itemCount = data.size();
            for (int i = itemCount; i <= itemCount + 5; i++) {
                Book book = new Book();
                book.title = "Title " + i;
                book.author = "Author " + i;
                book.description = "Description " + i;
                book.imageId = R.drawable.empty_user;
                data.add(book);
            }
        }
    
    }
    

    RecyclerViewAdapter:

    package com.example.sabari.recyclerviewsample;
    
    import android.content.Context;
    import android.support.v4.content.ContextCompat;
    import android.support.v7.widget.LinearLayoutManager;
    import android.support.v7.widget.RecyclerView;
    import android.util.Log;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.ImageView;
    import android.widget.ProgressBar;
    import android.widget.TextView;
    
    import java.util.List;
    
    /**
     * Created by sabari on 2/8/2016.
     */
    public class RecyclerViewAdapter extends RecyclerView.Adapter {
        private List dataSet;
        private Context context;
    
        private final int VIEW_ITEM = 1;
        private final int VIEW_PROG = 0;
    
        // The minimum amount of items to have below your current scroll position before loading more.
        private int visibleThreshold = 1;
        private int lastVisibleItem, totalItemCount;
        private boolean loading;
        private OnLoadMoreListener onLoadMoreListener;
    
        public RecyclerViewAdapter(List data, Context context, RecyclerView recyclerView) {
            this.dataSet = data;
            this.context = context;
    
            final LinearLayoutManager linearLayoutManager = (LinearLayoutManager) recyclerView.getLayoutManager();
            recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
                @Override
                public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
                    super.onScrolled(recyclerView, dx, dy);
                    final LinearLayoutManager linearLayoutManager = (LinearLayoutManager) recyclerView.getLayoutManager();
                    totalItemCount = linearLayoutManager.getItemCount();
                    lastVisibleItem = linearLayoutManager.findLastVisibleItemPosition();
                    if (!loading && totalItemCount <= (lastVisibleItem + visibleThreshold)) {
                        loading = true;
                        // End has been reached
                        // Do something
                        Log.i("AdapterScrolled", "onScrolled: End reached");
                        if (onLoadMoreListener != null) {
                            onLoadMoreListener.onLoadMore();
                        }
    
                    }
                }
            });
    
        }
    
        public class MyViewHolder extends RecyclerView.ViewHolder {
            TextView description;
            TextView title;
            TextView author;
            ImageView profilePic;
    
            public MyViewHolder(View itemView) {
                super(itemView);
                this.profilePic = (ImageView) itemView.findViewById(R.id.user_profile_pic);
                this.title = (TextView) itemView.findViewById(R.id.title);
                this.author = (TextView) itemView.findViewById(R.id.author);
                this.description = (TextView) itemView.findViewById(R.id.description);
            }
        }
    
        @Override
        public int getItemCount() {
            return dataSet.size();
        }
    
        @Override
        public int getItemViewType(int position) {
            return dataSet.get(position) != null ? VIEW_ITEM : VIEW_PROG;
        }
    
        @Override
        public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
            RecyclerView.ViewHolder vh;
            if (viewType == VIEW_ITEM) {
                View v = LayoutInflater.from(parent.getContext())
                        .inflate(R.layout.book_layout, parent, false);
    
                vh = new MyViewHolder(v);
            } else {
                View v = LayoutInflater.from(parent.getContext())
                        .inflate(R.layout.progress_bar_layout, parent, false);
    
                vh = new ProgressViewHolder(v);
            }
            return vh;
        }
    
        @Override
        public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
            if (holder instanceof MyViewHolder) {
    //                Binding Views...
                Book book = dataSet.get(position);
                ((MyViewHolder) holder).profilePic.setImageDrawable(ContextCompat.getDrawable(context, book.imageId));
                ((MyViewHolder) holder).title.setText(book.title);
                ((MyViewHolder) holder).author.setText(book.author);
                ((MyViewHolder) holder).description.setText(book.description);
            } else {
                ((ProgressViewHolder) holder).progressBar.setIndeterminate(true);
            }
        }
    
        public void setLoaded() {
            loading = false;
        }
    
        public void setOnLoadMoreListener(OnLoadMoreListener onLoadMoreListener) {
            this.onLoadMoreListener = onLoadMoreListener;
        }
    
        public interface OnLoadMoreListener {
            void onLoadMore();
        }
    
        public static class ProgressViewHolder extends RecyclerView.ViewHolder {
            public ProgressBar progressBar;
    
            public ProgressViewHolder(View v) {
                super(v);
                progressBar = (ProgressBar) v.findViewById(R.id.progressBar);
            }
        }
    }
    

    0 讨论(0)
提交回复
热议问题