0

我有一个带有人名的 ListView 和一个带有 Search 小部件的 ActionBar。我想要做的是关注 ListView 中包含搜索查询作为子字符串的第一项。

例如,如果我有一个名为“John Doe”的人,并且我搜索“hn D”,那么只要它是第一个包含“hn D”作为子字符串的行,就应该关注该行。

请注意,我不希望从列表中删除不包含子字符串的项目。

这就是我列出清单的方式。

activity_main.xml

<ListView android:id="@+id/list_view"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" />

list_item.xml

<TextView
    android:id="@+id/name"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:padding="10dip"
    android:textSize="16sp"
    android:textStyle="bold" />

MainActivity.java

String[] names = {"John Doe","Mark Marky","Donald Duck","Derp Derpson"};
lv = (ListView) findViewById(R.id.list_view);
adapter = new ArrayAdapter<String>(this,R.layout.list_item, R.id.name, names);
lv.setAdapter(adapter);

我还有一个带有搜索小部件的操作栏,我实现了onQueryTextChange()andonQueryTextSubmit()方法。

问题是如何在这些方法中搜索列表以及如何关注适当的列表项?

4

2 回答 2

1

要进行文本搜索,您可以在适配器中使用过滤器

public class Adapter extends BaseAdapter implements Filterable {

@Override
public Filter getFilter() {

    Filter filter = new Filter() {
        @Override
        protected void publishResults(CharSequence constraint, FilterResults results) {
            //do you work
            notifyDataSetChanged();
        }
        @Override
        protected FilterResults performFiltering(CharSequence constraint) {

            FilterResults results = new FilterResults();
            List<Object> searchedList = new ArrayList<Object>();



            results.count = searchedList.size();
            results.values = searchedList;
            return results;
        }
    };
    return filter;
}

}

并像这样使用它:

private void searchAction(String query) {
    youradapter.getFilter().filter(_query);
}
于 2013-07-25T09:01:41.477 回答
1

searchedittext.addTextChangedListener(new TextWatcher() {

        @Override
        public void onTextChanged(CharSequence cs, int arg1, int arg2, int arg3) {
            // When user changed the Text
            YourActivity.this.youradapter.getFilter().filter(cs);   
        }

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

        @Override
        public void afterTextChanged(Editable arg0) {
            // TODO Auto-generated method stub  

        }
    });
于 2013-07-25T09:42:20.867 回答