본문

160405A(화)

Drag and Swipe with RecyclerView


ItemTouchHelper

매우 강력한 유틸리티

drag & drop 

swipe-to-dismiss


ItemTouchHelper.Callback

interface

move 와 swipe 이벤트를 listen





이렇게 Callback 클래스를 만들어서 사용한다.

public class ActiconSettingTouchHelper extends ItemTouchHelper.SimpleCallback {
private ActiconSettingRecyclerViewAdapter mAdapter;

public ActiconSettingTouchHelper(ActiconSettingRecyclerViewAdapter adapter) {
super(ItemTouchHelper.UP | ItemTouchHelper.DOWN, ItemTouchHelper.DOWN | ItemTouchHelper.UP);
this.mAdapter = adapter;
}

@Override
public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
mAdapter.swap(viewHolder.getAdapterPosition(), target.getAdapterPosition());

return true;
}

@Override
public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {

}

@Override
public boolean isLongPressDragEnabled() {
return false;
}

@Override
public boolean isItemViewSwipeEnabled() {
return false;
}





롱클릭이 아니라 특정 뷰에 대해서 drag되게 하려면 interface를 Adapter에 선언하여 Activity나 Fragment에 전달한다.

public void swap(int firstPosition, int secondPosition) {
Collections.swap(mActiconGroupList, firstPosition, secondPosition);
notifyItemMoved(firstPosition, secondPosition);
}

public interface onDragStartListener {
void onDragStarted(RecyclerView.ViewHolder viewHolder);
}
@Override
public void onBindViewHolder(final ActiconSettingRecyclerViewHolder holder, int position) {
ActiconGroupData data = mActiconGroupList.get(position);
downloadImage(data, holder.mActiconThumb);

holder.mActiconName.setText(mActiconGroupList.get(position).productNm);

holder.mActiconDragLayout.setOnTouchListener(new View.OnTouchListener() {

@Override
public boolean onTouch(View v, MotionEvent event) {
if (MotionEventCompat.getActionMasked(event) == MotionEvent.ACTION_DOWN) {
mDragStartListener.onDragStarted(holder);
}

return false;
}
});
}





Activity에서는 다음과 같이 선언하여 attach한다.

private void setItemTouchHelper() {
callback = new ActiconSettingTouchHelper(mSettingAdapter);
helper = new ItemTouchHelper(callback);
helper.attachToRecyclerView(mRecyclerView);
}

@Override
public void onDragStarted(RecyclerView.ViewHolder viewHolder) {
helper.startDrag(viewHolder);
}

























'Mobile > Android' 카테고리의 다른 글

160405A(화)  (0) 2016.04.05
160405A(화)  (0) 2016.04.05
160404A(월)  (0) 2016.04.04
160331A(목)  (0) 2016.03.31
160330A(수)  (1) 2016.03.30

공유

댓글