2015-01-14 2 views
11

Android에서 RecyclerView를 사용하기 시작했습니다. 어댑터에 터치 리스너를 구현하기 전까지는 문제가 없습니다. 이 주제에서RecyclerView의 OnLongItemClick

: 내가 제대로 childview에 대한 리스너를 구현할 수

https://stackoverflow.com/a/26826692/2923403

. 그러나 OnItemClick과 OnItemLongClick을 모두 구현하고 싶습니다. 그런 다음 문제가 나타납니다. 그들은 항상 동시에 해고됩니다. 먼저 OnItemClick 및 OnItemLongClick 나중에 내 함수를 쓸모 렌더링합니다. 여기

는 (푸 아드에 위의 코드를 기반으로, 감사) 내 사용자 정의 리스너에 대한 코드입니다

public class RecyclerItemClickListener implements RecyclerView.OnItemTouchListener { 
private OnItemClickListener mListener; 

public static interface OnItemClickListener { 
    public boolean onItemClick(View view, int position); 

    public void onItemLongClick(View view, int position); 
} 

GestureDetector mGestureDetector; 

public RecyclerItemClickListener(Context context, final RecyclerView recyclerView, OnItemClickListener listener) { 
    mListener = listener; 
    mGestureDetector = new GestureDetector(context, new GestureDetector.SimpleOnGestureListener() { 
     @Override 
     public boolean onSingleTapUp(MotionEvent e) { 
      return true; 
     } 

     @Override 
     public void onLongPress(MotionEvent e) { 
      View childView = recyclerView.findChildViewUnder(e.getX(), e.getY()); 

      if (childView != null && mListener != null) { 
       mListener.onItemLongClick(childView, recyclerView.getChildPosition(childView)); 
      } 
     } 

    }); 
} 

@Override 
public boolean onInterceptTouchEvent(RecyclerView view, MotionEvent e) { 

    View childView = view.findChildViewUnder(e.getX(), e.getY()); 
    if (childView != null && mListener != null && mGestureDetector.onTouchEvent(e)) { 
     mListener.onItemClick(childView, view.getChildPosition(childView)); 
     return true; 
    } 
    return false; 
} 

@Override 
public void onTouchEvent(RecyclerView view, MotionEvent motionEvent) { 
} 

그리고 구현을 위해 :

mRecyclerView.addOnItemTouchListener(new RecyclerItemClickListener(getActivity(), mRecyclerView, new RecyclerItemClickListener.OnItemClickListener() { 
@Override 
public boolean onItemClick(View view, int position) { 
//This is fired 1st 
} 
@Override 
public void onItemLongClick(View view, int position) { 
//This comes later 
})); 

가 있습니까 당신은 그것에 대해 어떤 해결책을 가지고 있습니다 ?

답변

24

당신은 사용자 정의 어댑터 구현에 청취자를 추가 할 수 있습니다. 그것은 다음과 같습니다 :

public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.ViewHolder> { 

    public interface OnItemClickListener { 
     public void onItemClicked(int position); 
    } 

    public interface OnItemLongClickListener { 
     public boolean onItemLongClicked(int position); 
    } 

    private Fragment mFragment; 

    public static class ViewHolder extends RecyclerView.ViewHolder { 
     public View v; 

     public ViewHolder(View v) { 
      super(v); 
      this.v = v; 
     } 
    } 

    public RecyclerViewAdapter(Fragment fragment) { 
     mFragment = fragment; 
    } 

    @Override 
    public void onBindViewHolder(ViewHolder holder, final int position) { 
     holder.v.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       mFragment.onItemClicked(position); 
      } 
     }); 
     holder.v.setOnLongClickListener(new View.OnLongClickListener() { 
      @Override 
      public boolean onLongClick(View v) { 
       mFragment.onItemLongClicked(position); 
       return true; 
      } 
     }); 
    } 
    . . . 
} 

인터페이스 정의는 처음에 유의하십시오. 이렇게하면 처리를 위해 onClick 및 onLongClick 이벤트를 조각에 전달할 수 있습니다. 거의 편리합니다, 당신은

+0

Hi.It 여전히 당신이 당신의 재활용보기에서 (사용 안 함) onTouch 리스너를 제거 했 내 경우 – Souris

+0

에 동시에 발사 두 이벤트처럼 보인다 알아? 너는 필요 없어. 액티비티 나 프래그먼트에서'RecyclerViewAdapter.OnItemClickListener'와'RecyclerViewAdapter.OnItemLongClickListener'를 구현하고 각각의 인터페이스 메쏘드를 오버라이드하면됩니다 –

+0

고마워요. 그것은 작동합니다. 나는 해결책을 받아 들였다. : D – Souris

관련 문제