Android Recyclerview Loadmore在搜索后不工作
过去几天,我遇到了这个问题。滚动到Loadmore和EditText搜索可以正常工作。但当我搜索数据并获得相应的结果列表时,如果我滚动RecyclerView,则Loadmore不起作用 main活动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;
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;
FiltermDataset=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
}