安卓基礎總結 Demo位址: #1 Introduce ItemTouchHelper是一個處理RecyclerView的滑動删除和拖拽的輔助類,RecyclerView 的item拖拽移動和滑動删除就靠它來實作。 #2 效果圖

#3 關鍵代碼ItemTouchHelper
ItemTouchHelper itemTouchHelper = new ItemTouchHelper(new ItemTouchHelper.Callback() {
@Override
public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
int dragFlags=0,swipeFlags=0;
if(recyclerView.getLayoutManager() instanceof StaggeredGridLayoutManager ||recyclerView.getLayoutManager() instanceof GridLayoutManager){
//網格式布局有4個方向
dragFlags=ItemTouchHelper.UP|ItemTouchHelper.DOWN|ItemTouchHelper.LEFT|ItemTouchHelper.RIGHT;
}else if(recyclerView.getLayoutManager() instanceof LinearLayoutManager){
//線性式布局有2個方向
dragFlags=ItemTouchHelper.UP|ItemTouchHelper.DOWN;
swipeFlags = ItemTouchHelper.START|ItemTouchHelper.END; //設定側滑方向為從兩個方向都可以
}
return makeMovementFlags(dragFlags,swipeFlags);//swipeFlags 為0的話item不滑動
}
@Override
public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
int from=viewHolder.getAdapterPosition();
int to=target.getAdapterPosition();
String moveItem = list.get(from);
list.remove(from);
list.add(to,moveItem);//交換資料連結清單中資料的位置
adapter.notifyItemMoved(from,to);//更新擴充卡中item的位置
return true;
}
@Override
public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
int from=viewHolder.getAdapterPosition();
list.remove(list.get(from));
adapter.notifyItemRemoved(from);
}
@Override
public void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState) {
super.onSelectedChanged(viewHolder, actionState);
if(actionState==ItemTouchHelper.ACTION_STATE_DRAG){
viewHolder.itemView.setBackgroundColor(Color.LTGRAY);//拖拽時設定背景色為灰色
}
}
@Override
public void clearView(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
super.clearView(recyclerView, viewHolder);
viewHolder.itemView.setBackgroundColor(getResources().getColor(R.color.colorPrimary));//拖拽停止時設定背景色為白色
}
@Override
public void onChildDraw(Canvas c, RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState, boolean isCurrentlyActive) {
super.onChildDraw(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive);
//根據item滑動偏移的值修改item透明度。screenwidth是我提前獲得的螢幕寬度
viewHolder.itemView.setAlpha(1-Math.abs(dX)/viewHolder.itemView.getWidth());
}
});
itemTouchHelper.attachToRecyclerView(rv);