2

問題があり、ボタンの動作が異常です。実際には、数量フィールドのプラス (+) とマイナス (-) の 2 つのボタンです。

これらのボタンは ListView 内にあり、OnClickListener を問題なく処理できますが、OnLongClickListener を配置すると... 2 つの異なる ListView に 2 つの問題があります。

1)すべての情報と動作は正常ですが、ボタンをロングクリックすると、値を自動的に増減するハンドラーが開始されますが、フォーカスが制御を失ったため、ボタンを離してもハンドラーは動作しないと思いますやめる。同じ目的でダイアログで同じハンドラーを使用し、正常に機能しました。

2) 別の ListView で、OnLongClickListener を配置すると、いくつかのフィールド (TextView、Spinner) が機能しなくなります。

これが私の Handler です。これは、OnTouchListener と OnLongClickListener に実装されたクラス Repeater です。

public class Repeater implements OnTouchListener, OnLongClickListener{

    private View view; 

    private Repeater other_repeater;

    private int     REP_DELAY = 50; 
    private Handler repeatHandler = new Handler();

    private boolean mAutoRepeater = false;

    public Repeater(){}

    public Repeater(View view){
        this.setView(view);
    }

    @Override
    public boolean onTouch(View v, MotionEvent event) {
        if(( event.getAction() == MotionEvent.ACTION_UP         || 
             event.getAction() == MotionEvent.ACTION_CANCEL     ||
             event.getAction() == MotionEvent.ACTION_HOVER_EXIT ||
             event.getAction() == MotionEvent.ACTION_OUTSIDE)
           && mAutoRepeater ){
            mAutoRepeater = false;
        }
        return false;
    }

    @Override
    public boolean onLongClick(View v) {
        if(getOther_repeater() != null){
            getOther_repeater().stop();
        }
        mAutoRepeater = true;
        repeatHandler.post( new RptUpdater() );
        return false;
    }

    private class RptUpdater implements Runnable {
        public void run() {
            if( mAutoRepeater ){
                getView().performClick();
                repeatHandler.postDelayed( new RptUpdater(), REP_DELAY );
            }
        }
    }

    public void stop(){
        mAutoRepeater = false;
    }

    public void setView(View view) {
        this.view = view;
    }

    public View getView() {
        return view;
    }

    public void setOther_repeater(Repeater other_repeater) {
        this.other_repeater = other_repeater;
    }

    public Repeater getOther_repeater() {
        return other_repeater;
    }
}

ListView ごとに CustomAdapter があり、ほぼ 1000 行あります...その下のコードは、Repeater を設定する場所です。

            Repeater qt_produto_menos_repeater = new Repeater(viewHolder.qt_produto_menos);

            viewHolder.qt_produto_menos.setOnTouchListener    (qt_produto_menos_repeater);
            viewHolder.qt_produto_menos.setOnLongClickListener(qt_produto_menos_repeater);

            Repeater qt_produto_mais_repeater = new Repeater(viewHolder.qt_produto_mais);

            viewHolder.qt_produto_mais.setOnTouchListener    (qt_produto_mais_repeater);
            viewHolder.qt_produto_mais.setOnLongClickListener(qt_produto_mais_repeater);

            qt_produto_menos_repeater.setOther_repeater(qt_produto_mais_repeater);
            qt_produto_mais_repeater.setOther_repeater(qt_produto_menos_repeater);

これは、xml の私の ListView です。

    <ListView
            android:id="@+id/lv_resultado_produtos"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:divider="@color/Black"
            android:dividerHeight="1dip"
            android:fastScrollEnabled="true"
            android:scrollX="0dip"
            android:scrollY="0dip"
            android:scrollbarSize="22dip"
            android:scrollbarStyle="outsideOverlay" 
     />

ボタンの OnClickListener が正常に機能し、OnLongClick が機能しない理由がわかりません。

助けてください、私はこれに数日間立ち往生しています。

[編集]

LongClick は正常に動作しますが、ボタンを離したときにリピーターが「UP」/「CANCEL」アクションを取得できません。OnTouchListener は、すべてのロジックが CustomAdapter 内にある場合でも、ハンドラーを停止するために知る必要があります。これは1つのListView用で、もう1つは他のフィールドに夢中になっていますが、「リリースボタン」の問題を解決できれば幸いです!

[編集2]

最後に、問題を切り分けました。2 番目の ListView でケースを解決しました。すべてのロジックの後で Repeater が呼び出されました。理由はわかりませんが、リストが狂ってしまいます。

そして最初の問題は、notifyDataSetChanged() がすべてを台無しにしているのを発見しました。notify...() が呼び出されるとボタンがフォーカスを失い、リピーターは増加/減少を停止する「コマンド」を取得しません。これを変更することで部分的に解決しました。 :

        if( mAutoRepeater ){
            getView().performClick();
            repeatHandler.postDelayed( new RptUpdater(), REP_DELAY );
        }

これに対して、リピーターで:

        if( view.isPressed() ){
            getView().performClick();
            repeatHandler.postDelayed( new RptUpdater(), REP_DELAY );
        }

したがって、notify...() が呼び出されると、彼は増加/減少を停止しますが、それは私たちが望む動作ではありません。誰かが通知を「遅らせる」ための何かを知っていますか? または、ユーザーがまだボタンを押している場合は、フォーカスをボタンに再度設定します (押したままにします)。

4

1 に答える 1