在Android上单击listview项时,过滤Listview未显示正确的结果

时间:2014-12-06 14:51:17

标签: java android listview filter

我在过滤列表视图数据后单击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);
        }
    });

我是否需要使用自定义适配器?

1 个答案:

答案 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中过滤错误的影响。