我使用来自API的数据创建了recyclerview
,该数据使用TextView
来过滤列表并搜索我的项目。一切都很完美。我的问题是我的Recyclerview
太大了,所以我将它设置为仅运行前10项,然后在TextChange
上加载更多。我基本上复制了我的方法,将其命名为loadmoredata()
,并且它刚刚设置为array.length
时运行完全相同的代码。它起作用但我的问题是在每个文本或退格键上我假设的方法继续运行,并且项目不断添加添加,所以我开始两个,然后是三个,然后是相同项目的四个。
我该如何解决这个问题?还有一种更简单的方法来保持我的一种方法,并且在文本更改时该方法是否会扩展?我尝试在我的adapter
更改getcount()
后返回50,但是一旦我使用searchtext
我的应用崩溃,我不知道如何更改getcount()
文本更改时为50到listitems.length()
。我的代码发布在下面:
Recyclerview代码
recyclerView.setHasFixedSize(true);
recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
loadRecyclerViewData();
SearchText.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
@Override
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
@Override
public void afterTextChanged(Editable editable) {
filter(editable.toString());
loadmoredata();
}
});
return v;
}
private void filter(String text) {
List<ListItem> filteredList = new ArrayList<>();
for (ListItem item : listItems) {
if (item.getHead().toLowerCase().contains(text.toLowerCase()) || item.getDesc().toLowerCase().contains(text.toLowerCase())) {
filteredList.add(item);
}
}
adapter = new MyAdapter(filteredList, getContext());
recyclerView.setAdapter(adapter);
}
private void loadRecyclerViewData() {
final ProgressDialog progressDialog = new ProgressDialog(getContext());
progressDialog.setMessage("Loading Data...");
progressDialog.show();
StringRequest stringRequest = new StringRequest(Request.Method.GET,
URL_DATA,
new Response.Listener<String>() {
@Override
public void onResponse(String response) {
progressDialog.dismiss();
try {
JSONArray array = new JSONArray(response);
for(int i=0; i<10; i++){
JSONObject o = array.getJSONObject(i);
ListItem item = new ListItem(
o.getString("name"),
);
listItems.add(item);
}
adapter = new MyAdapter(listItems, getContext());
recyclerView.setAdapter(adapter);
} catch (JSONException e) {
e.printStackTrace();
}
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
progressDialog.dismiss();
Toast.makeText(getContext(),error.getMessage(),Toast.LENGTH_LONG).show();
}
});
RequestQueue requestQueue = Volley.newRequestQueue(getContext());
requestQueue.add(stringRequest);
}
答案 0 :(得分:0)
假设loadmoredata()
与loadRecyclerViewData()
相同,您始终会在列表中放置相同的10
首字母,因为这行代码为for(int i=0; i<10; i++)
。
loadmoredata()
需要从最后一次停止的地方开始,从第一次需要从10
开始到20
,然后从20
开始到30
继续,代码应该是这样的
int last = 0;
private void loadmoredata() {
final ProgressDialog progressDialog = new ProgressDialog(getContext());
progressDialog.setMessage("Loading Data...");
progressDialog.show();
StringRequest stringRequest = new StringRequest(Request.Method.GET,
URL_DATA,
new Response.Listener<String>() {
@Override
public void onResponse(String response) {
progressDialog.dismiss();
try {
JSONArray array = new JSONArray(response);
for(int i=last; i<last + 10; i++){
JSONObject o = array.getJSONObject(i);
ListItem item = new ListItem(
o.getString("name"),
);
listItems.add(item);
}
adapter.notifyDataSetChanged();
last += 10;
} catch (JSONException e) {
e.printStackTrace();
}
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
progressDialog.dismiss();
Toast.makeText(getContext(),error.getMessage(),Toast.LENGTH_LONG).show();
}
});
RequestQueue requestQueue = Volley.newRequestQueue(getContext());
requestQueue.add(stringRequest);
}
现在你可以每次都致电loadmoredata()
,只会在分页结束时小心,如果last + 10
大于array.lenght
它需要停止。