【问题标题】:RecyclerView load more with ProgressBar errorRecyclerView 加载更多与 ProgressBar 错误
【发布时间】:2016-05-17 04:10:52
【问题描述】:

我正在尝试创建Recyclerview onLoadMore,底部带有ProgressBar。我试过this solution,但我的Activity 中的onLoadMore 方法从未被调用过。请帮帮我。

这是我的Adapter:

public class NewsAdapterTest extends RecyclerView.Adapter<RecyclerView.ViewHolder> {

    private ArrayList<NewsDataModel> 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 = 2;
    private int lastVisibleItem, totalItemCount;
    private boolean loading;
    private OnLoadMoreListener onLoadMoreListener;

    public NewsAdapterTest(ArrayList<NewsDataModel> data, Context context, RecyclerView recyclerView) {
        this.dataSet = data;
        this.context = context;


        if (recyclerView.getLayoutManager() instanceof LinearLayoutManager) {

            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);

                    totalItemCount = linearLayoutManager.getItemCount();
                    lastVisibleItem = linearLayoutManager.findLastVisibleItemPosition();
                    if (!loading && totalItemCount <= (lastVisibleItem + visibleThreshold)) {
                        // End has been reached
                        // Do something
                        Log.i("newsAdaptertest", "onScrolled: End reached");
                        if (onLoadMoreListener != null) {
                            onLoadMoreListener.onLoadMore();
                        }
                        loading = true;
                    }
                }
            });
        }

    }

    public class MyViewHolder extends RecyclerView.ViewHolder {
        ExpandableTextView postMessage;
        TextView postTitle;
        TextView postSubTitle;
        ImageView authorImage;

        public MyViewHolder(View itemView) {
            super(itemView);
            this.authorImage = (ImageView) itemView.findViewById(R.id.header_image);
            this.postTitle = (TextView) itemView.findViewById(R.id.header_title);
            this.postSubTitle = (TextView) itemView.findViewById(R.id.header_subtitle);
            this.postMessage = (ExpandableTextView) itemView.findViewById(R.id.post_text_expand);
        }
    }

    @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.recycler_news, parent, false);

            vh = new MyViewHolder(v);
        } else {
            View v = LayoutInflater.from(parent.getContext())
                    .inflate(R.layout.recycler_progress, parent, false);

            vh = new ProgressViewHolder(v);
        }
        return vh;
    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int listPosition) {
        if (holder instanceof MyViewHolder) {
            Binding Views...
        } 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);
        }
    }

}

还有我的活动:

private static NewsAdapterTest adapter;
    private LinearLayoutManager layoutManager;
    private static RecyclerView recyclerView;
    private ArrayList<NewsDataModel> data = new ArrayList<NewsDataModel>();

recyclerView = (RecyclerView) findViewById(R.id.recyclerview_news);
        layoutManager = new LinearLayoutManager(this);
        adapter = new NewsAdapterTest(data, NewsActivity.this, recyclerView);

        recyclerView.setHasFixedSize(false);
        recyclerView.setLayoutManager(layoutManager);
        recyclerView.setItemAnimator(new DefaultItemAnimator());

        adapter.setOnLoadMoreListener(new NewsAdapterTest.OnLoadMoreListener() {
            @Override
            public void onLoadMore() {
                Log.i(TAG, "onLoadMore called");
                //add progress item
                data.add(null);
                adapter.notifyItemInserted(data.size() - 1);

                Log.i(TAG, "Loading new data... (" + Integer.toString(loadNumber) + ") posts");
                loadPosts(startLoadPosition, loadNumber);
                startLoadPosition += loadNumber;

                //remove progress item
                data.remove(data.size() - 1);
                adapter.notifyItemRemoved(data.size());
                //add items one by one

                adapter.setLoaded();
                //or you can add all at once but do not forget to call mAdapter.notifyDataSetChanged();
            }
        });

【问题讨论】:

    标签: android adapter android-recyclerview onscrolllistener


    【解决方案1】:

    示例代码:

    主活动:

    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<Book> 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<Book> 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<Book> 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);
            }
        }
    }
    

    【讨论】:

    • 我每次加载 5 个项目。所以,当我的Activity 打开时,我只有 5 个项目,我可以向下滚动,但 RecyclerView 不会调用 onLoadMore。
    • 在 NewAdapterTest-> onScrolled 事件中将“if (!loading && totalItemCount
    • 如果上述条件(上一条消息)有效,我希望“totalItemCount
    • 仍未加载。我不知道为什么,但是onCreateViewHolder中的Adapter只得到1(MyViewHolder),所以我认为Activity中的适配器不会这样做data.add(null);
    • 现在我明白了。在 NewAdapterTest 中创建一个方法,public void setData(list data) { this.dataSet = data; }
    猜你喜欢
    • 1970-01-01
    • 2015-09-26
    • 2017-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多