Нажмите в элементе ListView изменить статус элементов внутри элемента? - PullRequest
3 голосов
/ 09 апреля 2010

Я не знаю точно, как объяснить эту проблему, но я попробую. У меня есть ListView с несколькими элементами. Каждый элемент имеет внутри TextView и два ImageView. Я хочу изменить ImageView, когда я нажимаю на них, и я хочу открыть контекстное меню, когда я долго нажимаю на элемент ListView.

Для ImageView все работает правильно. Для всего элемента я могу показать контекстное меню после долгого нажатия, но моя проблема в том, что ImageView также меняется, когда я нажимаю, например, TextView.

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"
    />

Можно изменить, чтобы изменить статус кнопки «плюс»:

<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" />

Надеюсь, вы понимаете мою проблему. Я думаю, что все дочерние элементы представления затронуты событием в родительском элементе, но я не уверен.

У вас есть решение? Заранее спасибо

Ответы [ 3 ]

6 голосов
/ 04 сентября 2012

Самый простой способ решить эту проблему - унаследовать группу просмотра и переопределить 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);
             }
         }
      }
}

Смысл использования этого метода заключается в том, что вам придется установить для duplicateparentstate значение true для каждого элемента, который вы хотите, и подпунктов, которые не должны иметь такого поведения.

3 голосов
/ 16 июня 2010

Я считаю, что происходит то, что ListView устанавливает состояние ViewGroup элемента, а потомки дублируют состояние родителя. Так что на самом деле строка находится в state_pressed, и она наследуется другим представлениям внутри строки. Есть атрибут android:duplicateParentState="false", который, я думаю, должен это исправить.

0 голосов
/ 09 апреля 2010

Простое и, возможно, не очень элегантное решение - избавьтесь от полностью нарисованного для вас представления изображения и обработайте представление этого элемента в OnItemClickListener (). Я бы, вероятно, изменил бы состояние Item в адаптере, а затем getView в адаптере должен поместить правильное изображение в зависимости от вашего состояния.

...