我有一个列表视图,其中自定义行是从自定义BaseAdaptor
填充的。点击任意一行,我打开一个新的Activity
。
在我将过滤器功能添加到此列表之前,一切正常。当我搜索列表然后单击一个项目时,它不会打开与过滤结果相关联的活动。它会打开与原始列表中该位置的项目相关的活动。
EG。 - 原始清单:AA,BA,CC,DA,ED,FF
搜索:'A' 过滤结果:AA,BA,DA
但是当我点击项DA
时,它会打开CC
的活动。极度刺激。我在适配器上调用了notifyDataSetChanged()
。
我一直坚持这个问题。我真的不知道如何解决它。 我没有发布代码,因为它是一大堆代码,我真的不想把所有内容放在这里。
如果有人可以让我知道如何从FILTERED列表中选择项目..这很棒。
谢谢! 告诉我是否需要其他东西来理解我的问题!
答案 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);
}