2011-07-06 9 views
0

MyアクティビティはOnTouchListenerを実装し、その中に1つのListViewを持ちます。 ユーザーがListViewをタッチすると、ClickEventをOnItemClickListenerハンドラを持つListViewにディスパッチする必要があります。ディスパッチListView toアクティビティが実装されているときの表示OnTOuchListener

どうすればいいですか?

編集:リストビューの

各リスト項目はonTouchEventハンドラを持っています。 ListViewにはonItemClickハンドラがあります。

@Override 
    public boolean onTouch(View view, MotionEvent event) { 
     float actionUpX; 

     switch(event.getAction()){ 

     case MotionEvent.ACTION_DOWN: 
      actionDownX = event.getX(); 
      break; 

     case MotionEvent.ACTION_UP: 
      actionUpX = event.getX(); 

      mFlipper = (ViewFlipper) view.findViewById(R.id.view_listitem_flipper); 


      if(actionDownX < actionUpX){ 
       // |---> 
       mFlipper.showNext();     
      } else if(actionDownX > actionUpX){ 
       // <---| 
       mFlipper.showPrevious(); 
      } else { 
        //Click 
        //Need to dispatch itemClickEvent to ListView 

        //view.performClick(); this line causes StackOverflowException 
        } 
      break; 
     } 
     return true; 
    } 

@Override 
public void onItemClick(AdapterView<?> parent, View view, int position, 
     long id) { 
    //Need do an action using position of view 

} 

マイリスト項目がViewFlipper、ときに、ユーザーのタッチとドラッグアイテムで、ViewFlipperは showNextまたはShowPreviousとシングルクリックを行う必要があるかもしれない、あなたの活動を実装する必要はありませんonItemClick

答えて

2

あなたは、リスト内の項目をクリックすることができるようにしたいと何かを持っているあなたは、次のような何かをする必要が起こる場合:

public class YourClass extends ListActivity { 
    //Your Variables 
    ArrayList<Type> yourlist; 
    YourAdapterClass adapter; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     yourlist = new ArrayList<Type>(); 
     this.adapter = new YourAdapterClass(this, R.layout.row, yourlist); 
     setListAdapter(this.adapter); 

     //you might be able to see if the below works instead of overriding 
     //the OnListItemClickListener farther below 
     ListView lv = getListView(); 

     lv.setOnItemClickListener(new OnItemClickListener() { 
      public void onItemClick(AdapterView<?> parent, View view, 
            int position, long id) { 
       Log.i("testy", "I Clicked on Row " + position + " and it worked!"); 
      } 
     }); 
    } 

    @Override 
    /** 
    * When the user selects an item in the list, do an action 
    * @param ListView l 
    * @param View v 
    * @param int position 
    * @param long id 
    */ 
    protected void onListItemClick(ListView l, View v, int position, long id) { 
     super.onListItemClick(l, v, position, id); 

     final int index = position; 

     //You can add whatever you want to happen when you click here 

     Log.i("testy", "I Clicked on Row " + index + " and this overriding worked!"); 

    } 

//other methods can go here for you list 


} 

あなたはまた私の私の例では(アダプタクラスが必要になりますアダプタクラスはYourAdapterClassと呼ばれている)あなたはこのプライベートクラスごListActivtyまたは完全に新しいクラスで、独自のJavaファイルに次のようにすることができ、次のいずれか

public class YourAdapterClass extends ArrayAdapter { 
     protected ArrayList items; 

     public YourAdapterClass(Context context, int textViewResourceId, ArrayList items) { 
      super(context, textViewResourceId, items); 
      this.items = items; 
     } 

     @Override 
     public View getView(int position, View convertView, ViewGroup parent) { 
      View v = convertView; 

      if(v == null) { 
       LayoutInflater vi = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
       v = vi.inflate(R.layout.row, null); 
      } 

      //do stuff to your list view row if it is a custom row with multiple 
      //components like text views, image views etc. 

      return v; 


     } 
} 

通常このようにカスタムリストビューのために使用されます(カスタムとリスト行を作ったが、あなたはn通常の表示にも使用してください)

これは、少なくとも正しい方向に進むのに役立ちます。

Good Luck。

(これは私は基本的にこの1 Custom ListVIew and onclickに似た別のスレッドのために与えた答えだった)

+0

[OK]をクリックします。しかし、私のlistVewの各項目にはonTouchEventListenerがあります。したがって、ユーザーがクリック(ドラッグしない)すると、onListItemClickを呼び出す必要があります。 Ty – Rodrigo

+0

私はonTouchEventListenerを使用したくないと思うのですが、これはマップビューのためのもので、リストを持っていてユーザーがリスト項目に触れると技術的に「クリック」するので使いたいですonClick関連のもの。私はそれが少し混乱していることがわかっていますが、私はあなたがあなたのリストビューのonTouchEventListenerを持ってはいけないと思うときは、ユーザーがクリックonListItemClickを呼び出す必要があり、あなたはあなたが望むアクションを行うことができるはずです。また、リスト行にフォーカスまたはクリック可能な項目がないことを確認してください。そうしないと、onListItemClickが機能しないように見えます。 – Wolfcow

+0

したがって、私はlistItemのための2つの振る舞いを実装する必要があります:1 - クリック(別のアクティビティに切り替える)。 2 - drag(viewFlipperはアイテムの2番目のレイアウトを表示し、それぞれが異なる活動をする4つのボタンを表示します。 – Rodrigo

0

によって処理しなければなりませんOnTouchListener? ListViewでtouchイベントを処理させるだけです。それがあなたに合っていない場合は、処理する前にタッチイベントをスーパークラスに渡すことを検討してください。イベントを正しくディスパッチするか、誰もそれを処理しなかったかどうかを教えてください。

関連する問題