尝试使用 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