在Android中从OnClickListener膨胀ListView行?

在Android中从OnClickListener膨胀ListView行?,android,listview,Android,Listview,我有一个类(a_Main.java)扩展了ArrayAdapter。我将我的ListView设置为使用A_Main作为ListAdapter。在A_Main.getView()内部我对视图进行充气,以获得每行的列表视图小部件。每行包含一个文本视图,复选框和一个图像按钮。单击图像按钮时,我播放与文本视图相关联的歌曲。我不想在ListView上使用onItemClickListener() 当我单击新行中的ImageButton时,我需要取消当前播放歌曲的ImageButton,并取消新歌曲的hil

我有一个类(
a_Main.java
)扩展了
ArrayAdapter
。我将我的
ListView
设置为使用
A_Main
作为
ListAdapter
。在
A_Main.getView()内部
我对视图进行充气,以获得每行的
列表视图
小部件。每行包含一个
文本视图
复选框
和一个
图像按钮
。单击
图像按钮
时,我播放与
文本视图
相关联的歌曲。我不想在
ListView
上使用
onItemClickListener()

当我单击新行中的
ImageButton
时,我需要取消当前播放歌曲的
ImageButton
,并取消新歌曲的hilite。我在想这样做的方法是在ImageButton的
onClickListener()
中放大视图,取消列表中的每个按钮,然后hi-lite正在播放的按钮。我不知道最好的办法是什么。当getView()在每个
ImageButton
ID上迭代并直接从
onClickListener()
引用ID时,我是否可以在每个
ImageButton
ID的
a_Main
中保留成员列表,而不会导致内存泄漏?当
getView()
处理完这些ID后,这些ID会立即消失吗?对其他方法有什么想法吗


你应该看看这段视频。尤其是viewholder部件,它可以重用视图并避免内存泄漏。要突出显示listview行按钮,请检查单击的项目的位置,并通过设置按钮的背景来突出显示该按钮。

应查看此视频。尤其是viewholder部件,它可以重用视图并避免内存泄漏。要突出显示listview行按钮,请检查单击的项目的位置,并通过设置按钮的背景来突出显示该按钮。

编辑:

解决方案可能很简单,全局采用布尔数组,如下所示

 private final boolean[] selectedstates;
 yourbutton.setSelected(selectedstates[position]);
 imagPlay.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
             ImageView current=((ImageView)v);
              current.setSelected(true);
              previous.setSelected(false);
              previous=current;
        }
    });
并使用构造函数中列表的大小初始化它

 selectedstates= new boolean[yourlist.size()];
在onclick侦听器的外部设置如下

 private final boolean[] selectedstates;
 yourbutton.setSelected(selectedstates[position]);
 imagPlay.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
             ImageView current=((ImageView)v);
              current.setSelected(true);
              previous.setSelected(false);
              previous=current;
        }
    });
我希望这对你有帮助


试试这个

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

<?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>
在自定义适配器中,并在将获取内容的构造函数中初始化它

previous=new ImageView(context);
在adapter getView()方法中添加Imageview可能会有一个onclickListener 你喜欢这样吗

 private final boolean[] selectedstates;
 yourbutton.setSelected(selectedstates[position]);
 imagPlay.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
             ImageView current=((ImageView)v);
              current.setSelected(true);
              previous.setSelected(false);
              previous=current;
        }
    });
这将起作用,我很自信,因为我已经在我的应用程序中使用了它。我希望这将帮助您编辑:

解决方案可能很简单,全局采用布尔数组,如下所示

 private final boolean[] selectedstates;
 yourbutton.setSelected(selectedstates[position]);
 imagPlay.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
             ImageView current=((ImageView)v);
              current.setSelected(true);
              previous.setSelected(false);
              previous=current;
        }
    });
并使用构造函数中列表的大小初始化它

 selectedstates= new boolean[yourlist.size()];
在onclick侦听器的外部设置如下

 private final boolean[] selectedstates;
 yourbutton.setSelected(selectedstates[position]);
 imagPlay.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
             ImageView current=((ImageView)v);
              current.setSelected(true);
              previous.setSelected(false);
              previous=current;
        }
    });
我希望这对你有帮助


试试这个

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

<?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>
在自定义适配器中,并在将获取内容的构造函数中初始化它

previous=new ImageView(context);
在adapter getView()方法中添加Imageview可能会有一个onclickListener 你喜欢这样吗

 private final boolean[] selectedstates;
 yourbutton.setSelected(selectedstates[position]);
 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()中使用了什么来更正按钮状态?嘿,很抱歉回复得太晚,因为印度是晚上,所以我昨天去睡觉了……我会更新答案……没问题。有趣的我最终实现了与你建议的完全相同的东西。谢谢你的跟进。谢谢!一个很棒的解决方案!经过一些测试后,ListView在滚动时没有正确更新按钮状态。有些按钮显示为选中,但尚未选中。您在getView()中使用了什么来更正按钮状态?嘿,很抱歉回复得太晚,因为印度是晚上,所以我昨天去睡觉了……我会更新答案……没问题。有趣的我最终实现了与你建议的完全相同的东西。谢谢你的关注。谢谢,很棒的视频!我已经实现了它所讨论的ViewHolder类。我一直怀疑持续的findViewById()调用会影响性能,但我从来不知道该怎么办。谢谢,很棒的视频!我已经实现了它所讨论的ViewHolder类。我一直怀疑常量findviewbyd()调用会影响性能,但我从来不知道该怎么办。