我创建了一个包含ListView的布局。
此ListView中显示的数据并不太复杂,它主要是在启动扩展活动时传递的数组。
行本身存在于图标和文本之外,因此是ImageView和TextView。 为了填充ListView,我使用ArrayAdapter只是因为传递了一个包含应该显示的所有文本项的数组。
现在我想实际上能够过滤那些,因此我发现在ListView xml声明中添加了android:textFilterEnabled参数... 现在一个搜索字段很好地显示但是当我输入一些字母时它不会过滤但它只会删除整个列表。 我发现那是因为textfilter不知道它应该过滤什么。
所以现在我的问题是:我知道我需要告诉textfilter它应该过滤什么,我还有我的数组填充了应该过滤的文本,所以我如何将这两个结合起来?
我见过扩展CursorAdapter的例子,但是我没有Cursor,我不想对数据库进行调用我想用数据重新利用我的数据,显然是ArrayAdapter本身就是这样数据将在屏幕上正确显示(即使用我的ImageView和TextView布局)。
如何做到这一点?
答案 0 :(得分:2)
您的自定义适配器必须实现Filterable
接口,覆盖getFilter()
并返回在Filter
中扩展getFilter()
的类的实例。
我这样做的方法是创建一个过滤类的实例,并将其存储在我的适配器内的final
实例变量中,并在调用getFilter()
时返回。
查看ArrayAdapter
源代码,以便更好地了解如何自行进行过滤。
答案 1 :(得分:0)
我能够在 ListView 中使用带有“String”的 ArrayAdapter 作为泛型参数(即我使用ArrayAdapter<String> ... = new ArrayAdapter<String>(...)
创建)以编程方式调用 setTextFilterEnabled 和 setFilterText 以将其过滤掉。以下是我在 ListActivity 中执行此操作的方法:
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
// This array list will be updated each time.
final ArrayList<String> data = new ArrayList<String>();
data.add("apple");
data.add("orange");
data.add("tomato");
dataAdapter = new ArrayAdapter<String>(this, R.layout.item,
R.id.itemName, data);
setListAdapter(dataAdapter);
ListView view = getListView();
view.setTextFilterEnabled(true);
view.setFilterText("ap");
}
我也尝试使用非基于字符串的适配器,您可以从here获取结果代码。在这种情况下,我创建了一个名为 Item 的对象,这是我想要放在 ListView 和 ArrayAdapter 中的对象。它会过滤对象的 toString 方法返回的内容。在示例中,我 toString 过滤项目的名称。请注意,与上述情况不同,我在视图的XML文件中设置了 android:textFilterEnabled 属性,而不是像您所描述的那样调用 setTextFilterEnabled 。