6

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

例如。- 原始清单:AA、BA、CC、DA、ED、FF

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

但是,当我单击项目时DA,它会打开 Activity 的CC. 非常烦人。我已经调用notifyDataSetChanged()了适配器。

我已经被这个问题困扰了一段时间。我真的不知道如何解决它。我没有发布代码,因为它有很多代码,我真的不想把所有东西都放在这里。

如果有人可以告诉我如何从过滤列表中选择项目.. 它会很棒。

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

4

3 回答 3

13

谢谢大家的回复,但我发现了问题。

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

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

Object obj = myListAdapter.getItem(position);

我重写了函数

@Override
public Object getItem(int position) {
    return myList.get(position);
}

瞧!得到了正确的活动开口。(我知道facepalm ..)无论如何感谢您的回答!

于 2013-01-28T13:23:11.580 回答
0

发生这种情况是因为您的 CustomAdapter 使用您的第一个光标而不是过滤的光标

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

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

} 

并在您的通话活动中使用

YourCustomAdapter.swapCursor(FilteredCursor);
于 2013-01-28T13:05:43.510 回答
0

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

 //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);
}

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

listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
 switch (searchViewAdapter.getPos(adapterView.getItemAtPosition(i))){
               case 0:...break}
}
于 2020-01-14T03:04:25.323 回答