之前有写过这个adapter,对于item有点简单的的变化,并且加了长按拖拽事件
- 效果图
- 长按拖拽后
主要代码
ItemTouchHelper.Callback callback=new ItemTouchHelper.Callback() {
@Override
public int getMovementFlags(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder) {
//监控上下左右
int swipFlag = 0;//ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT
int dragflag = ItemTouchHelper.UP | ItemTouchHelper.DOWN;
return makeMovementFlags(dragflag,swipFlag);
}
//移动的处理
@Override
public boolean onMove(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, @NonNull RecyclerView.ViewHolder target) {
recyclerAdapter.notifyItemMoved(viewHolder.getAdapterPosition(),target.getAdapterPosition());
Collections.swap(personList,viewHolder.getAdapterPosition(),target.getAdapterPosition());
return true;
}
@Override
public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int direction) {
//主要是做左右拖动的回调
}
@Override
public boolean canDropOver(RecyclerView recyclerView, RecyclerView.ViewHolder current, RecyclerView.ViewHolder target) {
//当前item可以被拖动到目标位置后,直接落到target上,后面的item也接着落
return true;
}
@Override
public boolean isLongPressDragEnabled() {
//是否开启长按拖动
//返回true 可以实现长按拖动排序和拖动动画
return true;
}
};
}
适配器
public class RecyclerAdapter extends RecyclerView.Adapter<RecyclerAdapter.ViewHolder> {
private List<Person> PersonList;
public RecyclerAdapter(List<Person> PersonList)
{
this.PersonList = PersonList;
}
@NonNull
@Override
public RecyclerAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.item, parent, false);
ViewHolder viewHolder = new ViewHolder(itemView);
return viewHolder;
}
@Override
public void onBindViewHolder(@NonNull RecyclerAdapter.ViewHolder holder, int position) {
holder.id.setText(String.valueOf(PersonList.get(position).getId()));
holder.name.setText(PersonList.get(position).getName());
holder.action.setText(PersonList.get(position).getAction());
}
@Override
public int getItemCount() {
return PersonList.size();
}
class ViewHolder extends RecyclerView.ViewHolder {
TextView id;
TextView name;
TextView action;
public ViewHolder(@NonNull View itemView)
{
super(itemView);
this.id= itemView.findViewById(R.id.tv_id);
this.name= itemView.findViewById(R.id.tv_name);
this.action= itemView.findViewById(R.id.tv_action);
}
}
}
- item.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="10dp"
android:orientation="horizontal"
android:weightSum="3">
<TextView
android:layout_marginStart="50dp"
android:id="@+id/tv_id"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
android:text="1" />
<TextView
android:id="@+id/tv_name"
android:layout_marginStart="120dp"
android:layout_toEndOf="@+id/tv_id"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
android:text="admin" />
<TextView
android:layout_alignParentRight="true"
android:layout_marginEnd="50dp"
android:id="@+id/tv_action"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
android:text="敲代码" />
<View
android:layout_below="@+id/tv_name"
android:background="@color/black"
android:layout_width="match_parent"
android:layout_height="2dp"/>
</RelativeLayout>
- MainActivity
public class MainActivity extends AppCompatActivity {
private RecyclerView recyclerView;
private RecyclerAdapter recyclerAdapter;
private List<Person> personList;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initData();
initView();
//点击长按滑动
onclick();
}
//点击长按滑动
private void onclick() {
ItemTouchHelper.Callback callback=new ItemTouchHelper.Callback() {
@Override
public int getMovementFlags(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder) {
//监控上下左右
int swipFlag = 0;//ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT
int dragflag = ItemTouchHelper.UP | ItemTouchHelper.DOWN;
return makeMovementFlags(dragflag,swipFlag);
}
//移动的处理
@Override
public boolean onMove(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, @NonNull RecyclerView.ViewHolder target) {
recyclerAdapter.notifyItemMoved(viewHolder.getAdapterPosition(),target.getAdapterPosition());
Collections.swap(personList,viewHolder.getAdapterPosition(),target.getAdapterPosition());
return true;
}
@Override
public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int direction) {
//主要是做左右拖动的回调
}
@Override
public boolean canDropOver(RecyclerView recyclerView, RecyclerView.ViewHolder current, RecyclerView.ViewHolder target) {
//当前item可以被拖动到目标位置后,直接落到target上,后面的item也接着落
return true;
}
@Override
public boolean isLongPressDragEnabled() {
//是否开启长按拖动
//返回true 可以实现长按拖动排序和拖动动画
return true;
}
};
//创建item helper
ItemTouchHelper itemTouchHelper=new ItemTouchHelper(callback);
//绑定到recyclerView上面
itemTouchHelper.attachToRecyclerView(recyclerView);
}
//添加数据
private void initData() {
personList=new ArrayList<>();
personList.add(new Person(1,"anmin","敲代码"));
personList.add(new Person(2,"张三","出差"));
personList.add(new Person(3,"join","吃饭"));
personList.add(new Person(4,"李四","睡觉"));
personList.add(new Person(5,"jack","打豆豆"));
}
//初始化
private void initView(){
recyclerView = findViewById(R.id.recycleview);
// 线性布局管理器
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
recyclerView.setLayoutManager(linearLayoutManager);
//适配器
recyclerAdapter = new RecyclerAdapter(personList);
recyclerView.setAdapter(recyclerAdapter);
}
}
- activity_main.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#EEEEEE"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:weightSum="3">
<TextView
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:gravity="center"
android:text="序号" />
<TextView
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:gravity="center"
android:text="名字" />
<TextView
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:gravity="center"
android:text="动作" />
</LinearLayout>
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recycleview"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
- 以上是整个代码过程
以下是kotlin写法:
val callback: Callback = object : Callback() {
override fun getMovementFlags(
recyclerView: RecyclerView,
viewHolder: RecyclerView.ViewHolder
): Int {
//监控上下左右
val swipFlag = 0 //ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT
val dragflag = ItemTouchHelper.UP or ItemTouchHelper.DOWN
return makeMovementFlags(dragflag, swipFlag)
}
override fun onMove(
recyclerView: RecyclerView,
viewHolder: RecyclerView.ViewHolder,
target: RecyclerView.ViewHolder
): Boolean {
addtargetadapter?.notifyItemMoved(
viewHolder.adapterPosition,
target.adapterPosition
)
Collections.swap(addlist, viewHolder.adapterPosition, target.adapterPosition)
return true
}
override fun canDropOver(
recyclerView: RecyclerView,
current: RecyclerView.ViewHolder,
target: RecyclerView.ViewHolder
): Boolean { //当前item可以被拖动到目标位置后,直接落到target上,后面的item也接着落
return true
}
override fun isLongPressDragEnabled(): Boolean { //返回true 可以实现长按拖动排序和拖动动画
return true
}
override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) { //主要是做左右拖动的回调
}
}
//创建item helper
val itemTouchHelper = ItemTouchHelper(callback)
//绑定到recyclerView上面
itemTouchHelper.attachToRecyclerView(recycleview)
}