【问题标题】:How to use ArrayLists in ListAdapter (ListView)?如何在 ListAdapter (ListView) 中使用 ArrayLists?
【发布时间】:2013-05-23 13:49:03
【问题描述】:

)

我找到了一个关于在 android 中使用 ListView 的教程。但我有一个问题。教程在这里:

http://www.vogella.com/articles/AndroidListView/article.html#listadvanced_interactive

您必须滚动到第 13.2 节。

本教程的想法是一方面你有一个 ListView(每个项目中都有复选框),另一方面你有一个 ArrayList(ArrayList 的项目是对象,其中包含显示在ListView 的项目,例如 CheckBox 检查与否、文本等)。适配器应该保持两者相等。如果你改变了 ArrayList,ListView 也会改变。

但是现在我的问题。如果用户触摸列表中的一项,适配器将调用方法“onCheckedChanged”。但是那里发生了什么?一个对象将在那里创建并从 CheckBox 中获取一个标签。好的。现在方法完成了。垃圾收集器会销毁对象还是不销毁?我什么时候需要在我的活动中从那里获得这些信息。想象一下,我的列表下方有一个“删除”按钮。所以我必须将这些信息从适配器的侦听器传输到我的 Activity。如何确保在每个类中使用相同的 ArrayList 和正确的信息?

        @Override
        public void onCheckedChanged(CompoundButton buttonView,
            boolean isChecked) {
          Model element = (Model) viewHolder.checkbox
              .getTag();
          element.setSelected(buttonView.isChecked());

        }

我希望你明白我的意思。能给我解释一下吗?

对不起,我的母语不是英语。

再见

【问题讨论】:

    标签: android listview listadapter


    【解决方案1】:

    如果我理解您的问题,答案在您提供的教程的第 14.1 章中......

    如果您想在选中删除时进行一些处理,请在 ListView 中添加一个侦听器。

    这些函数通常具有点击位置,您可以在知道点击位置的情况下做任何您想做的事情。例如:

    list.setOnItemLongClickListener(new OnItemLongClickListener() {
    
      @Override
      public boolean onItemLongClick(AdapterView<?> parent, View view,
          int position, long id) {
        Toast.makeText(MyList.this,
            "Item in position " + position + " clicked",
            Toast.LENGTH_LONG).show();
        // Return true to consume the click event. In this case the
        // onListItemClick listener is not called anymore.
        return true;
      }
    });
    

    【讨论】:

    • 感谢您的回答。但在我看来,当 ListActivity 扩展 Activity 时,您只能使用 onItemClickListener。当 ListView 只是布局的一部分时,就不能使用 ListActivity 了,对吧?我的问题是为什么他们在“onCheckedChanged”中创建一个对象,而该对象将在方法结束时销毁并且他们再也不会在代码中使用它?
    • 他们使用变量进行强制转换并使代码更易读...它更容易阅读,而不是 ((Model) viewHolder.checkbox.getTag()) .setSelected(buttonView.isChecked())
    • 而且你可以在每次使用 ListView 时都使用监听器,在我展示的变量列表是 ListView 的情况下...
    【解决方案2】:

    我不完全确定我理解你的问题。里面有很多东西要解压,但我会试一试。要了解发生了什么,您需要了解 ListView 与支持它的数据之间的关系,该数据包含在 ListAdapter 中。

    ListView 显示ListAdapter 中包含的数据。 ListAdapter 从其他来源获取数据,在本例中是您所指的 ArrayList。为什么使用ArrayList?在本教程中,它并不完全清楚,因为该示例使用一组固定的数据(例如操作系统列表),这些数据以字符串形式写出。然而,在实践中,您经常使用动态列表,例如用户列表、地点列表等。

    ArrayList 保存最终将显示的对象。这是教程中的“模型”类。这同样适用于任何其他类别的数据,例如地点列表。如果您将地点想象为一个类,那么该类将包含描述该地点的字段(例如地址、描述、其他一些独特的特征)。当从某个位置下载数据时,将为每个位置创建一个新的地点实例。这些对象将收集在ArrayList 中。下载过程完成后,您将开始将ArrayList 的内容传递给ListAdapter 以便最终可以更新ListView

    你怎么知道你会一直使用正确的ArrayList?因为您的ArrayList 链接到您ListAdapterListAdapter 处理的数据,无论是模型列表还是用户列表,都由ArrayList 提供。你不能使用错误的。 ListAdapter 也是如此。因为您必须设置与ListView 链接的适配器,所以它将始终从正确的源中提取。您不能使用错误的数据。

    如果您密切注意,onCheckChanged 侦听器发生的情况是,用户实际上只是在更新模型类中包含的字段。每个模型都有一个 isChecked 字段。单击该复选框时,该对象的值将被更新。这就是你如何知道什么被检查,什么没有被检查。

    回应:“没有人告诉适配器“嘿,它属于列表,这是你的来源”

    查看ArrayAdapter 的文档 对于ListView

    ArrayAdapter 的构造函数都将一些对象列表作为参数。此列表将是将在 ListView 中显示的对象列表。

    此外,ListView 要求您调用 setAdapter,它需要一些 ListAdapter 作为其参数。这实际上是告诉ListView 它要显示的数据源。

    从这个意义上说,ListListAdapterListView 都链接在一起。

    【讨论】:

    • 非常感谢您的精彩解释。我明白。但是列表连接到适配器的线路在哪里?在活动中,列表被发送到适配器。然后适配器的构造函数将列表写入列表变量“列表”中。就这样。适配器如何知道“那是我的来源”?还是因为超类也获得了列表而在后台发生这种情况?下一个问题:适配器如何知道“元素”属于源“列表”?它是在“onCheckedChanged”方法中生成的一个新对象。
    • 没有人告诉适配器“嘿,它属于列表,这是你的来源”。
    • 我想我现在明白了。他们不会更改“onCheckedChanged”中的列表。他们只修改复选框的标签。那正确吗?无论如何,例如,我的列表对象中有两个信息“标题”和“已检查”。 “标题”从编辑框中获取他的字符串,例如“测试”,当用户按下 OK 按钮时。之后,我的列表中有一个包含“Test”和“0”信息的对象,因为未选中该复选框。现在,我的 ListView 中有一个项目“测试”,在我的手机屏幕上有一个未选中的复选框。在此之后,用户触摸复选框。
    • 现在已激活。将执行 Adapter 中的方法“onCheckedChanged”。我现在如何更新我的列表?
    • 什么意思?更新ListView?请更具体一点,这里有很多列表术语。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-04
    • 2016-03-02
    相关资源
    最近更新 更多