尝试使用 SearchView 过滤 ListView。无论我输入哪个词,都不会显示任何项目,即使 ListView 上存在相关项目
Trying to filter a ListView with a SearchView. No items are displayed no matter which word I enter, even if relevant items exist on the ListView
我的 listview 上有 2,000 多个项目,无论我搜索哪个项目,按一个字母后,listView 变成空白,好像没有相关项目一样。
我猜这是因为我使用的是 Android Studio 提供的 simple_list_item_2 布局。它上面有两个 textView 字段,这就是为什么过滤可能会搞砸的原因。不过这只是我的猜测。
这是适配器和列表视图:
adapter = new ArrayAdapter(ViewExistingCustomersActivity.this, android.R.layout.simple_list_item_2, android.R.id.text1, customers) {
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view = super.getView(position, convertView, parent);
TextView text1 = (TextView) view.findViewById(android.R.id.text1);
TextView text2 = (TextView) view.findViewById(android.R.id.text2);
text1.setText(customers.get(position).getDefinition());
text2.setText(customers.get(position).getAddress1() + " Bakiye: " + customers.get(position).getBalance());
return view;
}
};
customersListView.setAdapter(adapter);
// Dokunulan ListView elemanının detaylarını gösterecek ekranı çağıran kod.
customersListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
Intent viewCustomerDetailsIntent = new Intent(ViewExistingCustomersActivity.this, CurrentStatementActivity.class);
viewCustomerDetailsIntent.putExtra("customer", customers.get(i));
viewCustomerDetailsIntent.putExtra("user", user);
startActivity(viewCustomerDetailsIntent);
}
});
这是搜索视图:
customersSearchView.setOnQueryTextListener(new OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
return false;
}
@Override
public boolean onQueryTextChange(String newText) {
adapter.getFilter().filter(newText);
return false;
}
});
您可以将 Customer 模型实现为 return 您要过滤的字符串。
您拥有的模型(返回 customers.get(位置))
public class Custumer {
//The rest as is
@Override public String toString() {
return getDefinition();
}
}
如果您使用 ContentProvider 检索数据列表,则 onQueryTextChange()
中的以下行将不起作用:
adapter.getFilter().filter(newText);
如果您使用 CursorLoader(与 ContentProvider),则必须使用 LoaderManager 回调来过滤数据,而不是直接使用适配器。您需要将 onQueryTextChange()
方法更改为如下内容:
private String cursorFilter;
@Override
public boolean onQueryTextChange(String newText) {
cursorFilter = !TextUtils.isEmpty(newText) ? newText : null;
getLoaderManager().restartLoader(0, null, this);
return true;
}
@Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
Uri baseUri;
if (cursorFilter != null) {
// Filter the data with the cursorFilter
baseUri = Uri.withAppendedPath(Contacts.CONTENT_FILTER_URI,
Uri.encode(cursorFilter));
} else {
baseUri = MyContentProvider.CONTENT_URI;
}
...
}
示例见此处:http://android-er.blogspot.co.uk/2013/02/query-contacts-database-using-loader.html
我的 listview 上有 2,000 多个项目,无论我搜索哪个项目,按一个字母后,listView 变成空白,好像没有相关项目一样。
我猜这是因为我使用的是 Android Studio 提供的 simple_list_item_2 布局。它上面有两个 textView 字段,这就是为什么过滤可能会搞砸的原因。不过这只是我的猜测。
这是适配器和列表视图:
adapter = new ArrayAdapter(ViewExistingCustomersActivity.this, android.R.layout.simple_list_item_2, android.R.id.text1, customers) {
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view = super.getView(position, convertView, parent);
TextView text1 = (TextView) view.findViewById(android.R.id.text1);
TextView text2 = (TextView) view.findViewById(android.R.id.text2);
text1.setText(customers.get(position).getDefinition());
text2.setText(customers.get(position).getAddress1() + " Bakiye: " + customers.get(position).getBalance());
return view;
}
};
customersListView.setAdapter(adapter);
// Dokunulan ListView elemanının detaylarını gösterecek ekranı çağıran kod.
customersListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
Intent viewCustomerDetailsIntent = new Intent(ViewExistingCustomersActivity.this, CurrentStatementActivity.class);
viewCustomerDetailsIntent.putExtra("customer", customers.get(i));
viewCustomerDetailsIntent.putExtra("user", user);
startActivity(viewCustomerDetailsIntent);
}
});
这是搜索视图:
customersSearchView.setOnQueryTextListener(new OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
return false;
}
@Override
public boolean onQueryTextChange(String newText) {
adapter.getFilter().filter(newText);
return false;
}
});
您可以将 Customer 模型实现为 return 您要过滤的字符串。
您拥有的模型(返回 customers.get(位置))
public class Custumer {
//The rest as is
@Override public String toString() {
return getDefinition();
}
}
如果您使用 ContentProvider 检索数据列表,则 onQueryTextChange()
中的以下行将不起作用:
adapter.getFilter().filter(newText);
如果您使用 CursorLoader(与 ContentProvider),则必须使用 LoaderManager 回调来过滤数据,而不是直接使用适配器。您需要将 onQueryTextChange()
方法更改为如下内容:
private String cursorFilter;
@Override
public boolean onQueryTextChange(String newText) {
cursorFilter = !TextUtils.isEmpty(newText) ? newText : null;
getLoaderManager().restartLoader(0, null, this);
return true;
}
@Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
Uri baseUri;
if (cursorFilter != null) {
// Filter the data with the cursorFilter
baseUri = Uri.withAppendedPath(Contacts.CONTENT_FILTER_URI,
Uri.encode(cursorFilter));
} else {
baseUri = MyContentProvider.CONTENT_URI;
}
...
}
示例见此处:http://android-er.blogspot.co.uk/2013/02/query-contacts-database-using-loader.html