【问题标题】:How to filter a listView without notifyDataSetChanged?如何在没有 notifyDataSetChanged 的​​情况下过滤 listView?
【发布时间】:2012-11-12 20:34:39
【问题描述】:

在开发我的第一个应用程序时,我想让用户能够搜索 ListView 中的条目(它位于 UI 线程中)。 为此,我将 SearchView 添加到操作栏中。

listView1.setTextFilterEnabled(true);

在 AsyncTask 中,我将 Adapter 设置为 listView:

protected void onPostExecute(boolean result) {
ListAdapter listadapter= new ArrayAdapter<String>(getApplicationContext(), R.layout.list_item, nameList);
listview1.setAdapter(listadapter);
}

现在是 SearchView:

public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.activity_main, menu);    
    SearchView searchView = (SearchView) menu.findItem(R.id.menu_search).getActionView();
searchView.setOnQueryTextListener(this);
return true;
[...]
}

我还添加了这些功能:

public boolean onQueryTextChange(String newText) {
    ListView listview1= (ListView) findViewById(R.id.mylist);
    listview1.setFilterText(newText);
    //mFilter.filter(newText);
    return false;
}

public boolean onQueryTextSubmit(String query) {
    ListView listview1= (ListView) findViewById(R.id.mylist);
    listview1.setFilterText(query);
}

现在过滤 工作正常,但是这个带有搜索到的字符序列的覆盖隐藏了过滤后的数据 -> 它看起来不太好。

当我到处阅读时,没有简单的可能性来关闭这个覆盖。 所以我稍微改变了我的代码:

onPostExecute(blaaaaa) { [...]
     //Filter mFilter= = new ArrayAdapter<String>(getApplicationContext(), R.layout.list_item, nameList).getFilter();

还有两个功能:

 //mFilter.filter(the_entered_text);
 ((ArrayAdapter<String>)listAdapter).getFilter().filter(query);
 ((ArrayAdapter<String>)listAdapter).notifyDataSetChanged();

我现在的问题是,如何让 listView 得到更新? “listview1.notifyDataSetChanged()”对我来说不是选项,因为它不适用于我的 ListAdapter。

编辑:转换适配器,就像在答案 postet 中一样,现在它可以工作了,但它会过滤:输入的文本 =“ka”-> 显示所有以“ka”开头的条目,而不是包含“卡”。

【问题讨论】:

  • 很抱歉让您感到沮丧,但没必要发誓。

标签: android android-listview


【解决方案1】:

listview1.getAdapter().notifyDataSetChanged()

简单

【讨论】:

  • 谢谢,但是我的listView没有getListAdapter功能,不知道为什么,但是输入“listView1”的时候建议中没有。
  • MainActivity 扩展了 Activity 并实现了 SearchView.OnQueryTextListener
  • 你的 ListView 是什么类?
  • 不确定您的确切意思,但 ListView 在 MainActivity 中。
  • 另外,当我调用“listview.getAdapter()”时。建议只有“notify()”和“notifyall()”。
猜你喜欢
  • 1970-01-01
  • 2019-04-12
  • 2017-05-27
  • 2015-02-16
  • 1970-01-01
  • 2021-09-14
  • 1970-01-01
  • 2022-12-22
  • 2023-03-10
相关资源
最近更新 更多