我在过滤列表视图数据后单击lisview中的项目时得到错误的结果。我理解过滤列表视图后位置值的变化,我无法弄清楚如何获得正确的位置值。
mListView.setAdapter(mAdapter = new ArrayAdapter<String>(getActivity(),android.R.layout.simple_list_item_1, data));
mListView.setTextFilterEnabled(true);
setupSearchView();
mAdapter.setNotifyOnChange(true);
mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
getActivityMain().pushNextFragment(FragmentWebview.newInstance(bbcNewsList.get(position).link,"roundfeed",bbcNewsList.get(position).title,bbcNewsList.get(position).source,bbcNewsList.get(position).image));
System.out.println(" id " + id + " pos " + position);
}
});
我是否需要使用自定义适配器?
答案 0 :(得分:0)
您无法了解代码当前的情况,因为无法将外部列表与适配器的外部列表同步...尤其是涉及过滤时。您需要一个自定义适配器来代替存储bbcNewsList
的数据类型。为了这个答案,我们可以说List
正在存储Foo
个对象。你想做的事情如下:
List<Foo> bbcNewsList;
// Fill bbcNewsList with data
mAdapter = new MyCustomAdapter(getActivity(),bbcNewsList);
mListView.setAdapter(mAdapter);
//Continue instantiation as needed
您可以尝试为自定义解决方案扩展ArrayAdapter
,但这可能会有问题。首先,您需要覆盖getView()
方法,以便它知道如何显示自定义Foo
对象。否则,它只会将您的Foo
对象转换为String
并显示该对象。通过图片中的过滤,您将陷入默认逻辑。在您的情况下,ArrayAdapter
会将您的Foo
对象转换为String
,并根据该结果进行过滤。你可能对这种行为很好,在这种情况下,你对这种方法很好。但是,如果您打算动态修改,我会警告ArrayAdapter
有一个非常讨厌filtering bug。
另一种方法是从头开始编写自己的适配器。 Aka实现了BaseAdapter
类。虽然不是太令人生畏,但对于刚刚学习Android或者不确定适配器如何工作的人来说,这可能相当具有挑战性。此解决方案还需要您实现所有过滤代码。
最后,第三个选项是使用第三方库。我建议AbsArrayAdapter课。您基本上可以使用第一个选项执行此操作,但可以选择指定如何过滤Foo
对象。它也不会受到Android ArrayAdapter
中过滤错误的影响。