3

私は以下のようなリストビューアイテムを持っています

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="60dp"
    android:orientation="horizontal"
    android:descendantFocusability="blocksDescendants"
    >

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        />

    <CheckBox
        android:id="@+id/checkBox1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="@drawable/music_list_item_checkbox_bg"
        />
</LinearLayout>

music_list_item_checkbox_bg.xml異なる状態に応じて異なるドローアブルを表示するセレクターです。

<selector xmlns:android="http://schemas.android.com/apk/res/android" >

    <item 
          android:state_pressed="false"
          android:state_selected="true"
          android:drawable="@drawable/btn_checkbox_check_untapped" />

    <item android:state_selected="true" 
          android:state_pressed="true"
          android:drawable="@drawable/btn_checkbox_check_tapped" />

    <item android:state_selected="false"  
          android:state_pressed="false"
          android:drawable="@drawable/btn_checkbox_uncheck_untapped" />

    <item android:state_selected="false"  
          android:state_pressed="true"
          android:drawable="@drawable/btn_checkbox_uncheck_tapped" />

</selector>

リストビューでアイテムを押して、アイテム内のタッチスクリーンを離れると、異なる状態に応じたドローアブルが右になります。

質問:しかし、アイテムを押して指をアイテムの外に水平に移動し(タッチポイントのXはアイテムの上部と下部の間にあります)、画面を離れると、チェックボックスのドローアブルは次の状態のままになります。押されました。(タッチポイントのXがアイテムの上下から外れている場合、状態は正しいです)。

チェックボックスに追加android:duplicateParentState="true"して親と同じ状態にしようとしましたが、機能しません。

私は混乱しています、誰かがいくつかのアイデアを持っていますか?

編集済み

以前にアイテムにonTouchとonInterceptを実装しようとしましたが、super.onTouch(MotionEvent event)を返す場合にのみ、アクションを受け取ることができます。trueを返すだけで、シーケンスイベントが受信されますが、listviewのonItemClickは機能しませんでした。AbsListviewのonTouchコードスニペットを読んで問題を解決する方法を見つけようとすると、child.setPressed(false)を呼び出しても、child(item)のプレスステータスがfalseにクリアされないことがあります。タッチモード。

私は本当に解決策が欲しいです!!!

4

5 に答える 5

2
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="true" 
         android:drawable="@drawable/btn_checkbox_check_tapped" />
    <item android:state_selected="true" 
         android:drawable="@drawable/btn_checkbox_check_tapped" />
        <item android:drawable="@drawable/btn_checkbox_uncheck_untapped" />
</selector>

これらのセレクターを背景として使用してみてください

于 2012-04-28T04:23:19.540 に答える
1

私は問題を解決しますが、おそらく良い解決策や公式の解決策ではありません。

SDKの代わりに独自のMyListViewクラスextendsfromを使用し、とを受け取り、アイテムのプレス状態を手動でfalseに設定します。以下のコードを参照してください。ListViewListViewACTION_UPACTION_CANCELonTouchEvent

@Override
public boolean onTouchEvent(MotionEvent event)
{
    boolean handled = super.onTouchEvent(event);
    Log.d("test", "event " + event.toString());
    int action = event.getAction();

    switch (action)
    {
    case MotionEvent.ACTION_DOWN:
        m_downPosition = pointToPosition((int)event.getX(), (int)event.getY());
        Log.d("test", "The down position " + m_downPosition);
        break;

    case MotionEvent.ACTION_UP:
    case MotionEvent.ACTION_CANCEL:
        int position = m_downPosition - getFirstVisiblePosition();
        View child = INVALID_POSITION != m_downPosition ? getChildAt(position) : null;
        if (null != child)
        {
            child.setPressed(false);
        }
        break;

    default:
        break;
    }
    return handled;
}
于 2012-05-02T03:38:38.417 に答える
1

その中のビューをフォーカスできないようにしてみてください...

<TextView
    android:id="@+id/textView1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    />

<CheckBox
    android:id="@+id/checkBox1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:background="@drawable/music_list_item_checkbox_bg"
android:focussableInTouchMode="false"
android:focussable="false"
    />

タッチモードでリストアイテムをフォーカス可能にすることはできません...ここでは、チェックボックスがフォーカス可能であるため、問題が発生します...

于 2012-04-24T07:46:34.497 に答える
0

このようなデフォルトのセレクター項目を試してみてください

<item android:drawable="@drawable/btn_checkbox_uncheck_untapped" />

これにより、残りのすべての状態が処理focussedされます。または、xml にない状態を処理するセレクター項目が必要です。

于 2012-04-24T13:31:59.293 に答える
0

アイテムの を拡張し、その中LinearLayoutの をオーバーライドしますonTouch。ACTION_CANCEL イベントを処理し (true を返す)、アイテムの押された状態と選択された状態を更新します。

class ItemLayout extends LinearLayout {

    @override
    boolean onTouch(MotionEvent ev) {
        switch(ev.getAction()) {
            case ACTION_CANCEL: 
                // Update/reset pressed and selected states of item or checbkox
                return true;
        }
        return super.onTouch(ev);
    }

}

http://groups.google.com/group/android-developers/browse_thread/thread/df75c5b8e4605167#を参照してください

それが役立つことを願っています。

<ItemLayout 
  ....>
    <TextView
       ...
       />

    <CheckBox
       ...
       />
</ItemLayout >
于 2012-04-27T04:42:08.943 に答える