我不知道如何解释这个问题,但我会试试。我有一个包含几个项目的ListView。每个项目都有一个TextView和两个ImageView。我想在单击它们时更改ImageView,并且当我长按ListView项目时,我想打开上下文菜单。
对于ImageView,一切正常。对于整个项目,我可以在长按后显示上下文菜单,但我的问题是,当我按下TextView时,ImageView也会发生变化。
我的代码中的Somo:
ListView项目:
<TextView
android:id="@+id/title"
android:textColor="@color/black"
android:maxLines="2"
android:textSize="14dip"
/>
<ImageView
android:id="@+id/minus"
android:src="@drawable/minusbutton"
android:adjustViewBounds="true"
android:gravity="center"
/>
<ImageView
android:id="@+id/plus"
android:src="@drawable/plusbutton"
android:adjustViewBounds="true"
android:gravity="center"
/>
Drawable可以更改加号按钮的状态:
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_enabled="false"
android:drawable="@drawable/button_add_normal_disabled" />
<item android:state_enabled="true"
android:state_pressed="true"
android:drawable="@drawable/button_add_pressed" />
<item android:state_enabled="true"
android:state_focused="true"
android:state_pressed="false"
android:drawable="@drawable/button_add_active" />
<item android:state_enabled="true"
android:state_focused="false"
android:state_pressed="false"
android:drawable="@drawable/button_add_normal" />
我希望你理解我的问题。我认为一个观点的所有孩子都受到父母的一个事件的影响,但我不确定。
你有解决方案吗?提前致谢
答案 0 :(得分:6)
解决此问题的最简单方法是继承viewgroup并覆盖dispatchSetPressed。
这是一个例子
public class DuplicateParentStateAwareLinearLayout extends LinearLayout {
public DuplicateParentStateAwareLinearLayout(Context context) {
super(context);
}
public DuplicateParentStateAwareLinearLayout(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
public DuplicateParentStateAwareLinearLayout(Context context, AttributeSet attrs) {
super(context, attrs);
}
/*
* By default ViewGroup call setPressed on each child view, this take into account duplicateparentstate parameter
*/
@Override
protected void dispatchSetPressed(boolean pressed) {
for (int i = 0; i < getChildCount(); i++) {
View child = getChildAt(i);
if (child.isDuplicateParentStateEnabled()){
getChildAt(i).setPressed(pressed);
}
}
}
}
使用此方法的catch是您必须为您想要的每个项目和不应该具有此行为的子项设置duplicateparentstate为true。
答案 1 :(得分:3)
我相信正在发生的事情是ListView正在设置项目ViewGroup的状态,并且子项正在复制父项的状态。所以它实际上是state_pressed中的行,并且继承到行内的其他视图。有一个属性android:duplicateParentState="false"
,我认为应该解决这个问题。
答案 2 :(得分:0)
简单且可能不是非常优雅的解决方案 - 为您的图像视图摆脱statefull drawable并在OnItemClickListener()中处理此项目的呈现。我可能会更改适配器中Item的状态,然后适配器中的getView应该根据您的状态放置正确的图像。