【问题标题】:All itmes disappear when try use searchview in recyclerview?尝试在 recyclerview 中使用 searchview 时,所有项目都会消失?
【发布时间】:2021-02-17 21:11:52
【问题描述】:

每个人 我有 recyclerView 从 firebase 数据库中检索数据

我使用 searchview 和 filter list 来搜索项目,但是当点击 searchview 搜索某些东西时,所有项目都会消失并且搜索视图不起作用

我的主要活动是片段,因为我使用底部导航

public class RV_Worker_Fragment extends Fragment implements RecyclerView_InterFace {

private RecyclerView rv_worker;
private FirebaseDatabase db;
private ArrayList <WorkerModel> list;
private WorkerAdapter workerAdapter;
SearchView searchView;


@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.rv_persons_fragment,
            container, false);

    rv_worker =view.findViewById(R.id.recyclerView_persons);
    db =FirebaseDatabase.getInstance();
    rv_worker.setHasFixedSize(true);
    rv_worker.setLayoutManager(new LinearLayoutManager(getActivity()));

    searchView = view.findViewById(R.id.searchView);
    searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
        @Override
        public boolean onQueryTextSubmit(String query) {
            return false;
        }

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

    getList();

    return view;
}

private void  getList()
{
    db.getReference("Employees").addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot snapshot) {

            list=new ArrayList <>();
            workerAdapter = new WorkerAdapter(getActivity(),list,RV_Worker_Fragment.this);
            rv_worker.setAdapter(workerAdapter);
            for (DataSnapshot child :snapshot.getChildren())
            {
                WorkerModel workerModel =child.getValue(WorkerModel.class);
                list.add(workerModel);
                workerAdapter.notifyItemInserted(list.size()-1);
                workerAdapter.getItemCount();
            }
        }

        @Override
        public void onCancelled(@NonNull DatabaseError error) {
            Toast.makeText(getActivity(), error.getMessage(), Toast.LENGTH_SHORT).show();
        }
    });
}

@Override
public void onItemClick(final int position) {

    Intent intent = new Intent(getActivity(), Worker_Details.class);
    intent.putExtra("name",list.get(position).getName());
    intent.putExtra("id",list.get(position).getId());
    startActivity(intent);

}
}

适配器

public class WorkerAdapter extends RecyclerView.Adapter <WorkerAdapter.ViewHolder> implements Filterable {
private Context context;
private List <WorkerModel> list;
private List <WorkerModel> listFilter;
private RecyclerView_InterFace recyclerView_interFace;

public WorkerAdapter(Context context, List <WorkerModel> llist, RecyclerView_InterFace recyclerView_interFace) {
    this.context = context;
    this.list = llist;
    this.recyclerView_interFace = recyclerView_interFace;
    listFilter = new ArrayList <>(list);
}

@NonNull
@Override
public WorkerAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    return new ViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.card_worker_treader_contractor, parent, false));
}

@Override
public void onBindViewHolder(@NonNull final WorkerAdapter.ViewHolder holder, final int position) {

    final WorkerModel workerModel = list.get(position);
    holder.tv_name.setText(workerModel.getName());
    holder.btn_call.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {

            String phonNumber = workerModel.getPhone();
            Intent intent = new Intent(Intent.ACTION_DIAL);
            intent.setData(Uri.parse("tel:"+phonNumber));
            context.startActivity(intent);
        }
    });

    holder.btn_delete.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            new AlertDialog.Builder(context)
                    .setTitle("حذف")
                    .setMessage("هل تريد الحذف")
                    .setPositiveButton("نعم", new DialogInterface.OnClickListener() {

                        @Override
                        public void onClick(DialogInterface dialogInterface, int i) {
                            FirebaseDatabase database = FirebaseDatabase.getInstance();
                            DatabaseReference db = database.getReference("Employees");
                            db.child(list.get(position).getId()).removeValue();
                        }
                    })
                    .setNegativeButton("لا",null)
                    .setIcon(android.R.drawable.ic_dialog_alert)
                    .show();
        }
    });
}

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

public class ViewHolder extends RecyclerView.ViewHolder {

    TextView tv_name;
    ImageView btn_call, btn_delete ;

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

        tv_name = itemView.findViewById(R.id.tx_name);
        btn_call = itemView.findViewById(R.id.btn_call);
        btn_delete = itemView.findViewById(R.id.btn_deleteP);
        itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                recyclerView_interFace.onItemClick(getAdapterPosition());
            }
        });
    }
}

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

private Filter filter = new Filter() {

    //run on background thread
    @Override
    protected FilterResults performFiltering(CharSequence charSequence) {

        List<WorkerModel> listFilter2 = new ArrayList <>();
        if (charSequence ==null || charSequence.length()==0){
            // if search text is empty add all original list values to filterlist
            listFilter2.addAll(listFilter);
        }else {
            String filterPattern = charSequence.toString().toLowerCase().trim();
            // Perform search on whole original list
            for (WorkerModel workerModel : listFilter){
                if (workerModel.getName().toLowerCase().contains(filterPattern)){
                    listFilter2.add(workerModel);
                }
            }
        }
        FilterResults results = new FilterResults();
        results.values = listFilter2;
        return results;
    }

    //run on UI thread
    @Override
    protected void publishResults(CharSequence charSequence, FilterResults filterResults) {
        list.clear();
        list.addAll((List) filterResults.values);
        notifyDataSetChanged();
    }
};

}

各位有什么问题吗? 提前谢谢帮助

【问题讨论】:

  • listFilter 为空,因为它仅由构造函数设置,并且由空列表初始化。在 onDataChange() 内部,列表更新为新项目,listFilter 也应该更新。
  • 可以给我代码,这对我帮助太大了

标签: android android-studio searchview


【解决方案1】:

在WorkerAdapter的performFiltering()里面试试,第一行加入下面一行:if (listFilter.size() == 0) listFilter = new ArrayList&lt;&gt;(list);

【讨论】:

    猜你喜欢
    • 2023-03-29
    • 1970-01-01
    • 1970-01-01
    • 2015-06-14
    • 1970-01-01
    • 1970-01-01
    • 2014-10-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多