0

当用户在文本框中输入内容时,我想过滤我的列表。

但是尝试输入文本框时没有任何反应。

我看到了很多话题,但可以意识到哪里出了问题。

我知道这个问题被问了很多次,但我可以解决它。

这是我的代码:

public class Find extends ListActivity {

private EditText filterText = null;
DBHandler db=new DBHandler(this);
ListView myList;
String[] items = new String[10];
SimpleCursorAdapter adapter=null;
int test = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_find_search);
    filterText = (EditText) findViewById(R.id.searchbox);
    filterText.addTextChangedListener(filterTextWatcher);


Cursor cursor=db.getEvents();
    startManagingCursor(cursor);
    String[] from = {"_id","full_name"};
    int[] to = { R.id.name_entry, R.id.number_entry};
    adapter = new SimpleCursorAdapter(this, R.layout.activity_find, cursor, from, to);
setListAdapter(adapter);

我的文本观察方法:

    private TextWatcher filterTextWatcher = new TextWatcher() {

    public void afterTextChanged(Editable s) {
    }

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

    public void onTextChanged(CharSequence s, int start, int before,
            int count) {

        adapter.getFilter().filter(s);

    }

};
4

3 回答 3

1

您还需要一些额外的东西才能使用 SimpleCursorAdapter 进行过滤。首先,您需要为您的适配器识别字符串转换列,其次您需要实现一个FilterQueryProvider并通过 setFilterQueryProvider 方法调用将其添加到您的适配器。

这是一个 FilterQueryProvider 实现的简单示例:

mAdapter.setFilterQueryProvider(new FilterQueryProvider() {
   @Override
   public Cursor runQuery(CharSequence constraint) { 
      if (constraint == null) {
         // contract: if constraint is null, return the same as before
     return mAdapter.getCursor();
      } else {
         //TODO: run your query here... 
      }
   }
});
于 2013-02-16T04:39:34.327 回答
0

我有我的自定义方法来实现与两组过滤ArrayList。(您可以根据需要对其进行修改。)

1) 搜索 ArrayList
2) 主 ArrayList

第一种方法是将搜索数组设置为与主数组相同的值。

public void setarray() {


        for (int j = 0; j < MainArray.size(); j++) {

            SearchArray.add(MainArray.get(j));
        }
    }

第二种方法是用你的数组显示你的 ListView。

public void displaylist() {

        myCustomArrayAdaptor adapter = new myCustomArrayAdaptor(this,
                R.layout.myLayOut, SearchArray);

        mylistView = (ListView) findViewById(R.id.mylist);

        mylistView.setAdapter(adapter);


    }

第三种过滤 ListView 的方法

public void setsearcharray(CharSequence searchstr) {

//clear your array before adding the new value in it

        SearchArray.clear();

        int len1 = searchstr.length();

// if your search text length is zero then transfer all your main array data to search array.
        if (len1 == 0) {

            for (int j = 0; j < MainArray.size(); j++) {

                SearchArray.add(MainArray.get(j));
            }

// then display your listview with your search array value.
            displaylist();
        } else {
            for (int j = 0; j < MainArray.size(); j++) {

                String strvalue = MainArray.get(j);

                int length = searchstr.length();

//if your search text length is smaller then the value that is in your array

                if (strvalue.length() >= length) {
                    String substr = strvalue.substring(0, length);

                    if (substr.equals(searchstr.toString())) {

                        SearchArray.add(strvalue);

                        displaylist();

                    } else {
                        displaylist();
                    }

                }

            }
        }

    } 

然后将您的自定义搜索方法添加到您的TextWatcher

private TextWatcher filterTextWatcher = new TextWatcher() {

        public void afterTextChanged(Editable s) {
        }

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

        public void onTextChanged(CharSequence s, int start, int before,
                int count) {

            setsearcharray(s);
        }

    };

不要忘记添加setarray(); displaylist();到您的public void onCreate(Bundle savedInstanceState)方法以首次生成列表,例如:

public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.lead_layout);

        setarray();

        displaylist();
}

希望这会有所帮助。

于 2013-02-16T04:53:15.537 回答
0

你看过这些吗?

使用自定义(对象)适配器过滤 ListView <- 在文本视图上。用户开始输入文本。

http://www.androidhive.info/2012/09/android-adding-search-functionality-to-listview/ <- 在顶部显示文本字段......然后你在里面输入......

于 2013-02-16T03:55:12.447 回答