Android ListView搜索和焦点

时间:2013-07-25 08:46:11

标签: android android-listview

我有一个名为people的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()onQueryTextSubmit()方法。

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

2 个答案:

答案 0 :(得分: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);
}

答案 1 :(得分:1)

searchingittext.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  

        }
    });