我有一个名为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()
方法。
问题是如何在这些方法中搜索列表以及如何关注相应的列表项?
答案 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
}
});