【问题标题】:Inflate ListView row from OnClickListener in Android?从 Android 中的 OnClickListener 膨胀 ListView 行?
【发布时间】:2013-03-07 12:54:09
【问题描述】:

我有一个扩展 ArrayAdapter 的课程 (A_Main.java)。我将ListView 设置为使用A_Main,因为它是ListAdapter。在A_Main.getView() 内部,我膨胀视图以获取每行的ListView 小部件。每行包含一个TextViewCheckBox 和一个ImageButton。单击ImageButton 时,我播放与TextView 关联的歌曲。我不想在ListView 上使用onItemClickListener(),因为摸索滚动并开始播放新歌太容易了。

当我单击新行中的ImageButton 时,我需要取消选中当前播放歌曲的ImageButton,然后选中新歌曲。我在想这样做的方法是在 ImageButton 的onClickListener() 中膨胀视图并取消列表中的每个按钮,然后,hi-lite 正在播放的那个。我不确定解决这个问题的最佳方法。我可以在每个ImageButton ID 的A_Main 中保留一个成员列表,因为 getView() 遍历它们并直接从onClickListener() 引用 ID 而不会导致内存泄漏?这些 ID 会在 getView() 处理完后立即消失吗?对替代方法有什么想法吗?

【问题讨论】:

  • 采用可绘制选择器怎么样..?
  • 选择器不会保持状态。它仅对单击/触摸时的按钮动画有用。除非有别的办法?

标签: android listview


【解决方案1】:

编辑:

解决方案可能很简单 像这样全局取布尔数组

 private final boolean[] selectedstates;

并在构造函数中使用列表的大小对其进行初始化

 selectedstates= new boolean[yourlist.size()];

在 onclick 监听器的外面设置这样

 yourbutton.setSelected(selectedstates[position]);

希望对你有帮助


试试这个

采用具有两个不同状态图像的自定义选择器进行选择和非选择

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:drawable="@drawable/pause_button"
          android:state_selected="true" />
    <item android:drawable="@drawable/play_button" />
</selector>

1.创建一个全局变量

Imageview previous; 

在您的自定义适配器中并在您将获取内容的构造函数中对其进行初始化

previous=new ImageView(context);

在您的适配器 getView() 方法中添加您的 Imageview 可能会有一个 onclickListener 这样做

 imagPlay.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
             ImageView current=((ImageView)v);
              current.setSelected(true);
              previous.setSelected(false);
              previous=current;
        }
    });

这会起作用,我很自信,因为我已经在我的应用程序中使用了它。希望对你有帮助

【讨论】:

  • 谢谢!一个很棒的解决方案!
  • 经过一些测试,ListView 在滚动时没有正确更新按钮状态。一些按钮似乎被选中,而这些按钮还没有被选中。您在 getView() 中使用什么来纠正按钮状态?
  • 嘿抱歉回复晚了,印度是晚上所以我昨天去睡觉了...我会更新答案..
  • 没问题。有趣的!我最终实施了您建议的完全相同的事情。感谢您的跟进。
【解决方案2】:

应该看看这个视频。 http://www.youtube.com/watch?v=wDBM6wVEO70。特别是 viewholder 部分可以重用视图并避免内存泄漏。要突出显示列表视图行按钮,请检查您单击的项目的位置,并通过为按钮设置背景来突出显示按钮。

【讨论】:

  • 谢谢,很棒的视频!我已经实现了它谈到的 ViewHolder 类。我一直怀疑不断的 findViewById() 调用会影响性能,但我不知道该怎么做。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-27
  • 1970-01-01
  • 1970-01-01
  • 2016-01-09
相关资源
最近更新 更多