問題があり、ボタンの動作が異常です。実際には、数量フィールドのプラス (+) とマイナス (-) の 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...() が呼び出されると、彼は増加/減少を停止しますが、それは私たちが望む動作ではありません。誰かが通知を「遅らせる」ための何かを知っていますか? または、ユーザーがまだボタンを押している場合は、フォーカスをボタンに再度設定します (押したままにします)。