Android自定义ArrayAdapter |在ImageView上更改图标点击

问题描述:

我有一个使用由文本视图和图像视图组成的自定义布局的元素列表。为此,我遵循像解释here的ViewHolder模式。图像视图显示两个图标中的一个,我想更改点击的图像视图的图标。Android自定义ArrayAdapter |在ImageView上更改图标点击

所以我的第一种方法是定义在我的适配器类的覆盖的getView函数的ImageViews的点击监听器。问题是当第一个ImageView的图标发生变化时,我向下滚动到最后一个图标也发生了变化。 This question here没有帮助。

Here我发现,它不是以处理getView功能点击的最佳方法,但它更好地做到这一点在listView.setOnItemClickListener。我试过了,但我无法确定是否单击了ImageView,因为父类对象包含列表项和视图参数包含ImageView的LinearLayout(即使直接点击ImageView的)。因为它建议here没有帮助,所以设置外部LinearLayout的android:focusable="false"

我确定有人一定有这个问题/用例,但我无法找到解决方案。那么,在我的custon列表项目视图中处理ImageView点击的最佳方法是什么?

+0

当你点击图像视图时,你应该有第二个图标。如果再次点击,第一个图标会出现? – Karim

尝试添加下列属性的可点击的ImageView,而不是它的ViewGroup,您的LinearLayout:

android:focusable="false" 
android:focusableInTouchMode="false" 

...只要在AdapterView/ListView/RecyclerView中更新UI,您应该充分利用一个int标志来跟踪被单击的列表项的位置,然后将其设置为条件语句在invok之前的getView()因为“所有其他”行将被更新,尤其是在100行的列表中。

我实际上在类似的问题herehere中回答了这个问题。

+1

谢谢,我得到它的工作。事实上,值_focusable_和_focusableInTouchMode_没有什么区别。我在我的'Adapter'类中创建了一个私有变量,它用暂停图标存储图像的位置。在'draw'方法中,我区分'draw'方法的位置等于暂停图标的位置以设置正确图标的情况。 [Here](https://*.com/a/16453443)我发现了一些建议,指派OnClickListener具有良好的性能。 – Patrick

如果你有两个图标,你可以简单地把一个自定义的复选框而不是imageview的:

<CheckBox 

      android:id="@+id/customchechecbox" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:background="@drawable/checkbox_selector" 
      android:button="@android:color/transparent" /> 


checkbox_selector : 

<?xml version="1.0" encoding="utf-8"?> 
<selector xmlns:android="http://schemas.android.com/apk/res/android" > 
    <item android:drawable="@drawable/checkbox" 
      android:state_checked="false"/> 
    <item android:drawable="@drawable/checkboxselected" 
      android:state_checked="true"/> 
    <item android:drawable="@drawable/checkbox"/>  
</selector> 
+1

我看到你的方法的重点,但把它看作是一个“棘手的解决方法”,这就是为什么我遵循@DaveNOTDavid的建议。 – Patrick