之前一直覺得列表的拖拽換位和側滑刪除是很難實現的,不過之後參考了下幾篇博客後發,發現還是很簡單的,因爲suppor早就封裝好了,最主要的是繼承ItemTouchHelper.Callback,並對其方法
效果圖如下:
步驟如下:
1、新建類並繼承ItemTouchHelper.Callback,在其對應方法設置相應操作包括,不同佈局的拖拽和側滑刪除,選擇效果
2、Adapter中實現自定義的監聽回調,對位置交換和刪除動作做對應的數據操作和界面的刷新
3、主代碼中 新建ItemTouchHelper 並關聯RecyclerView即可
代碼如下:
1、新建類並繼承ItemTouchHelper.Callback,在其對應方法設置相應操作
public interface ItemTouchHelperAdapter {
//數據交換
void onItemMove(int fromPosition,int toPosition);
//數據刪除
void onSwiped(int position);
}
public class SimpleItemTouchHelperCallback extends ItemTouchHelper.Callback {
private ItemTouchHelperAdapter mAdapter;
private boolean dragEnabled; //能否拖拽
private boolean swipeEnabled; //能否側滑
public SimpleItemTouchHelperCallback(ItemTouchHelperAdapter adapter, boolean dragEnabled, boolean swipeEnabled) {
mAdapter = adapter;
this.dragEnabled = dragEnabled;
this.swipeEnabled = swipeEnabled;
}
//同來設置 拖拽移動,或移動刪除
@Override
public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
RecyclerView.LayoutManager layoutManager = recyclerView.getLayoutManager();
if (layoutManager instanceof GridLayoutManager) {// GridLayoutManager
// flag如果值是0,相當於這個功能被關閉
int dragFlag = ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT | ItemTouchHelper.UP | ItemTouchHelper.DOWN;
int swipeFlag = 0;
// create make
return makeMovementFlags(dragFlag, swipeFlag);
} else if (layoutManager instanceof LinearLayoutManager) {// linearLayoutManager
LinearLayoutManager linearLayoutManager = (LinearLayoutManager) layoutManager;
int orientation = linearLayoutManager.getOrientation();
int dragFlag = 0;
int swipeFlag = 0;
// 爲了方便理解,相當於分爲橫着的ListView和豎着的ListView
if (orientation == LinearLayoutManager.HORIZONTAL) {// 如果是橫向的佈局
swipeFlag = ItemTouchHelper.UP | ItemTouchHelper.DOWN;
dragFlag = ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT;
} else if (orientation == LinearLayoutManager.VERTICAL) {// 如果是豎向的佈局,相當於ListView
dragFlag = ItemTouchHelper.UP | ItemTouchHelper.DOWN;
swipeFlag = ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT;
}
return makeMovementFlags(dragFlag, swipeFlag);
}
return 0;
}
//是否能拖動
@Override
public boolean isLongPressDragEnabled() {
return dragEnabled;
}
//是否能側滑
@Override
public boolean isItemViewSwipeEnabled() {
return swipeEnabled;
}
//拖動
@Override
public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
Log.e(TAG, "onMove");
// if (viewHolder.getAdapterPosition() == 0) {
//第一個無法拖拽
// return false;
// }
mAdapter.onItemMove(viewHolder.getAdapterPosition(), target.getAdapterPosition());
return true;
}
//左右滑動
@Override
public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
mAdapter.onSwiped(viewHolder.getAdapterPosition());
Log.e(TAG, "onSwiped");
}
//選中項操作
@Override
public void onSelectedChanged(@Nullable RecyclerView.ViewHolder viewHolder, int actionState) {
super.onSelectedChanged(viewHolder, actionState);
Log.e(TAG, "onSelectedChanged");
if (actionState != ItemTouchHelper.ACTION_STATE_IDLE) {
if (viewHolder != null)
viewHolder.itemView.setBackgroundColor(Color.LTGRAY);
}
}
//釋放選中項操作
@Override
public void clearView(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder) {
super.clearView(recyclerView, viewHolder);
Log.e(TAG, "clearView");
viewHolder.itemView.setBackgroundColor(0);
}
}
2、Adapter中實現自定義的監聽回調
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.Holder> implements ItemTouchHelperAdapter {
private Context mContext;
private List<String> mList;
public MyAdapter(Context context, List<String> list) {
mContext = context;
mList = list;
}
@NonNull
@Override
public Holder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
return new Holder(LayoutInflater.from(mContext).inflate(R.layout.item_test, viewGroup, false));
}
@Override
public void onBindViewHolder(@NonNull final Holder holder, final int i) {
holder.tvF.setText(mList.get(i));
holder.tvS.setText(mList.get(i));
holder.delete.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//移除數據
mList.remove(i);
notifyDataSetChanged();
}
});
}
@Override
public int getItemCount() {
return mList.size();
}
@Override
public void onItemMove(int fromPosition, int toPosition) {
//交換位置
Collections.swap(mList, fromPosition, toPosition);
notifyItemMoved(fromPosition, toPosition);
}
@Override
public void onSwiped(int position) {
//移除數據
mList.remove(position);
notifyItemRemoved(position);
}
static class Holder extends RecyclerView.ViewHolder {
private TextView tvF;
private TextView tvS;
private ImageView delete;
public Holder(@NonNull View itemView) {
super(itemView);
tvF = itemView.findViewById(R.id.tv_first);
tvS = itemView.findViewById(R.id.tv_second);
delete = itemView.findViewById(R.id.delete);
}
}
}
3、主代碼中 新建ItemTouchHelper 並關聯RecyclerView
public class MainActivity extends AppCompatActivity {
public static final String TAG = "recyclerviewmove";
private Button btnChange;
private RecyclerView mRecyclerView;
private MyAdapter mMyAdapter;
private List<String> mList = new ArrayList<>();
private boolean bGrid; //佈局標識
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
for (int i = 0; i < 9; i++) {
mList.add(i + "" + i + "" + i);
}
mRecyclerView = findViewById(R.id.recycler_view);
btnChange = findViewById(R.id.btn_change);
mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
mMyAdapter = new MyAdapter(this, mList);
mRecyclerView.setAdapter(mMyAdapter);
//關聯ItemTouchHelper和RecyclerView
ItemTouchHelper.Callback callback = new SimpleItemTouchHelperCallback(mMyAdapter,true,true);
ItemTouchHelper touchHelper = new ItemTouchHelper(callback);
touchHelper.attachToRecyclerView(mRecyclerView);
btnChange.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (bGrid) {
mRecyclerView.setLayoutManager(new LinearLayoutManager(MainActivity.this));
} else {
mRecyclerView.setLayoutManager(new GridLayoutManager(MainActivity.this, 4));
}
bGrid = !bGrid;
}
});
}
}
參考:https://blog.csdn.net/a553181867/article/details/54799391