我如何使用编辑文本在自定义列表适配器中实现搜索功能

Dev*_*Das 1 android

这是我的自定义列表适配器,如何使用编辑文本在自定义列表适配器中实现搜索功能。我尝试了很多方法来实现搜索功能

     public class ListAdapter extends BaseAdapter  {

   public ArrayList<Users> listDataContainers = new ArrayList<>();

        ListAdapter(ArrayList<Users> listDataContainers) {
            this.listDataContainers = listDataContainers;
        }

        @Override
        public int getCount() {

            return listDataContainers.size();
        }

        @Override
        public User getItem(int arg0) {

            return listDataContainers.get(arg0);
        }

        @Override
        public long getItemId(int arg0) {

            return arg0;
        }

        @Override
        public View getView(int pos, View arg1, ViewGroup arg2) {

            if (arg1 == null) {
                LayoutInflater inflater = (LayoutInflater) getBaseContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                arg1 = inflater.inflate(R.layout.listitem_layout, arg2, false);
            }
            TextView pa_name = (TextView) arg1.findViewById(R.id.textName);
            TextView pa_date = (TextView) arg1.findViewById(R.id.textRoom);


            Patient item = listDataContainers.get(pos);
            pa_name.setText(item.name);

            pa_date.setText(item.adm_date);

            if (pos % 2 == 0)
                arg1.setBackgroundResource(R.drawable.listview_selector_white);
            else
                arg1.setBackgroundResource(R.drawable.listview_selector_grey);

            return arg1;


        }



}
Run Code Online (Sandbox Code Playgroud)

app*_*oll 5

或者您可以使用TextWatcher

当某个类型的对象附加到可编辑对象时,当文本更改时将调用其方法。

    searchField = (EditText) findViewById(R.id.search);
    searchField.addTextChangedListener(new TextWatcher() {
        @Override
        public void afterTextChanged(Editable arg0) {
            // TODO Auto-generated method stub
            String text = searchField.getText().toString().toLowerCase(Locale.getDefault());
            adapter.filter(text);
        }

        @Override
        public void beforeTextChanged(CharSequence arg0, int arg1,
                int arg2, int arg3) {
            // TODO Auto-generated method stub
        }

        @Override
        public void onTextChanged(CharSequence arg0, int arg1, int arg2,
                int arg3) {
            // TODO Auto-generated method stub
        }
    });
Run Code Online (Sandbox Code Playgroud)

现在,EditText 将捕获用户输入并将其传递给自定义适配器类的过滤器函数。

在自定义适配器的构造函数中,您需要初始化第二个列表,以跟踪当前所需/搜索的项目:

public class ListAdapter extends BaseAdapter {
public ArrayList<Users> listDataContainers = new ArrayList<>();
private ArrayList<Users> usersFilteredList;
ListAdapter(ArrayList<Users> listDataContainers) {
        this.listDataContainers = listDataContainers;
        this.usersFilteredList = new ArrayList<Users>(); 
        this.usersFilteredList.addAll(listDataContainers);
    }
Run Code Online (Sandbox Code Playgroud)

将过滤器函数添加到您的 Adapter 类中,并且不要忘记调用notificationDataSetChanged来更新 UI。

public void filter(String charText) {
    charText = charText.toLowerCase(Locale.getDefault());
    listDataContainers.clear();
    if (charText.length() == 0) {
        listDataContainers.addAll(usersFilteredList);
    } else {
        for (Users user : usersFilteredList) {
            if (user.getName().toLowerCase(Locale.getDefault())
                    .contains(charText)) {
                listDataContainers.add(user);
            }
        }
    }
    notifyDataSetChanged();
}
Run Code Online (Sandbox Code Playgroud)

另外,请查看有关同一主题的其他一些问答:

如何在Android中使用TextWatcher类?