当前位置:   article > 正文

使用recycleView中拖拽条目移动重排序的代码实现_baserecyclerviewadapterhelper拖动顺序

baserecyclerviewadapterhelper拖动顺序

工作日志记录,方便以后使用:

具体效果如下:

 

具体代码如下(两种实现方式都在MainActivity.java中):

MainActivity.java代码如下:

  1. package com.xuganwen.testdrag;
  2. import androidx.annotation.NonNull;
  3. import androidx.appcompat.app.AppCompatActivity;
  4. import androidx.recyclerview.widget.GridLayoutManager;
  5. import androidx.recyclerview.widget.ItemTouchHelper;
  6. import androidx.recyclerview.widget.RecyclerView;
  7. import android.os.Bundle;
  8. import android.util.Log;
  9. import android.view.View;
  10. import com.chad.library.adapter.base.callback.ItemDragAndSwipeCallback;
  11. import com.chad.library.adapter.base.listener.OnItemDragListener;
  12. import com.google.android.material.bottomsheet.BottomSheetBehavior;
  13. import com.google.android.material.bottomsheet.BottomSheetDialog;
  14. import java.util.ArrayList;
  15. import java.util.Collections;
  16. import java.util.List;
  17. public class MainActivity extends AppCompatActivity {
  18. private RecyclerView recycleview;
  19. // private MyAdapter myAdapter;
  20. private MyAdapter myAdapter;
  21. private SimpleCycleProgressView progressview;
  22. @Override
  23. protected void onCreate(Bundle savedInstanceState) {
  24. super.onCreate(savedInstanceState);
  25. setContentView(R.layout.activity_main);
  26. recycleview = findViewById(R.id.recycleview);
  27. final List<String> list = new ArrayList<>();
  28. for (int i = 0; i < 60; i++) {
  29. list.add(i + "hehe");
  30. }
  31. //第一种方式使用 com.github.CymChad:BaseRecyclerViewAdapterHelper:2.9.30库提供的adapter的扩展方法来实现,实际上也是在第二种方式的基础上再做简易封装
  32. myAdapter = new MyAdapter(R.layout.item,list);
  33. recycleview.setLayoutManager(new GridLayoutManager(this, 4));
  34. recycleview.setAdapter(myAdapter);
  35. ItemDragAndSwipeCallback itemDragAndSwipeCallback = new ItemDragAndSwipeCallback(myAdapter);
  36. ItemTouchHelper itemTouchHelper = new ItemTouchHelper(itemDragAndSwipeCallback);
  37. itemTouchHelper.attachToRecyclerView(recycleview);
  38. myAdapter.enableDragItem(itemTouchHelper, R.id.tv, true);
  39. OnItemDragListener onItemDragListener = new OnItemDragListener() {
  40. @Override
  41. public void onItemDragStart(RecyclerView.ViewHolder viewHolder, int pos){}
  42. @Override
  43. public void onItemDragMoving(RecyclerView.ViewHolder source, int from, RecyclerView.ViewHolder target, int to) {}
  44. @Override
  45. public void onItemDragEnd(RecyclerView.ViewHolder viewHolder, int pos) {
  46. Log.i("xuganwenlog", list.toString());
  47. }
  48. };
  49. myAdapter.setOnItemDragListener(onItemDragListener);
  50. //第二种方式完全采用recyclerView原生提供的方式实现:
  51. /*
  52. myAdapter = new MyAdapterTwo(list);
  53. recycleview.setLayoutManager(new GridLayoutManager(this, 4));
  54. recycleview.setAdapter(myAdapter);
  55. ItemTouchHelper itemTouchHelper = new ItemTouchHelper(new ItemTouchHelper.Callback() {
  56. @Override
  57. public int getMovementFlags(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder) {
  58. if (recyclerView.getLayoutManager() instanceof GridLayoutManager) {
  59. final int dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN |
  60. ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT;
  61. final int swipeFlags = 0;
  62. return makeMovementFlags(dragFlags, swipeFlags);
  63. } else {
  64. final int dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN;
  65. final int swipeFlags = 0;
  66. return makeMovementFlags(dragFlags, swipeFlags);
  67. }
  68. }
  69. @Override
  70. public boolean onMove(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, @NonNull RecyclerView.ViewHolder target) {
  71. int toPosition = target.getAdapterPosition();
  72. int fromPosition = viewHolder.getAdapterPosition();
  73. if (fromPosition < toPosition) {
  74. for (int i = fromPosition; i < toPosition; i++) {
  75. Collections.swap(list, i, i + 1);
  76. }
  77. } else {
  78. for (int i = fromPosition; i > toPosition; i--) {
  79. Collections.swap(list, i, i - 1);
  80. }
  81. }
  82. myAdapter.notifyItemMoved(fromPosition, toPosition);
  83. return true;
  84. }
  85. @Override
  86. public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int direction) {
  87. }
  88. });
  89. itemTouchHelper.attachToRecyclerView(recycleview);
  90. progressview = findViewById(R.id.progressview);
  91. progressview.setPersent(Float.valueOf("76.5"));
  92. progressview.invalidate();*/
  93. }
  94. }

MyAdapter代码:

  1. package com.xuganwen.testdrag;
  2. import com.chad.library.adapter.base.BaseItemDraggableAdapter;
  3. import com.chad.library.adapter.base.BaseViewHolder;
  4. import java.util.List;
  5. /**
  6. * 文件名 MyAdapter
  7. * 文件描述
  8. * 作者 徐干稳
  9. * 创建日期 2020/03/07 9:59
  10. * 版本 1.0
  11. */
  12. public class MyAdapter extends BaseItemDraggableAdapter<String, BaseViewHolder> {
  13. public MyAdapter(int layoutResId, List<String> data) {
  14. super(layoutResId, data);
  15. }
  16. @Override
  17. protected void convert(BaseViewHolder helper, String item) {
  18. helper.setText(R.id.tv,item);
  19. }
  20. }

MyAdapterTwo.java代码如下:

  1. package com.xuganwen.testdrag;
  2. import android.content.Context;
  3. import android.view.LayoutInflater;
  4. import android.view.View;
  5. import android.view.ViewGroup;
  6. import android.widget.TextView;
  7. import java.util.ArrayList;
  8. import java.util.List;
  9. import androidx.annotation.NonNull;
  10. import androidx.recyclerview.widget.RecyclerView;
  11. /**
  12. * 文件名 MyAdapterTwo
  13. * 文件描述
  14. * 作者 徐干稳
  15. * 创建日期 2020/03/07 10:12
  16. * 版本 1.0
  17. */
  18. public class MyAdapterTwo extends RecyclerView.Adapter {
  19. private List<String> mDatas = new ArrayList<>();
  20. private Context context;
  21. private MyHolder myHolder;
  22. public MyAdapterTwo(List<String> datas) {
  23. mDatas = datas;
  24. }
  25. public MyHolder getHolder(){
  26. return myHolder;
  27. }
  28. @NonNull
  29. @Override
  30. public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
  31. context = parent.getContext();
  32. myHolder=new MyHolder(LayoutInflater.from(context).inflate(R.layout.item, null));
  33. return myHolder;
  34. }
  35. @Override
  36. public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
  37. myHolder=(MyHolder) holder;
  38. myHolder.getTv().setText(mDatas.get(position));
  39. }
  40. @Override
  41. public int getItemCount() {
  42. return mDatas.size();
  43. }
  44. public class MyHolder extends RecyclerView.ViewHolder {
  45. private TextView tv;
  46. public MyHolder(@NonNull View itemView) {
  47. super(itemView);
  48. }
  49. public TextView getTv() {
  50. return itemView.findViewById(R.id.tv);
  51. }
  52. }
  53. }

layout.xml代码如下:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. xmlns:app="http://schemas.android.com/apk/res-auto"
  4. xmlns:tools="http://schemas.android.com/tools"
  5. android:layout_width="match_parent"
  6. android:layout_height="match_parent"
  7. tools:context=".MainActivity">
  8. <androidx.recyclerview.widget.RecyclerView
  9. android:layout_width="match_parent"
  10. android:layout_height="match_parent"
  11. android:id="@+id/recycleview"
  12. app:layout_constraintBottom_toBottomOf="parent"
  13. app:layout_constraintLeft_toLeftOf="parent"
  14. app:layout_constraintRight_toRightOf="parent"
  15. app:layout_constraintTop_toTopOf="parent" />
  16. <com.xuganwen.testdrag.SimpleCycleProgressView
  17. android:layout_width="200dp"
  18. android:layout_height="200dp"
  19. android:visibility="gone"
  20. android:id="@+id/progressview"
  21. app:layout_constraintBottom_toBottomOf="parent"
  22. app:layout_constraintLeft_toLeftOf="parent"
  23. app:layout_constraintRight_toRightOf="parent"
  24. app:layout_constraintTop_toTopOf="parent" />
  25. <Button
  26. android:layout_width="match_parent"
  27. android:layout_height="40dp"
  28. app:layout_constraintLeft_toRightOf="parent"
  29. app:layout_constraintRight_toLeftOf="parent"
  30. app:layout_constraintTop_toTopOf="parent"
  31. android:text="show dialog again"
  32. android:id="@+id/btn"
  33. />
  34. </androidx.constraintlayout.widget.ConstraintLayout>

build.gradle代码如下,主要是引入那个万能adapter库:

  1. apply plugin: 'com.android.application'
  2. android {
  3. compileSdkVersion 29
  4. buildToolsVersion "29.0.2"
  5. defaultConfig {
  6. applicationId "com.xuganwen.testdrag"
  7. minSdkVersion 25
  8. targetSdkVersion 29
  9. versionCode 1
  10. versionName "1.0"
  11. testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
  12. }
  13. buildTypes {
  14. release {
  15. minifyEnabled false
  16. proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
  17. }
  18. }
  19. }
  20. dependencies {
  21. implementation fileTree(dir: 'libs', include: ['*.jar'])
  22. implementation 'androidx.appcompat:appcompat:1.1.0'
  23. implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
  24. testImplementation 'junit:junit:4.12'
  25. androidTestImplementation 'androidx.test.ext:junit:1.1.1'
  26. androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
  27. implementation 'androidx.recyclerview:recyclerview:1.2.0-alpha01'
  28. implementation 'com.github.CymChad:BaseRecyclerViewAdapterHelper:2.9.30'
  29. }

  这篇博客只是简单的固定写法,所以这里也没有过多的讲解,记录下来也是方便以后使用。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/261949
推荐阅读
相关标签
  

闽ICP备14008679号