我确实有一个可能有几千个项目的列表(仅使用约200个项目的较短列表进行测试)。信息存储在SQLite中,ContentProvider
,加载器和SimpleCursorAdapter
被使用。列表按字典顺序排序,并使用android:fastScrollEnabled
。列表滚动顺畅 - 当知道项目的确切名称时没问题。
偶尔,我想在名称中间的某处找到包含某些子字符串的项目。 `... LIKE“%想要%”对我来说是一个解决方案。但是,我想给用户一个增量过滤 - 即在键入子字符串期间更新列表内容。原因是输入许多字符可能不是必要的,并且应该尽快找到该项目。目标不是找到一个或没有项目。目标是过滤列表,以便可以接受手动滚动来概览候选项目,并通过触摸选择其中一项。
我遇到了SearchView
小部件,它非常适合操作栏。无论如何,在文档中阅读更多关于它的内容,我不确定它是否适合我。或者,如果建议的实施是我的。 (我是一个Android初学者,我甚至不确定我是否理解它。)
是否可以使用窗口小部件在Action Bar中具有SearchView的同一活动中对列表进行增量过滤?你能指点一些可能显示如何实现所需行为的代码吗?
答案 0 :(得分:1)
试用的示例代码:
public class AndroidListViewFilterActivity extends Activity {
ArrayAdapter<String> dataAdapter = null;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//Generate list View from ArrayList
displayListView();
}
private void displayListView() {
//Array list of countries
List<String> countryList = new ArrayList<String>();
countryList.add("Aruba");
countryList.add("Anguilla");
countryList.add("Netherlands Antilles");
countryList.add("Antigua and Barbuda");
countryList.add("Bahamas");
countryList.add("Belize");
countryList.add("Bermuda");
countryList.add("Barbados");
countryList.add("Canada");
countryList.add("Costa Rica");
countryList.add("Cuba");
countryList.add("Cayman Islands");
countryList.add("Dominica");
countryList.add("Dominican Republic");
countryList.add("Guadeloupe");
countryList.add("Grenada");
//create an ArrayAdaptar from the String Array
dataAdapter = new ArrayAdapter<String>(this,R.layout.country_list, countryList);
ListView listView = (ListView) findViewById(R.id.listView1);
// Assign adapter to ListView
listView.setAdapter(dataAdapter);
//enables filtering for the contents of the given ListView
listView.setTextFilterEnabled(true);
listView.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View view,int position, long id) {
// When clicked, show a toast with the TextView text
Toast.makeText(getApplicationContext(),((TextView) view).getText(), Toast.LENGTH_SHORT).show();
}
});
EditText myFilter = (EditText) findViewById(R.id.myFilter);
myFilter.addTextChangedListener(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) {
dataAdapter.getFilter().filter(s.toString());
}
});
}
}