如何使用TextView搜索在recyclerview中加载更多内容?

时间:2018-04-28 13:01:49

标签: android android-recyclerview

我使用来自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);
}

1 个答案:

答案 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它需要停止。