当前位置: 首页 > 知识库问答 >
问题:

SearchView for RecyclView不工作

郎和志
2023-03-14

我已经在片段中为回收视图实现了搜索视图过滤器,如下所示,但是当我在searchview中输入查询时,没有任何反应。

我的片段类:DiscussionForum.java

public class DiscussionForum extends Fragment implements ForumAdapter.ForumAdapterListener {


private TextView socname;
private EditText messageinput;
private SearchView search;
// SearchView searchView;
private FloatingActionButton messagesend;
ProgressDialog progressDialog;
private static final String TAG = "Discussion Forum";
private RecyclerView recyclerView;
private List<ForumData> forumlist;
private ForumAdapter mAdapter;
private OnFragmentInteractionListener mListener;
private LinearLayout list;
private String sendurl, geturl;

public DiscussionForum() {
    // Required empty public constructor
}


public static DiscussionForum newInstance(String param1, String param2) {
    DiscussionForum fragment = new DiscussionForum();
    Bundle args = new Bundle();
    args.putString(ARG_PARAM1, param1);
    args.putString(ARG_PARAM2, param2);
    fragment.setArguments(args);
    return fragment;
}

@Override

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {      
    View view = inflater.inflate(R.layout.fragment_discussion_forum, container, false);
    onButtonPressed("Discussion Forum");      
    forumlist = new ArrayList<>();
    recyclerView = view.findViewById(R.id.listviewforum);
    list = view.findViewById(R.id.list);
    search = view.findViewById(R.id.search);
    int resId = R.anim.layout_animation_fall_down;
    LayoutAnimationController animation = AnimationUtils.loadLayoutAnimation(getContext(), resId);
    RecyclerView.LayoutManager mLayoutManager = new LinearLayoutManager(getContext());
    recyclerView.setLayoutManager(mLayoutManager);
    recyclerView.setLayoutAnimation(animation);
    mAdapter = new ForumAdapter(getContext(), forumlist, this);
    progressDialog = new ProgressDialog(getContext());
    progressDialog.setCancelable(false);        
    geturl = "";         
    fetchforumdata(getActivity().getIntent().getStringExtra("id"));
    search.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
        @Override
        public boolean onQueryTextSubmit(String query) {
            return false;
        }

        @Override
        public boolean onQueryTextChange(String newText) {
            mAdapter.getFilter().filter(newText);
            return true;
        }
    });

    return view;
}



private void fetchforumdata(final String id1) {
    progressDialog.setMessage("Loading...");
    showDialog();
    StringRequest request = new StringRequest(Request.Method.GET,
            geturl + id1,
            new Response.Listener<String>() {
                @Override
                public void onResponse(String response) {
                    // Log.d("tag2","id"+id1);
                    Log.d(TAG, "Response Prop: " + response.toString());
                    hideDialog();
                    try {
                        JSONObject jObj = new JSONObject(response);
                        boolean error = jObj.getBoolean("errors");
                        if (!error) {
                            JSONObject dataobj = jObj.getJSONObject("data");
                            JSONArray ticketarray = dataobj.getJSONArray("result");
                            if (ticketarray.length() == 0) {
                                list.setVisibility(View.VISIBLE);
                            } else {
                                recyclerView.setVisibility(View.VISIBLE);
                                List<ForumData> items = new Gson().fromJson(ticketarray.toString(), new TypeToken<List<ForumData>>() {
                                }.getType());

                                forumlist.clear();
                                forumlist.addAll(items);
                                recyclerView.setAdapter(mAdapter);
                            }
                        } else {
                            // String errorMsg = jObj.getString("error_msg");
                            Toast.makeText(getContext(),
                                    "Try again or report an issue", Toast.LENGTH_LONG).show();
                        }
                    } catch (JSONException e) {
                        e.printStackTrace();
                    }

                }
            }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            // error in getting json
            Log.e(TAG, "Error: " + error.getMessage());
            Toast.makeText(getContext(), "Error: " + error.getMessage(), Toast.LENGTH_SHORT).show();
            hideDialog();
        }
    });

    MyApplication.getInstance().addToRequestQueue(request);
}


// TODO: Rename method, update argument and hook method into UI event
public void onButtonPressed(String title) {
    if (mListener != null) {
        mListener.onFragmentInteraction(title);
    }
}

@Override
public void onAttach(Context context) {
    super.onAttach(context);
    if (context instanceof OnFragmentInteractionListener) {
        mListener = (OnFragmentInteractionListener) context;
    } else {
        throw new RuntimeException(context.toString()
                + " must implement OnFragmentInteractionListener");
    }
}

@Override
public void onDetach() {
    super.onDetach();
    mListener = null;
}

private void showDialog() {
    if (!progressDialog.isShowing())
        progressDialog.show();
}

private void hideDialog() {
    if (progressDialog.isShowing())
        progressDialog.dismiss();
}

@Override
public void onDocumentSelected(String id) {

}

public interface OnFragmentInteractionListener {
    // TODO: Update argument type and name
    void onFragmentInteraction(String title);
}}

我的适配器类:ForumAdapter < br >

public class ForumAdapter extends RecyclerView.Adapter<ForumAdapter.MyViewHolder> implements Filterable {
private Context context;
private List<ForumData> ticketlist;
private List<ForumData> filterlist;
private ForumAdapterListener listener;




public class MyViewHolder extends RecyclerView.ViewHolder {
    TextView username,createdat,forummessage,flatno,category,likes,subcount;
    ImageView edit;

    public MyViewHolder(View view) {
        super(view);
        username=view.findViewById(R.id.user_name2);
        createdat=view.findViewById(R.id.date2);
        edit = view.findViewById(R.id.profile_icon2);
        forummessage=view.findViewById(R.id.forum_message);
        flatno=view.findViewById(R.id.flat_no);
        category=view.findViewById(R.id.category);
        likes=view.findViewById(R.id.likes_data);
        subcount=view.findViewById(R.id.count_data);

    }
}
public ForumAdapter(Context context, List<ForumData> ticketlist, ForumAdapterListener listener) {
    this.context = context;
    this.listener = listener;
    this.ticketlist = ticketlist;
    this.filterlist=ticketlist;
}

@Override
public ForumAdapter.MyViewHolder onCreateViewHolder( ViewGroup parent, int viewType) {
    View itemView = LayoutInflater.from(parent.getContext())
            .inflate(R.layout.discussion_forum_item, parent, false);

    return new MyViewHolder(itemView);
}

@Override
public void onBindViewHolder( ForumAdapter.MyViewHolder holder, int position) {
    final ForumData contact = ticketlist.get(position);
    holder.username.setText(contact.getUsername());
    holder.flatno.setText(contact.getFlattitle());
    holder.forummessage.setText(contact.getMessage());
    holder.createdat.setText(contact.getCreated_at());
    holder.category.setText(contact.getCategory());      
    holder.likes.setText(contact.getLikes());       
    holder.subcount.setText(contact.getSubcount());
    Glide.with(context)
            .load(url+".jpg")
            .apply(new RequestOptions().circleCrop().placeholder(R.drawable.man).error(R.drawable.man))
            .into(holder.edit);

        }
    });

}

@Override
public int getItemCount() {
    return ticketlist.size();
}


@Override
public Filter getFilter() {
    return new Filter() {
        @Override
        protected FilterResults performFiltering(CharSequence charSequence) {
            String charString = charSequence.toString();
            if (charString.isEmpty()) {
                filterlist = ticketlist;
            } else {
                List<ForumData> filteredList = new ArrayList<>();
                for (ForumData row : ticketlist) {

                    // name match condition. this might differ depending on your requirement
                    // here we are looking for name or phone number match
                    if (row.getUsername().toLowerCase().contains(charString.toLowerCase()) || row.getCategory().contains(charSequence)) {
                        filteredList.add(row);
                    }
                }

                filterlist = filteredList;
            }

            FilterResults filterResults = new FilterResults();
            filterResults.values = filterlist;
            return filterResults;
        }

        @Override
        protected void publishResults(CharSequence constraint, FilterResults results) {
            filterlist = (ArrayList<ForumData>) results.values;
            notifyDataSetChanged();

        }
    }
     ;
}
public interface ForumAdapterListener {
    void onDocumentSelected(String contact);
}}

我已经经历了许多解决方案,例如这里,这里,这里
但是我无法弄清楚我的代码出了什么问题。请帮我找出确切的问题所在。

共有2个答案

华聪
2023-03-14

另一种方法是在onQueryTextChange中过滤数据并刷新回收器视图的适配器:

searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
    @Override
    public boolean onQueryTextSubmit(String query) {


    }

    @Override
    public boolean onQueryTextChange(String newText) {
         ArrayList< ForumData > filteredData = new ArrayList<>();

        for (ForumData forumData : data) {
            if (forumData..getUsername().toLowerCase().contains(newText.toLowerCase())) {

                filteredData.add(forumData);

            }

        }

        adapter = new ForumAdapter(data, getContext() , this);
        recyclerView.setAdapter(adapter);
        return true ;

    }
})
南门欣怡
2023-03-14

您的适配器实现存在多个问题。如果我对您的代码理解正确的话,您希望保留对未过滤项目列表的引用

首先,您希望在屏幕上显示过滤器列表,因此在onBindViewHolder()getItemCount()中,您需要使用过滤器列表而不是票证列表

其次,您要确保ticketlist保持不变,以便所有未来的搜索都在相同的内容上。为此,您必须将所有filterlist=ticketlist;替换为filterlist=new ArrayList

这至少应该使您的代码能够正常工作。我建议你观看这个关于Java和对象以及引用的视频。

 类似资料:
  • 我想在菜单栏文本被选中时更改它的颜色。 这里可能出了什么问题? 我尝试使用伪类':active',但没有得到应用。其中as':Hover'正在工作。 我还尝试使用'Router LinkActive',它应该添加类'Active-Link',但这也不起作用。 我在下面给出了HTML、SCCS和TS代码:

  • 我编写了一组简单的类,向一位朋友演示如何为AOP(而不是xml配置)使用注释。我们无法使@ComponentScan工作,并且AnnotationConfigApplicationContext getBean的行为也不正常。我想明白两件事。请参阅下面的代码: PersonOperationSI.java PersonOperations.java PersonOperationsConfigCl

  • 我正在Eclipse Neon中使用Hibernate工具(JBoss tools 4.4.0.Final)。现在,我想将数据库表反向工程为POJO对象和Hibernate映射文件。 我遵循了一些关于如何设置Eclipse来生成POJO对象的教程。在我运行配置之前,一切看起来都很好。什么都没发生,也没有抛出错误。有人能帮我吗?数据库是一个微软SQL服务器2014。 我的逆向工程配置文件看起来像:

  • 我正在尝试使用codeigniter insert\u batch将多行插入到我的数据库表中。根据错误报告,似乎没有设置表列。只是阵列的数量: 我的看法是: 我的控制器: 和型号:

  • 我尝试使用StreamWriter.WriteLine(不是静态地)将几行代码一次写到。txt文件中。 每个播放器对象都是字符串cosnatants。如果我使用不同的文件名(也称为BasicTestInfo2.txt),它会在bin.debug中创建该文件,但它是空的。我知道我到达了using块的内部(我在里面放了一个console.writeline),我知道我想要截断,这就是为什么我对appe

  • 我正在尝试使用yii2邮件组件发送电子邮件。 配置web。php 还有我的代码。 我收到了这个错误。 Swift\u TransportException预期响应代码为250,但收到代码“535”,消息“535-5.7.8用户名和密码不被接受。有关详细信息,请访问535 5.7.8https://support.google.com/mail/?p=BadCredentialsa13-v6sm41

  • 问题内容: 似乎不起作用,但确实起作用。有什么想法吗? 问题答案: 您不能在Java中将基本类型用作通用参数。改为使用: 使用自动装箱/拆箱,代码几乎没有区别。自动装箱意味着您可以编写: 代替: 自动装箱意味着将第一个版本隐式转换为第二个版本。自动拆箱意味着您可以编写: 代替: 如果未找到键,则隐式调用意味着将生成一个,例如: 原因是类型擦除。例如,与C#不同,泛型类型不会在运行时保留。它们只是显