【问题标题】:Filtered ListView onItemClick returns Item at original position过滤后的 ListView onItemClick 在原始位置返回项目
【发布时间】:2013-01-28 12:57:29
【问题描述】:

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

例如。 - 原始列表:AA、BA、CC、DA、ED、FF

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

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

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

如果有人可以告诉我如何从 FILTERED 列表中选择项目.. 那就太好了。

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

【问题讨论】:

  • 我还想补充一点,我已经在 stackoverflow 上搜索过此类问题,他们正在处理已检查的项目,这不是我想要的。我只是想通过单击列表中的特定项目来启动个性化活动。谢谢!

标签: android listview filter


【解决方案1】:

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

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

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

Object obj = myListAdapter.getItem(position);

我重写了函数

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

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

【讨论】:

  • 我不明白你的解决方案。 myList 是什么?
  • @Pinch myList 是 myListAdapter 中的列表。这是适配器中列表的链接。注意函数的名称以及我从哪里调用它。
  • Hy,这是一个非常古老的问题,但我遇到了问题,我已经在我的自定义适配器中覆盖了这个方法。但我在我的主要活动中从我的实际数组列表中获取位置未过滤,如何从过滤的列表中获取 id。?
【解决方案2】:

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

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

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

} 

并在您的调用活动中使用

YourCustomAdapter.swapCursor(FilteredCursor);

【讨论】:

  • 是的,谢谢,这是一个问题“我的Adapter 没有使用过滤过的那个”我明白了。我在自定义 Adaptor 中覆盖了我的 getItem() 并做对了。虽然我没有使用Cursor,但你的方式看起来有点复杂。我是初学者:)
【解决方案3】:

您可以做的是,在您的自定义 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}
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-28
    • 1970-01-01
    • 2021-03-23
    • 2019-02-26
    • 2018-11-24
    相关资源
    最近更新 更多