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

时间:2015-05-05 06:50:32

标签: android

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

        If dgvReport2.Rows.Count > 0 Then
            For rows As Integer = 0 To dgvReport.Rows.Count - 1
                dgvReport2.Rows(rows).Cells(newCol).Value =
                dgvReport.Rows(rows).Cells(1).Value
            Next
        Else
            For rows As Integer = 0 To dgvReport.Rows.Count - 1
                dgvReport2.Rows.Add(dgvReport.Rows(rows).Cells(1).Value)
            Next
        End If

2 个答案:

答案 0 :(得分:3)

或者您可以使用TextWatcher

  

当一个类型的对象附加到Editable时,将在更改文本时调用其方法。

    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
        }
    });

现在,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);
    }

将过滤器功能添加到Adapter类中,不要忘记调用 notifyDataSetChanged 来更新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();
}

另外,请看一下同一主题的其他问答:

How to use the TextWatcher class in Android?

答案 1 :(得分:0)

试试这个可以帮到你。 使用textwatcher作为您的edittext,如下所示:

// In your main activity

et_Search = (EditText)findViewById(R.id.et_Search);
        et_SearchBar.addTextChangedListener(new TextWatcher() {

            @Override
            public void onTextChanged(CharSequence s, int start, int before,
                    int count) 
            {
                    try 
                    {
                        try{
                        (listDatacontainers).getFilter().filter(s.toString());
                        }
                        catch(Exception e)
                        {
                            Log.i("error at ListAdapter", e.toString());
                        }
                        } 
                    catch (Exception e) 
                    {

                    }

            }

            @Override
            public void beforeTextChanged(CharSequence s, int start, int count,
                    int after) {
            }

            @Override
            public void afterTextChanged(Editable s) 
            {

            }
        });

在适配器源文件中创建方法getfilter()