Android RecyclerView加载更多ProgressBar错误

Android RecyclerView加载更多ProgressBar错误,android,adapter,android-recyclerview,onscrolllistener,Android,Adapter,Android Recyclerview,Onscrolllistener,我正在尝试使用底部的ProgressBar创建RecyclerviewonLoadMore。我已经尝试过了,但是我的活动中的方法onLoadMore从未被调用。请帮帮我 这是我的适配器: public class NewsAdapterTest extends RecyclerView.Adapter<RecyclerView.ViewHolder> { private ArrayList<NewsDataModel> dataSet; private

我正在尝试使用底部的
ProgressBar
创建
Recyclerview
onLoadMore。我已经尝试过了,但是我的
活动中的方法onLoadMore从未被调用。请帮帮我

这是我的
适配器

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

}
公共类NewsAdapterTest扩展了RecyclerView.Adapter{ 私有ArrayList数据集; 私人语境; 私有最终int视图_项=1; 私有最终int视图_PROG=0; //在加载更多项目之前,在当前滚动位置下方的最小项目数。 私有int visibleThreshold=2; private int lastVisibleItem,totalItemCount; 私有布尔加载; 私有OnLoadMoreListener OnLoadMoreListener; 公共新闻适配器测试(ArrayList数据、上下文上下文、RecycleView RecycleView){ this.dataSet=数据; this.context=上下文; if(recyclerView.getLayoutManager()实例的LinearLayoutManager){ 最终LinearLayoutManager LinearLayoutManager=(LinearLayoutManager)recyclerView.getLayoutManager(); recyclerView.addOnScrollListener(新的recyclerView.OnScrollListener(){ @凌驾 已填空的公共空间(RecyclerView RecyclerView、int dx、int dy){ super.onScrolled(recyclerView、dx、dy); totalItemCount=linearLayoutManager.getItemCount(); lastVisibleItem=linearLayoutManager.findLastVisibleItemPosition(); 如果(!loading&&totalItemCount示例代码:

主要活动:

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

}
package com.example.sabari.recyclerviewsample;
导入android.os.Bundle;
导入android.support.v7.app.AppActivity;
导入android.support.v7.widget.DefaultItemAnimator;
导入android.support.v7.widget.LinearLayoutManager;
导入android.support.v7.widget.RecyclerView;
导入android.util.Log;
导入java.util.ArrayList;
导入java.util.List;
公共类MainActivity扩展了AppCompatActivity{
专用静态RecycleServiceAdapter适配器;
私人专线经理;布局经理;
私有静态RecyclerView RecyclerView;
私有列表数据=新的ArrayList();
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
getNextItems();
recyclerView=(recyclerView)findViewById(R.id.recycler\u视图);
layoutManager=新的LinearLayoutManager(此);
recyclerView.setHasFixedSize(false);
recyclerView.setLayoutManager(layoutManager);
适配器=新的RecycleServiceAdapter(数据、此、RecycleView);
recyclerView.setAdapter(适配器);
setItemAnimator(新的DefaultItemAnimator());
setOnLoadMoreListener(新的RecycleServiceAdapter.OnLoadMoreListener(){
@凌驾
public void onLoadMore(){
Log.i(“LoadMore”,“调用onLoadMore”);
//添加进度项目
data.add(空);
adapter.notifyDataSetChanged();
Log.i(“加载更多”、“加载新数据…”(“+5+”)帖子);
//删除进度项目
data.remove(data.size()-1);
getNextItems();
adapter.notifyDataSetChanged();
//逐个添加项目
adapter.setLoaded();
}
});
}
私有void getNextItems(){
int itemCount=data.size();

对于(int i=itemCount;我每次加载5个项目。因此,当我的
活动打开时,我只有5个项目,我可以向下滚动,但是
RecyclerView
不会调用
onLoadMore
。在NewAdapterTest->onScrolled事件替换中,“如果(!loading&&totalItemCount,如果上述条件(上一条消息)起作用,我希望”totalItemCount仍然没有加载。我不知道为什么,但是onCreateViewHolder中的适配器只得到1(MyViewHolder),所以我认为Activity中的适配器没有这样做
data.add(null);
现在我得到了它。在NewAdapterTest中创建一个方法,public void setData(list data){this.dataSet=data;}
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);
        }
    }
}