2016-06-30 3 views
0

私はリサイクラービューでOnItemTouchListenerと各行を持ち、このリサイクラーにはonclickイベントのボタンがあります。リサイクラービューのハンドルボタン

ボタンイベントの後の作業は必要ですが、OnItemTouchListenerが機能します。

助けてください。私のコード。 viewholderで

public class RecyclerViewTouchListener implements RecyclerView.OnItemTouchListener { 


private GestureDetector gestureDetector; 
private ClickListener clickListener; 

public RecyclerViewTouchListener(Context context, final RecyclerView recyclerView, final ClickListener clickListener) { 
    this.clickListener=clickListener; 
    gestureDetector=new GestureDetector(new GestureDetector.SimpleOnGestureListener(){ 

     @SuppressWarnings("deprecation") 
     @Override 
     public boolean onSingleTapUp(MotionEvent e) { 
      View child = recyclerView.findChildViewUnder(e.getX(), e.getY()); 
      if (child!=null && clickListener!=null){ 
       clickListener.OnClick(child,recyclerView.getChildPosition(child)); 
      } 
      return true; 
     } 
    }); 
} 

@Override 
public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) { 
    View child = rv.findChildViewUnder(e.getX(), e.getY()); 
    if (child != null && clickListener != null && gestureDetector.onTouchEvent(e)) { 
     //noinspection deprecation 
     clickListener.OnClick(child, rv.getChildPosition(child)); 
    } 
    return false; 
} 

@Override 
public void onTouchEvent(RecyclerView rv, MotionEvent e) { 

} 

@Override 
public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) { 

} 


public static interface ClickListener { 
    void OnClick(View view,int position); 

} 

}

このコード

deleteButton.setOnClickListener(new View.OnClickListener() { 
     @Override public void onClick(View v) { 
      callbacks.removePosition(getAdapterPosition()); 
     } 
    }); 
+1

をしかし、OnItemTouchListenerは動作します。 –

+1

あなたの問題は何ですか?私はそれが何であるか把握できません。 – tim687

+0

@TimCastelijns実感してください。クリックメソッドの実行後、クリックボタンの後にしたい。 onclickメソッドボタンは動作せず、onItemTouchListenerだけが実行されます。 – MansoorJafari

答えて

4

私の真直度のため申し訳ありませんが、すべての最初は、このコードを削除します。あなたはそのような何かを行う必要がありますRecyclerView(活動、フラグメント、カスタムビュー、ビューのカスタムラッパー)と協力どこかに続いて

View.OnClickListener clickListener; 

public void setOnItemClickListener(View.OnClickListener clickListener) { 
    this.clickListener = clickListener; 
} 

@Override 
public final void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { 
    if (onClickListener != null) { 
     holder.itemView.setOnClickListener(clickListener); 
    } 
} 

:次に、あなたのコードのようにスニペットを持つことになり、独自のRecyclerAdapterを作成する必要があります。

List<SomeItem> someItems = getSomeItems();//Receive items for adapter from some place 
MyRecyclerAdapter adapter = new MyRecyclerAdapter(someItems); 
adapter.setOnItemClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      int position = orderListView.getChildAdapterPosition(v); 
      SomeItem item = someItems.get(position); 
      Log.v("CLICKED", "Clicking on item(" + position + ", " + item + ")"); 
     } 
    }); 
recyclerView.setAdapter(adapter); 

いずれかの項目内のボタンをクリックすることについての質問の隣にあります。 はあなたの項目内のViewコンポーネントの参照を保持し、独自のホルダーを定義します。

public static class MyHolder extends RecyclerView.ViewHolder { 
    private final Button deleteButton; 

    public MyHolder(View itemView) { 
     super(itemView); 
     deleteButton = (Button) itemView.findViewById(R.id.delete_button); 
    } 

    public Button getDeleteButton() { 
     return deleteButton; 
    } 
} 

[削除]ボタンのクリックを定義するための独自のintefaceを定義します。たとえば、次のように続いて

public interface OnDeleteButtonItemClickListener { 
    void onDeleteIsClick(View button, int position); 
} 

アダプタにあなたのインターフェースを添付:

View.OnClickListener clickListener; 
OnDeleteButtonItemClickListener deleteButtonListener; 

public void setOnItemClickListener(View.OnClickListener clickListener) { 
    this.clickListener = clickListener; 
} 

public void setDeleteButtonListener(OnDeleteButtonItemClickListener deleteButtonListener) { 
    this.deleteButtonListener= deleteButtonListener; 
} 

@Override 
public final void onBindViewHolder(RecyclerView.ViewHolder holder, final int position) { 
    if (clickListener!= null) { 
     holder.itemView.setOnClickListener(clickListener); 
    } 

    if (deleteButtonListener!= null) { 
     MyHolder myHolder = (MyHolder) holder; 
     myHolder.getDeleteButton().setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      deleteButtonListener.onDeleteIsClick(v, position) 
     } 
    });; 
    } 
} 

そしてあなたはRecyclerViewで動作するあなたの場所、更新:私は、クリックボタンのイベント仕事の後にしたい*

List<SomeItem> someItems = getSomeItems();//Receive items for adapter from some place 
MyRecyclerAdapter adapter = new MyRecyclerAdapter(someItems); 
adapter.setOnItemClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      int position = orderListView.getChildAdapterPosition(v); 
      SomeItem item = someItems.get(position); 
      Log.v("CLICKED", "Clicking on item(" + position + ", " + item + ")"); 
     } 
    }); 
adapter.setDeleteButtonListener(new OnDeleteButtonItemClickListener { 
     @Override 
     public void onDeleteIsClick(View button, int position) { 
      SomeItem item = someItems.get(position); 
      Log.v("CLICKED", "Clicking on delete button of item(" + position + ", " + item + ")"); 
     } 
}); 
recyclerView.setAdapter(adapter); 
関連する問題