【问题标题】:How to implement onTextChangedListenerItem to search an item in RecyclerView如何实现 onTextChangedListenerItem 在 RecyclerView 中搜索项目
【发布时间】:2018-01-03 12:18:58
【问题描述】:

我正在使用 在片段上显示项目。我使用 在我的应用程序中实现搜索功能。当我要在 中输入文本时, 视图中的所有项目都会消失,我无法获得过滤结果。这是 my 的代码

private void addTextListener() {
        search.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {

            }

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {
                 s=s.toString().toLowerCase();
                 final ArrayList<CurrentEntry> filter=new ArrayList<>();
                 for(int i=0;i<filter.size();i++)
                 {
                     final  String text=current.get(i).toString().toLowerCase();
                     if(text.contains(s))
                     {
                         filter.add(current.get(i));
                     }

                 }
                 recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
                 adapt=new NewAdapter(filter,getActivity());
                 recyclerView.setAdapter(adapt);
                 adapt.notifyDataSetChanged();
            }

            @Override
            public void afterTextChanged(Editable s) {
                //filter(s.toString());
            }
        });
    }  

这是我的 使用

private void getData() {
        String json_req = "json_req";
        String url =getContext().getString(R.string.CURRENT_STATUS);


        JsonObjectRequest req = new JsonObjectRequest(Request.Method.GET, url, null,
                new Response.Listener<JSONObject>() {
                    @Override
                    public void onResponse(JSONObject response) {
                       try
                       {

                           JSONObject object=new JSONObject(response.toString());
                           JSONArray data=object.getJSONArray("results");
                           for(int i=0;i<data.length();i++)
                           {
                               JSONObject json = data.getJSONObject(i);
                             final   CurrentEntry c=new CurrentEntry();
                               userUrl=json.getString("name");
                               JsonObjectRequest request=new JsonObjectRequest(Request.Method.GET, userUrl, null, new Response.Listener<JSONObject>() {
                                   @Override
                                   public void onResponse(JSONObject response) {
                                       try {
                                           String foodie_name=response.getString("username");
                                           c.setName(name);
                                       } catch (JSONException e) {
                                           e.printStackTrace();
                                       }
                                       adapt.notifyDataSetChanged();
                                   }
                               }, new Response.ErrorListener() {
                                   @Override
                                   public void onErrorResponse(VolleyError error) {

                                   }
                               }
                               )

                               {
                                   @Override
                                   public Map<String, String> getHeaders() throws AuthFailureError {
                                       Map<String, String> headers = new HashMap<>();
                                       String credentials = ""+":"+"";
                                       String auth = "Basic " + Base64.encodeToString(credentials.getBytes(), Base64.NO_WRAP);
                                       headers.put("Content-type", "application/json");
                                       headers.put("Authorization", auth);
                                       return headers;
                                   }
                               };
                               AppController.getInstance().addToRequestQueue(request,second_req);
                               c.setPeople(json.getString("my_people"));
                               String temp=json.getString("my_timetime");
                               temp=temp.substring(11);
                               temp=temp.substring(0,temp.length()-4);
                               c.setEstimate(temp);
                               current.add(c);

                            }

                           recyclerView.setAdapter(adapt);
                           adapt.notifyDataSetChanged();
                       }
                       catch (JSONException e)
                       {

                       }

                    }
                },
                new Response.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError error) {

                    }

                })
        {
            @Override
            public Map<String, String> getHeaders() throws AuthFailureError {
                Map<String, String> headers = new HashMap<>();
                String credentials = ""+":"+"";
                String auth = "Basic " + Base64.encodeToString(credentials.getBytes(), Base64.NO_WRAP);
                headers.put("Content-type", "application/json");
                headers.put("Authorization", auth);
                return headers;
            }
        };

        AppController.getInstance().addToRequestQueue(req, json_req);
    }

如何解决这个问题以在 中获得过滤结果。

【问题讨论】:

    标签: recyclerview addtextchangedlistener edittext recycler addtextchangedlistener jsonrequest volley recyclerview android json android-recyclerview android-edittext android-volley


    【解决方案1】:

    删除此代码

    adapt=new NewAdapter(filter,getActivity());
    recyclerView.setAdapter(adapt);
    adapt.notifyDataSetChanged();
    

    每次更改文本时都不需要创建 NewAdapter。相反,请尝试更改适配器列表的值并调用 notifyDataSetChanged(),如下所示。

    adapt.filter=filter;
    adapt.notifyDataSetChanged();
    

    并在你的 onCreate() 中添加这些行

    recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
    adapt=new NewAdapter(filter,getActivity());
    recyclerView.setAdapter(adapt);
    

    【讨论】:

      【解决方案2】:

      在您的代码中,您一次又一次地调用以下代码;

      recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
      adapt=new NewAdapter(data,getActivity());
      recyclerView.setAdapter(adapt);
      adapt.notifyDataSetChanged();
      

      只需在 Fragment 的 onCreateView 中编写一次此代码:

      recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
      adapt=new NewAdapter(data,getActivity());
      recyclerView.setAdapter(adapt);
      

      现在,在您的适配器类中,您需要有一个数据设置器,可用于根据您的视图中的搜索过滤器设置您从 API 获得的更新数据。并发布您只需要调用 adapt.notifyDataSetChanged():

      adapt.setNewData(data);
      adapt.notifyDataSetChanged();
      

      【讨论】:

      • 我更改了代码,但仍然没有得到过滤结果。现在解决了在edittext中输入内容时所有记录消失的问题
      • @SatyamGondhale 请尝试将日志添加到 search.addTextChangedListener 方法。这可能是因为 API 调用的响应时间。你可以做些什么来解决它,你可以在你的片段中维护一个布尔值,它将保持当前是否正在进行任何 API 调用的状态。因此,每当您发出请求时,在发起请求之前将其设置为 true,并将其设置为 false 发布结果(成功或失败两者),并且不要忘记在发出新的搜索请求之前检查布尔值。
      猜你喜欢
      • 2020-02-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-08
      • 1970-01-01
      • 2020-04-01
      • 1970-01-01
      相关资源
      最近更新 更多