3

助けが必要です... :-) ListView 用のカスタム アダプターがあります。項目は TextViews です。すべての TextView で onSingleTap、onFling、およびその他すべてのイベントを処理できるようにしたいと考えています。ただし、onDown イベントのみが機能します。他のすべてはありません!理由がわかりません。TextViews が ListView の一部ではない私の他のアクティビティでは、すべて正常に動作します...

これは私が持っているものです:

public class ListViewAdapter extends BaseAdapter{
 ...
 private GestureDetector txtProductGD;
 private View.OnTouchListener txtProductGL;
 ...

 public ListViewAdapter(Context context, ArrayList<Product> products) {
  ...
  txtProductGL = new View.OnTouchListener() {
   public boolean onTouch(View v, MotionEvent event) {
    txtProductGD = new GestureDetector(new txtProductGestureDetector((TextView) v));

    return txtProductGD.onTouchEvent(event);
   }
  };
  ...
 }

 public View getView(int position, View convertView, ViewGroup parent) {
 ...
 view = inflater.inflate(R.layout.listview_item, null);

 TextView textView = (TextView) view.findViewById(R.id.txtProduct);

 textView.setOnTouchListener(txtProductGL);
 ...
 }

 private class txtProductGestureDetector extends SimpleOnGestureListener {

  private TextView textView;

  public txtProductGestureDetector(TextView textView) {
   this.textView = textView;
  }

  public boolean onDown (MotionEvent e) {
   textView.setText("onDown..."); // IT WORKS!
   return false; 
  }

  public boolean onSingleTapConfirmed (MotionEvent e) {
   textView.setText("onSingleTapConfirmed..."); // IT DOESN'T WORK!
   return false;
  }

  // ALL OTHER METHODS ARE ALSO DON'T WORK!..       
 }                  
}
4

1 に答える 1

0

別の理由でカスタム クラスを使用しているかどうかはわかりませんがtxtProductGestureDetector、特定のビューのメソッドをオーバーライドするだけの場合は、これを試してください。

TextView textView = (TextView) view.findViewById(R.id.txtProduct);
textView.setOnTouchListener(new OnTouchListener() {
    public boolean onTouch(View v, MotionEvent event) {
        switch(event.getAction()) {
            case (MotionEvent.ACTION_DOWN) :
                Log.d(DEBUG_TAG,"Action was DOWN");
                return true;
            case (MotionEvent.ACTION_MOVE) :
                Log.d(DEBUG_TAG,"Action was MOVE");
                return true;
            case (MotionEvent.ACTION_UP) :
                Log.d(DEBUG_TAG,"Action was UP");
                return true;
            case (MotionEvent.ACTION_CANCEL) :
                Log.d(DEBUG_TAG,"Action was CANCEL");
                return true;     
            default : 
                return true;
            }            
        }
});

これはgetViewメソッドに直接配置でき、textView に touchListener を割り当てます。

于 2014-05-22T14:53:54.360 に答える