2013-03-06 68 views
0

我有一个课程(A_Main.java)延伸ArrayAdapter。我将我的ListView设置为使用A_Main,因为它的ListAdapter。在A_Main.getView()里面,我膨胀视图以获得每行的ListView小部件。每行包含一个TextView,CheckBox和一个ImageButton。点击ImageButton时,播放与TextView相关的歌曲。我不想在ListView上使用onItemClickListener(),因为它太容易摸索滚动并开始播放新歌。从Android中的OnClickListener充气ListView行?

当我在新行中单击ImageButton时,我需要取消当前正在播放的歌曲的ImageButton,并将hilite放入新的。我想这样做的方式是在ImageButton的onClickListener()中增加视图,并在列表中单击每个按钮,然后是hi-lite中正在播放的按钮。我不确定最好的方式去做这件事。我可以保留每个ImageButton ID的A_Main的成员列表,因为getView()遍历它们并直接从onClickListener()引用ID而不会导致内存泄漏?只要getView()与他们完成这些ID是否消失?任何想法的替代方法?

enter image description here

+0

怎么样拿一个可绘制的选择器..? – Pragnani 2013-03-06 17:28:30

+0

选择器不会保持状态。它只对点击/触摸时的按钮动画有用。除非有另一种方式? – wufoo 2013-03-06 17:33:08

+0

检查我的答案... – Pragnani 2013-03-06 17:43:59

回答

2

编辑:

解决方案可能是简单的以布尔数组全球这样

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; 

in您的自定义适配器和初始化它在构造函数中,你会得到内容

previous=new ImageView(context); 

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

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

这会工作,我有信心,因为我已经在我的应用程序中使用它。我希望这会帮助你

+0

谢谢!一个很棒的解决方案! – wufoo 2013-03-06 18:31:40

+0

经过一些测试后,ListView在滚动时不会正确更新按钮状态。某些按钮出现在选中的那些按钮上。你在getView()中使用什么来纠正按钮状态? – wufoo 2013-03-06 18:46:47

+0

嘿,对不起,迟到的回复,这是在印度的夜晚,所以我昨天去睡觉...我会更新回答.. – Pragnani 2013-03-07 04:48:56

1

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

+0

谢谢,伟大的视频!我已经实现了它所谈论的ViewHolder类。我总是怀疑不断findViewById()调用是一个性能问题,但从来不知道该怎么做。 – wufoo 2013-03-06 18:32:48