[英]Filtering Listview not showing correct result when listview item is clicked on Android
过滤列表视图数据后,单击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);
}
});
我需要使用自定义适配器吗?
您无法确定当前的代码状态,因为无法将外部列表与适配器的列表同步...尤其是在涉及过滤时。 您将需要一个自定义适配器,而不是存储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
会有一个非常讨厌的过滤错误 。
另一种选择是从头开始编写自己的适配器。 BaseAdapter
实现BaseAdapter
类。 虽然不太令人生畏,但对于那些刚学习Android或不确定适配器通常如何工作的人来说,这可能是一个挑战。 此解决方案还需要您实施所有过滤代码。
最后,第三个选择是使用第三方库。 我建议使用AbsArrayAdapter类。 您基本上将在此处执行第一个选项的操作,但可以选择指定如何过滤Foo
对象。 它还不受Android ArrayAdapter
的过滤错误的困扰。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.