Android Recyclerview Loadmore在搜索后不工作

Android Recyclerview Loadmore在搜索后不工作,android,android-recyclerview,adapter,Android,Android Recyclerview,Adapter,过去几天,我遇到了这个问题。滚动到Loadmore和EditText搜索可以正常工作。但当我搜索数据并获得相应的结果列表时,如果我滚动RecyclerView,则Loadmore不起作用 main活动 public class MainActivity extends FragmentActivity { private RecyclerView mRecyclerView; private LinearLayoutManager mLayoutManager;

过去几天,我遇到了这个问题。滚动到Loadmore和EditText搜索可以正常工作。但当我搜索数据并获得相应的结果列表时,如果我滚动RecyclerView,则Loadmore不起作用

main活动

 public class MainActivity extends FragmentActivity {

    private RecyclerView mRecyclerView;

    private  LinearLayoutManager mLayoutManager;
    private  EditText editsearch;
    private RecyclerAdapter mAdapter;

    private int ival = 1;
    private int loadLimit = 10;

    ArrayList<Student> mDataSet = new ArrayList();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        ArrayList<Student> my_Dataset = getDataSet();
        mRecyclerView = (RecyclerView) findViewById(R.id.recyclerView);
        mRecyclerView.setHasFixedSize(true);

        mLayoutManager = new LinearLayoutManager(this);
        mRecyclerView.setLayoutManager(mLayoutManager);

        mAdapter = new RecyclerAdapter(my_Dataset);
        mRecyclerView.setAdapter(mAdapter);

        editsearch = (EditText) findViewById(R.id.et_search);

        // add the listener for EditText
        editsearch.addTextChangedListener(new TextWatcher() {

            @Override
            public void afterTextChanged(Editable arg0) {

            }

            @Override
            public void beforeTextChanged(CharSequence arg0, int arg1,
                                          int arg2, int arg3) {
                // TODO Auto-generated method stub
            }

            @Override
            public void onTextChanged(CharSequence arg0, int arg1, int arg2,
                                      int arg3) {
                String text = editsearch.getText().toString().toLowerCase(Locale.getDefault());
                mAdapter.filter(text);
            }
        });

        mRecyclerView.addOnScrollListener(new EndlessRecyclerOnScrollListener(
                mLayoutManager) {
            @Override
            public void onLoadMore(int current_page) {

                loadMoreData();

            }

        });

    }

    private ArrayList<Student> getDataSet()
    {

        for (int i = 1; i <=10; i++)
        {
            Student std=new Student();
            std.setName("Root" + i);
            mDataSet.add(std);
        }
        return mDataSet;
    }

    private void loadMoreData() {

       loadLimit = ival +5;

        for (int i = ival; i <= loadLimit; i++) {
            Student st = new Student("Student " + i,false);
            mDataSet.add(st);
            ival++;
        }

        mAdapter.notifyDataSetChanged();

    }
}
public类MainActivity扩展了FragmentActivity{
私人回收视图mRecyclerView;
私人直线酒店经理;
私人编辑文本编辑搜索;
私人回收设备制造商;
私人国际增值税=1;
私有整数负载限制=10;
ArrayList mDataSet=新的ArrayList();
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ArrayList my_Dataset=getDataSet();
mRecyclerView=(RecyclerView)findViewById(R.id.RecyclerView);
mRecyclerView.setHasFixedSize(true);
mLayoutManager=新的LinearLayoutManager(此);
mRecyclerView.setLayoutManager(mllayoutmanager);
mAdapter=新的回收器适配器(my_数据集);
mRecyclerView.setAdapter(mAdapter);
editsearch=(EditText)findViewById(R.id.et_search);
//添加EditText的侦听器
editsearch.addTextChangedListener(新的TextWatcher(){
@凌驾
public void PostTextChanged(可编辑arg0){
}
@凌驾
更改前的公共无效(字符序列arg0,int arg1,
整数arg2,整数arg3){
//TODO自动生成的方法存根
}
@凌驾
public void onTextChanged(字符序列arg0、int arg1、int arg2、,
int arg3){
String text=editsearch.getText().toString().toLowerCase(Locale.getDefault());
mAdapter.filter(文本);
}
});
mRecyclerView.addOnScrollListener(新的EndlessRecyclerOnScrollListener(
mLayoutManager){
@凌驾
public void onLoadMore(int当前页面){
loadMoreData();
}
});
}
私有ArrayList getDataSet()
{

对于(int i=1;i而言,问题在于您正在丢失要添加项目的引用。您当前的步骤是:

  • 在mainactivity中创建列表
    ArrayList mDataSet=new ArrayList();
  • 在mainactivty中创建适配器并传递my_数据集(my_数据集为mDataSet)
    mAdapter=new RecyclerAdapter(我的数据集);
  • Init adapter(在此处保存mDataSet的引用)
    mDataset=dataset;mCleanCopyDataset=mDataset;
  • Filter
    mDataset=new ArrayList();
    这里您失去了引用
  • 解决方案

    将适配器中的
    mDataset
    重命名为
    mfilteredataset
    ,并按如下方式更改构造函数:

    public RecyclerAdapter(ArrayList<Student> dataset) {
      mFilteredDataset = new ArrayList<>(); // init your filtered dataset just one time and clear it on filtering
      mFilteredDataset.addAll(dataset); // here you have your copy of the dataset
      mCleanCopyDataset = dataset; // this is your reference of the complete dataset
    }
    
    公共回收适配器(ArrayList数据集){
    mfilteredataset=new ArrayList();//只初始化一次筛选的数据集,并在筛选时清除它
    mfilteredataset.addAll(dataset);//这是数据集的副本
    mCleanCopyDataset=dataset;//这是对完整数据集的引用
    }
    
    在筛选函数中更改
    mDataset=new ArrayList();
    mfilteredataset.clear()


    不要忘记在
    loadMoreData()的末尾调用
    mAdapter.filter()
    因为您向适配器添加了更多数据,但新添加的数据未包含在筛选列表中。

    您的答案可能很完美。请发送代码给我。我是新手,请按照我的解决方案说明操作。它包括您必须添加/更改的所有代码。如果您不了解解决方案的某些内容,请随时询问。我是新手。可以吗d您发送演示示例。无论您是否是新手。我发布了您必须在类中插入的代码。我不会做您的家庭作业并发布完整的复制和粘贴代码。我希望您了解更改,而不仅仅是复制和粘贴…只需循序渐进地遵循我的解决方案。如果我的解决方案不适用于您,请发布错误/问题我会让你明白的。
    public RecyclerAdapter(ArrayList<Student> dataset) {
      mFilteredDataset = new ArrayList<>(); // init your filtered dataset just one time and clear it on filtering
      mFilteredDataset.addAll(dataset); // here you have your copy of the dataset
      mCleanCopyDataset = dataset; // this is your reference of the complete dataset
    }