繁体   English   中英

RecyclerView 列表搜索(过滤)EditText 问题

[英]RecyclerView list search (filter) EditText problem

我想在我的 recyclerview 列表中添加一个搜索功能,我通过查看教科书在互联网上尝试了代码,它工作正常,但是如果您删除 edittext 中的字母,则列表不会返回,它只会删除列表。

示例:如果我在 edittext 中输入 '' I 12345 '',其余的将被删除,只有 '' I 12345 '' 将保留,但如果我在 edittext 中删除文本,则列表将不会返回。

请帮助修复!

这是我的所有代码:

主活动Java:

public class MainActivity extends AppCompatActivity {

    RecyclerViewAdapter recyclerViewAdapter;

    RecyclerView recyclerView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        recyclerView = findViewById(R.id.recyclerview1);

        //here start search code


        EditText editText = findViewById(R.id.izlash_edittext);
        editText.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) {

            }

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


        //here end search code

        recyclerView.setLayoutManager(new LinearLayoutManager(getApplicationContext()));

        ArrayList<Item> items = new ArrayList<>();

        items.add(new Item("start", R.drawable.start));
        items.add(new Item("end", R.drawable.end));

        recyclerView.setAdapter(recyclerViewAdapter);

    }

        //here start search code
    private void filter(String title) {
        ArrayList<Item> filteredList = new ArrayList<>();

        for (Item item : recyclerViewAdapter.items) {
            if (item.title.toLowerCase().contains(title.toLowerCase())) {
                filteredList.add(item);
            }

            recyclerViewAdapter.filterList(filteredList);
        }
    }

        //here end search code

}

RecyclerViewAdapter java:

public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.ViewHolder> {

    ArrayList<Item> items;
    ItemClickListener itemClickListener;

    public RecyclerViewAdapter(ArrayList<Item> items, ItemClickListener itemClickListener) {
        this.items = items;
        this.itemClickListener = itemClickListener;
    }

    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {

        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.single_item, parent, false);

        return new ViewHolder(view);
    }

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

        Item item = items.get(position);

        holder.title.setText(item.title);
        holder.imageView.setImageResource(item.image);

        holder.itemView.setOnClickListener(view -> {
            itemClickListener.onClick(item);
        });
    }

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

    //here start search code

    public void filterList(ArrayList<Item> filteredList) {
        items = filteredList;
        notifyDataSetChanged();
    }

    //here end search code

    public interface ItemClickListener {
        void onClick(Item item);
    }

    class ViewHolder extends RecyclerView.ViewHolder {

        TextView title;
        ImageView imageView;

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

            title = itemView.findViewById(R.id.textView1);
            imageView = itemView.findViewById(R.id.imageview1);
        }

    }
}

项目 java:

public class Item {

    String title;
    int image;
    String qisqaMalumot;
    String uzunMalumot;

    public Item(String title, int image, String qisqaMalumot, String uzunMalumot) {
        this.title = title;
        this.image = image;
        this.qisqaMalumot = qisqaMalumot;
        this.uzunMalumot = uzunMalumot;
    }
}

请帮我。

 for (Item item : recyclerViewAdapter.items) {
        if (item.title.toLowerCase().contains(title.toLowerCase())) {
            filteredList.add(item);
        }

当您在recyclerViewAdapter.items搜索时,recyclerview 替换为新数据,旧数据消失。

首先制作全局列表ArrayList<Item> items = new ArrayList<>();

public class MainActivity extends AppCompatActivity {

RecyclerViewAdapter recyclerViewAdapter;
ArrayList<Item> items = new ArrayList<>();
RecyclerView recyclerView;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
  } 

第二个替换 for 循环中的items

  for (Item item : items) {
        if (item.title.toLowerCase().contains(title.toLowerCase())) {
            filteredList.add(item);
        }

完成 !

首先,您需要在您的适配器中实现 Filterable。然后您需要在 listadapter 中保留一个过滤项,以便您可以恢复到其旧状态。 当您登录以在主活动中从 edittext 进行查询时,通过这种方式,适配器可以更改并恢复到其旧状态。 如果你按照自己的方式编辑代码,它会顺利运行。

      public class BulletinAdapter extends RecyclerView.Adapter<BulletinAdapter.BulletinVHolder> implements Filterable {

    private Context context;
    private List<EventResponseItem> eventsItemList;
    private List<EventResponseItem> filteredList;

    public BulletinAdapter(Context context, List<EventResponseItem> eaItemList) {
        this.context = context;
        this.filteredList = eaItemList;
    }

    @NonNull
    @Override
    public BulletinVHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        return new BulletinVHolder(RowNewaddBinding.inflate(LayoutInflater.from(context), parent, false));
    }

    @Override
    public void onBindViewHolder(@NonNull BulletinVHolder holder, int position) {
        EventResponseItem eaItem = filteredList.get(position);

        if (eaItem != null) {
            holder.bind.rowNewMatchId.setText(String.valueOf(eaItem.getEid()));
        }

    }

    @Override
    public int getItemCount() {
        if (filteredList != null && filteredList.size() > 0) {
            return filteredList.size();
        } else {
            return 0;
        }
    }

    @Override
    public int getItemViewType(int position) {
        return super.getItemViewType(position);
    }

    @Override
    public Filter getFilter() {
        return new Filter() {
            @Override
            protected FilterResults performFiltering(CharSequence constraint) {
                String charString = constraint.toString();
                if (constraint.length() == 0) {
                    filteredList = eventsItemList;
                } else {
                    List<EventResponseItem> filterList = new ArrayList<>();
                    for (EventResponseItem modelMovie : eventsItemList) {
                        if (modelMovie.getEprt().get(0).getPn().toLowerCase().contains(charString) | modelMovie.getEprt().get(1).getPn().toLowerCase().contains(charString)) {
                            filterList.add(modelMovie);
                        }
                    }
                    filteredList = filterList;
                }
                FilterResults filterResults = new FilterResults();
                filterResults.values = filteredList;
                return filterResults;

            }

            @Override
            protected void publishResults(CharSequence constraint, FilterResults results) {
                filteredList = (List<EventResponseItem>) results.values;
                notifyDataSetChanged();
            }
        };
    }

    class BulletinVHolder extends RecyclerView.ViewHolder {

        private RowNewaddBinding bind;

        public BulletinVHolder(@NonNull RowNewaddBinding bind) {
            super(bind.getRoot());
            this.bind = bind;
        }
    }
}

MainActivity.class..

private List<EventResponseItem> eventsItemList; //set list data
        private BulletinAdapter bulletinAdapter; //recyclerview set adapter...(data and layoutmanager)
       bulletinAdapter = new BulletinAdapter(MatchAddNew.this,eventsItemList);
                        bind.matchAddNewRecyclerView.setLayoutManager(new LinearLayoutManager(MatchAddNew.this));
                        bind.matchAddNewRecyclerView.setAdapter(bulletinAdapter); 
            search(bind.searchViewNewMatch); //viewBinding your edittext...
            
            private void search(SearchView searchView) {
                    searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
                        @Override
                        public boolean onQueryTextSubmit(String s) {
                            return false;
                        }
            
                        @Override
                        public boolean onQueryTextChange(String s) {
                            if (bulletinAdapter != null) {
                                bulletinAdapter.getFilter().filter(s.toLowerCase());
                            }
            
                            return true;
                        }
                    });

            }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM