从项目中封装了一个拖拽RecyclerView的Demo,主要基于SDK提供了提供了一个类:ItemTouchHelper 。所有RecyclerView Item上下左右拖动,滑动删除均可以利用这个ItemTouchHelper实现。先上效果动图:
这个简书:https://www.jianshu.com/p/4fd325786061,已经把函数功能讲解的很清楚了,这个Demo就是在这个文章的讲解基础上理解并封成的。Demo代码核心是,要自定义类实现ItemTouchHelper.Callback这个回调处理类,然后重写onMove这个移动处理回调函数。Demo已上传:https://download.csdn.net/download/crystal_xing/11259188
源码如下,重要的地方都添加了详细的注释:
MainActivity:
package com.example.draglist;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.helper.ItemTouchHelper;
import android.util.Log;
import com.example.draglist.adapter.StationListAdapter;
import com.example.draglist.bean.Station;
import com.example.draglist.helper.ItemTouchHelperCallback;
import com.example.draglist.helper.OnStartDragListener;
import java.util.ArrayList;
import java.util.List;
/**
* Created by xjc on 2019/6/25.
*/
public class MainActivity extends AppCompatActivity implements OnStartDragListener {
private ItemTouchHelper mItemTouchHelper;
private RecyclerView mMyStationList;
private StationListAdapter mAdapter;
private List<Station> mStationList = new ArrayList<>();
LinearLayoutManager layoutManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
setUpList();
}
private void initView() {
mAdapter = getAdapter();
mMyStationList = findViewById(R.id.my_station_list);
layoutManager = new LinearLayoutManager(this);
mMyStationList.setNestedScrollingEnabled(false);
mMyStationList.setAdapter(mAdapter);
mMyStationList.setLayoutManager(layoutManager);
ItemTouchHelper.Callback callback = new ItemTouchHelperCallback(mAdapter);
mItemTouchHelper = new ItemTouchHelper(callback);
mItemTouchHelper.attachToRecyclerView(mMyStationList);
}
private void setUpList() {
falseData();
setStationData(mStationList);
}
private StationListAdapter getAdapter() {
if (mAdapter == null) {
mAdapter = new StationListAdapter(this, this, false);
}
mAdapter.setOnItemClickListener((view, position, data) -> {
Log.d("click", "click item");
});
return mAdapter;
}
private void setStationData(List<Station> stationList) {
mStationList = stationList;
mAdapter.setDataList(stationList);
mAdapter.notifyDataSetChanged();
}
@Override
public void onStartDrag(RecyclerView.ViewHolder viewHolder) {
mItemTouchHelper.startDrag(viewHolder);
}
//假数据
private void falseData() {
Station b1 = new Station();
b1.setStationName("国际会议中心");
b1.setStationNo("76");
mStationList.add(b1);
Station b2 = new Station();
b2.setStationName("友好广场");
b2.setStationNo("77");
mStationList.add(b2);
Station b3 = new Station();
b3.setStationName("儿童医院");
b3.setStationNo("78");
mStationList.add(b3);
Station b4 = new Station();
b4.setStationName("一二九街");
b4.setStationNo("79");
mStationList.add(b4);
Station b5 = new Station();
b5.setStationName("人民广场");
b5.setStationNo("80");
mStationList.add(b5);
Station b6 = new Station();
b6.setStationName("奥林匹克");
b6.setStationNo("81");
mStationList.add(b6);
Station b7 = new Station();
b7.setStationName("太原街");
b7.setStationNo("82");
mStationList.add(b7);
Station b8 = new Station();
b8.setStationName("幸福一家");
b8.setStationNo("83");
mStationList.add(b8);
Station b9 = new Station();
b9.setStationName("星海广场");
b