3

この問題を説明する方法が正確にはわかりませんが、試してみます。私はいくつかの項目を持つ ListView を持っています。各アイテムの内部には、TextView と 2 つの ImageView があります。それらをクリックすると ImageView が変更され、ListView アイテムを長時間押したときにコンテキスト メニューが開きます。

ImageView の場合、すべてが正常に機能します。アイテム全体について、長押し後にコンテキストメニューを表示できますが、問題は、たとえば TextView を押しているときに ImageView も変化することです。

私のコードのソモ部分:

リストビュー アイテム:

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

私の問題を理解していただければ幸いです。ビューのすべての子は親のイベントの影響を受けると思いますが、よくわかりません。

解決策はありますか?前もって感謝します

4

3 に答える 3

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);
             }
         }
      }
}

このメソッドを使用する際の注意点は、必要な各アイテムと、この動作を持たないサブアイテムに対して、duplicateparentstateをtrueに設定する必要があることです。

于 2012-09-04T17:54:52.693 に答える
3

ListView が項目の ViewGroup の状態を設定しており、子が親の状態を複製していると思われます。したがって、実際には state_pressed にあるのは行であり、行内の他のビューに継承されます。という属性がありandroid:duplicateParentState="false"、それを修正する必要があると思います。

于 2010-06-16T19:28:58.143 に答える
0

簡単であまり洗練されていない解決策 - 画像ビューのステートフル ドローアブルを取り除き、OnItemClickListener() でこのアイテムのプレゼンテーションを処理します。おそらくアダプターのアイテムの状態を変更し、アダプターの getView は状態に応じて正しい画像を配置する必要があります。

于 2010-04-09T14:00:33.487 に答える