6

別の Stackoverflow の質問を拡張して、リストビュー (FrameLayout にある) の行がいつスワイプされたかを検出できるように、いくつかのジェスチャ検出コードを実装しました。アダプターから個々の行/ビューを取得する方法について、Damian here による質問/回答に従いました。 リストビューの行の位置 (画面上) を取得する方法

onFling に行のビューを取得するコードがあり、xml レイアウトで非表示に設定されている削除ボタンを表示しようとします。ただし、これは起こりません。スワイプでリストビューにボタンを表示するにはどうすればよいですか?

class MyGestureDetector extends SimpleOnGestureListener {
    @Override
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
            float velocityY) {
        try {

            if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE
                    && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
                int itemId = MyClass.this.lv.pointToPosition(
                        (int) e1.getX(), (int) e1.getY());

                Log.v("item id", String.valueOf(itemId));
                View v = MyClass.this.adapter
                        .getViewOnScreen(itemId);
                Button delete = (Button) v.findViewById(R.id.button_delete);

                delete.setVisibility(View.VISIBLE);
                //MyClass.this.adapter.notifyDataSetChanged();


            }

        } catch (Exception e) {
            // nothing
        }
        return false;
    }
}

私のリスト アダプター コードは、参照されている質問と同じです。

編集: リストビューで getChildAt() を使用して行のビューを取得しようとしましたが、これは画面が 1 つ以下のアイテムの場合に機能しますが、間違ったビュー以上のものがある場合は間違ったビューが返され、間違った削除ボタンが表示されます。

編集2:ここでの質問の回答を使用して、機能させました:

4

1 に答える 1

9

私は自分のアプリにこのようなものを一度実装しました。私のやり方:

public class MyGestureDetector extends SimpleOnGestureListener {
    private ListView list;

    public MyGestureDetector(ListView list) {
        this.list = list;
    }

    //CONDITIONS ARE TYPICALLY VELOCITY OR DISTANCE    
    @Override
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
        if (INSERT_CONDITIONS_HERE)
            if (showDeleteButton(e1))
                return true;
        return super.onFling(e1, e2, velocityX, velocityY);
    }

    private boolean showDeleteButton(MotionEvent e1) {
        int pos = list.pointToPosition((int)e1.getX(), (int)e1.getY());
        return showDeleteButton(pos);
    }

    private boolean showDeleteButton(int pos) {
        View child = list.getChildAt(pos);
        if (child != null){
            Button delete = (Button) child.findViewById(R.id.delete_button_id);
            if (delete != null)
                if (delete.getVisibility() == View.INVISIBLE)
                    delete.setVisibility(View.VISIBLE);
                else
                    delete.setVisibility(View.INVISIBLE);
            return true;
        }
        return false;
    }
}

これは私にとってはうまくいきました、あなたがそれを機能させるか、少なくともあなたにいくつかのヒントを与えることを願っています。

于 2012-10-04T17:47:42.133 に答える