【问题标题】:Implementing search in a fragment recycler view android not working在片段回收器视图中实现搜索android不起作用
【发布时间】:2021-12-31 02:38:36
【问题描述】:

我正在尝试在我的片段中实现搜索,但它不起作用。搜索文本未显示任何结果。此外,当搜索文本被删除并且不再从底部导航栏中单击菜单项时加载项目时,所有项目都将从视图中消失。我对 android 开发非常陌生,并且在 searchview 中苦苦挣扎 请提出解决方案。 TIA 这是我的代码

片段.java

public class Cust_Home extends Fragment{

    RecyclerView recview_cust;
    DatabaseReference data;
    Adap cust_adapter;
    ArrayList<model> cust_menu;


    private static final String ARG_PARAM1 = "param1";
    private static final String ARG_PARAM2 = "param2";


    private String mParam1;
    private String mParam2;

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


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

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if (getArguments() != null) {
            mParam1 = getArguments().getString(ARG_PARAM1);
            mParam2 = getArguments().getString(ARG_PARAM2);
        }
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        View v= inflater.inflate(R.layout.fragment_cust__home, container, false);
        setHasOptionsMenu(true);
        recview_cust = v.findViewById(R.id.Cust_menu);
        data = FirebaseDatabase.getInstance().getReference("FoodMenu");
        recview_cust.setHasFixedSize(true);
        recview_cust.setLayoutManager(new LinearLayoutManager(getContext()));
        cust_menu = new ArrayList<>();
        cust_adapter = new Adap(getContext(),cust_menu);
        recview_cust.setAdapter(cust_adapter);

        data.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot snapshot) {

                for(DataSnapshot dataSnapshot : snapshot.getChildren()){



                    model md = dataSnapshot.getValue(model.class);
                    cust_menu.add(md);
                }
                cust_adapter.notifyDataSetChanged();

            }

            @Override
            public void onCancelled(@NonNull DatabaseError error) {

            }
        });
        return v;

    }

    


    @Override
    public void onCreateOptionsMenu(@NonNull Menu menu, @NonNull MenuInflater inflater) {
           inflater.inflate(R.menu.search_menu,menu);
           MenuItem item = menu.findItem(R.id.action_search);
           //SearchView searchView = (SearchView) item.getActionView();
           SearchView searchView = (SearchView) item.getActionView();
           searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
               @Override
               public boolean onQueryTextSubmit(String query) {
                   return false;
               }

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


        super.onCreateOptionsMenu(menu, inflater);

    }


}

适配器类

public class Adap extends RecyclerView.Adapter<Adap.myViewholder> implements Filterable {

    Context context;
    List<model> list;
    List<model> listfull;

    public Adap(Context context, List<model> list) {
        this.context = context;
        this.list = list;
        this.listfull= new ArrayList<>(list);

    }

    @NonNull
    @Override
    public myViewholder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View v = LayoutInflater.from(context).inflate(R.layout.singleitem,parent,false);
        return new myViewholder(v);
    }

    @Override
    public void onBindViewHolder(@NonNull myViewholder holder, int position) {

        model m = list.get(position);
        holder.fooditem.setText(m.getFoodItem());
        holder.price.setText("$"+m.getFoodPrice());
        holder.chefName.setText(m.getChefName());
        holder.cheflocation.setText(m.getChefAddress());


        //holder.ing.setText(m.getFoodIngredients());
        Glide.with(holder.img.getContext()).load(m.getImage()).into(holder.img);
     
        holder.img.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                AppCompatActivity activity = (AppCompatActivity)v.getContext();
                activity.getSupportFragmentManager().beginTransaction().replace(R.id.fragmentContainer,new Food_Details(m.getFoodItem(),m.getFoodDesc(),m.getFoodIngredients(),m.getImage(),m.getFoodPrice(),m.getFoodCal(),m.getChefName(),m.getItemID(),m.getUserid(),m.getChefPhoneNumber())).addToBackStack(null).commit();
            }
        });

    }

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

    @Override
    public Filter getFilter() {
        return filterdata;
    }

    private Filter filterdata =new Filter() {
        @Override
        protected FilterResults performFiltering(CharSequence constraint) {
            String searchText = constraint.toString().toLowerCase();
            List<model>templist = new ArrayList<>();
            if(searchText.length()==0 || searchText.isEmpty()){

                templist.addAll(listfull);
            }
            else {

                for ( model item:listfull){
                    if(item.getFoodItem().toLowerCase().contains(searchText)){

                        templist.add(item);
                    }

                }
            }
            FilterResults filterresults = new FilterResults();
            filterresults.values = templist;

            return filterresults;
        }

        @Override
        protected void publishResults(CharSequence constraint, FilterResults filterresults) {
            list.clear();
            list.addAll((Collection<? extends model>) filterresults.values);
            notifyDataSetChanged();

        }
    };


    public static class myViewholder extends RecyclerView.ViewHolder{

        TextView fooditem, price,chefName,cheflocation;
        ImageView img;
        //ImageButton delete;


        public myViewholder(@NonNull View itemView) {
            super(itemView);


            fooditem = itemView.findViewById(R.id.foodname);
            price = itemView.findViewById(R.id.foodprice);
            chefName = itemView.findViewById(R.id.foodchef);
            //desc = itemView.findViewById(R.id.foodesc);
            img = itemView.findViewById(R.id.foodimageurl);
            cheflocation = itemView.findViewById(R.id.foodlocation);

           


        }
    }

}

菜单xml

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">

    <item android:id="@+id/action_search"
        android:title="Search"
        android:icon="@drawable/ic_baseline_search_24"
        app:showAsAction="always|collapseActionView"
        app:actionViewClass="android.widget.SearchView" />
</menu>

我还在我的activity.class中添加了以下代码

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    return true;
}

【问题讨论】:

  • performFiltering 中,当您发送通常会返回至少 1 项的搜索时,tempList 最终会得到什么吗?
  • 我试过调试,临时列表大小为零。我的 ArrayList listall 大小也为零。这意味着它没有从 Arraylist 列表中初始化。我该如何解决这个问题。
  • 这段代码中到底有什么不符合您的预期?告诉我们共享代码有什么问题。你有什么错误吗?
  • 它现在可以工作了。谢谢。

标签: android firebase android-fragments android-recyclerview searchview


【解决方案1】:

您的 listfull 为空,因为您使用空列表对其进行了初始化。

一个简单的解决方法是在Adapter 中设置函数。

//in Adap
public void setFullList(List<String> list){
   this.listfull = list;
}

@Override
public void onDataChange(@NonNull DataSnapshot snapshot) {

      for(DataSnapshot dataSnapshot : snapshot.getChildren()){
          model md = dataSnapshot.getValue(model.class);
          cust_menu.add(md);
      }
      cust_adapter.setFullList(new ArrayList<>(cust_menu));
      cust_adapter.notifyDataSetChanged();
}

【讨论】:

  • 感谢您的解决方案。这修复了我的搜索功能,但我遇到了另一个问题,即在加载应用程序后,如果我再次从底部导航栏中单击主页片段,它会关闭应用程序。你能推荐一些东西吗
  • 完整列表中有多少项?
  • 页面加载与列表大小相同。但是再次单击主页片段时,它的大小相同,但数据为空。
  • data.addValueEventListener(new ValueEventListener() { @Override public void onDataChange(@NonNull DataSnapshot snapshot) { for(DataSnapshot dataSnapshot : snapshot.getChildren()){ model md = dataSnapshot.getValue(model.class); cust_menu.add(md); } cust_adapter.setFullList(new ArrayList&lt;&gt;(cust_menu)); cust_adapter.notifyDataSetChanged(); }我把这个保存在我的fragment.java中
  • 我的意思是像计数一样的实际大小。
猜你喜欢
  • 1970-01-01
  • 2017-05-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多