0

ListView で子要素の状態を親レイアウト (アイテム) と共有するソリューションを探していました。

明示的に必要なのは、セルを押すと、すべての子項目が「pressed_state」になりますが、セル内の特定のボタンを押すと、セル全体も押されます。ただし、android:duplicateParentState="true"後者が機能する必要があるため、android:addStatesFromChildren="true"定義することはできません。

その特定のボタンに onTouchEvent を使用し、プログラムで押された状態をセルに設定し、プレスリリースで解放する必要がありますか?

4

1 に答える 1

0

特定のボタンにonTouchListenerを使用し、xmlandroid:duplicateParentStateでも両方を使用することはありませんでした。android:addStatesFromChildren

CustomExpandableListAdapter で行ったことは次のとおりです。

@Override
public View getGroupView(int groupPosition, boolean isExpanded,
        View convertView, ViewGroup parent) {
    /* code before */
    ImageButton button = (ImageButton) convertViewNotNull.findViewById(R.id.ofButton);
    button.setOnClickListener(onClickListenerInCodeBefore);

    View.OnTouchListener onTouchCell = new View.OnTouchListener() {
                @Override
                public boolean onTouch(View v, MotionEvent event) {
                    final int action = event.getAction();
                    switch (action) {
                        case MotionEvent.ACTION_DOWN:
                            setPressedState(v, true);
                            break;
                        case MotionEvent.ACTION_UP:
                            setPressedState(v, false);
                            v.performClick();
                            break;
                        default:
                            break;
                    }
                    return true;
                }
            };
     button.setOnTouchListener(onTouchCell);
}
// code can be optimized
private void setPressedState(View v, boolean pressed) {
    ViewGroup parent = (ViewGroup) v.getParent();

    final int count = parent.getChildCount();
    for (int i = 0; i < count; i++) {
        View view = parent.getChildAt(i);
        view.setPressed(pressed);
        if (view instanceof RelativeLayout ||
            view instanceof LinearLayout) {
            ViewGroup group = (ViewGroup) view;
            final int size = group.getChildCount();
            for (int j = 0; j < size; j++) {
                View child = group.getChildAt(j);
                child.setPressed(pressed);
            }
        }
    }
}

これで、動作します。

于 2013-09-12T12:54:36.403 に答える