过滤后的ListView onItemClick会在原始位置返回Item

时间:2013-01-28 12:57:30

标签: android listview filter

我有一个列表视图,其中自定义行是从自定义BaseAdaptor填充的。点击任意一行,我打开一个新的Activity。 在我将过滤器功能添加到此列表之前,一切正常。当我搜索列表然后单击一个项目时,它不会打开与过滤结果相关联的活动。它会打开与原始列表中该位置的项目相关的活动。

EG。 - 原始清单:AA,BA,CC,DA,ED,FF

搜索:'A' 过滤结果:AA,BA,DA

但是当我点击项DA时,它会打开CC的活动。极度刺激。我在适配器上调用了notifyDataSetChanged()

我一直坚持这个问题。我真的不知道如何解决它。 我没有发布代码,因为它是一大堆代码,我真的不想把所有内容放在这里。

如果有人可以让我知道如何从FILTERED列表中选择项目..这很棒。

谢谢! 告诉我是否需要其他东西来理解我的问题!

3 个答案:

答案 0 :(得分:13)

感谢您的回复,但我发现了问题。

我希望这可以帮助另一个人。有了这个基本的东西,有时很难找到错误,我们采用了很复杂的方法!

要开始我的新活动,我从自定义适配器获取项目位置而不覆盖getItem()函数。

Object obj = myListAdapter.getItem(position);

我覆盖了这个功能

@Override
public Object getItem(int position) {
    return myList.get(position);
}
瞧,瞧!得到了正确的活动开放。 ( facepalm 我知道..) 无论如何,谢谢你的回答!

答案 1 :(得分:0)

这是因为您的CustomAdapter使用您的第一个Cursor而不是过滤的

您可以在适配器定义中使用它:

public Cursor swapCursor(Cursor c1)
{
    super.swapCursor(c1);
    c = c1;
    notifyDataSetChanged();
    return c;

} 

并在您的调用活动中使用

YourCustomAdapter.swapCursor(FilteredCursor);

答案 2 :(得分:0)

您可以做的是在您自定义的SearchViewAdapter中(即您设置的类(上下文,资源,Arraylist)),可以创建一个方法,该方法存储传递给SearchViewAdapter的原始ArrayList,并创建一个方法来获取listView中选定对象的原始位置:

dotnet --info

然后在listView.setOnItemClickListener上的SearchView Activity或要实现searchView的任何地方,调用getpos(adapterView.getItemAtPosition(i))方法,该方法将adapterView.getItemAtPosition(i)作为参数。不管由searchView引起的过滤如何,getpos()方法都会返回原始对象位置的索引。然后您可以在索引上切换(

 //in your custom SearchViewAdapter create methods store() and getPos() 

public void store(ArrayList<SearchViewClass>originalList){
   mylist=new ArrayList<>(originalList);
      }  //The store method should be called once in searchView Activity when you pass all needed values into your Arraylist            


public int getPos(Object obj){
    return mylist.indexOf(obj);
}