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

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

具体效果如下:

 

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

MainActivity.java代码如下:

package com.xuganwen.testdrag;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.GridLayoutManager;
import androidx.recyclerview.widget.ItemTouchHelper;
import androidx.recyclerview.widget.RecyclerView;

import android.os.Bundle;
import android.util.Log;
import android.view.View;

import com.chad.library.adapter.base.callback.ItemDragAndSwipeCallback;
import com.chad.library.adapter.base.listener.OnItemDragListener;
import com.google.android.material.bottomsheet.BottomSheetBehavior;
import com.google.android.material.bottomsheet.BottomSheetDialog;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class MainActivity extends AppCompatActivity {

    private RecyclerView recycleview;
    //    private MyAdapter myAdapter;
    private MyAdapter myAdapter;
    private SimpleCycleProgressView progressview;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        recycleview = findViewById(R.id.recycleview);
        final List list = new ArrayList<>();

        for (int i = 0; i < 60; i++) {

            list.add(i + "hehe");
        }

        //第一种方式使用  com.github.CymChad:BaseRecyclerViewAdapterHelper:2.9.30库提供的adapter的扩展方法来实现,实际上也是在第二种方式的基础上再做简易封装
        myAdapter = new MyAdapter(R.layout.item,list);
        recycleview.setLayoutManager(new GridLayoutManager(this, 4));
        recycleview.setAdapter(myAdapter);

        ItemDragAndSwipeCallback itemDragAndSwipeCallback = new ItemDragAndSwipeCallback(myAdapter);
        ItemTouchHelper itemTouchHelper = new ItemTouchHelper(itemDragAndSwipeCallback);
        itemTouchHelper.attachToRecyclerView(recycleview);

        myAdapter.enableDragItem(itemTouchHelper, R.id.tv, true);
        OnItemDragListener onItemDragListener = new OnItemDragListener() {
            @Override
            public void onItemDragStart(RecyclerView.ViewHolder viewHolder, int pos){}
            @Override
            public void onItemDragMoving(RecyclerView.ViewHolder source, int from, RecyclerView.ViewHolder target, int to) {}
            @Override
            public void onItemDragEnd(RecyclerView.ViewHolder viewHolder, int pos) {
                Log.i("xuganwenlog", list.toString());
            }
        };

        myAdapter.setOnItemDragListener(onItemDragListener);


        //第二种方式完全采用recyclerView原生提供的方式实现:
        /*
        myAdapter = new MyAdapterTwo(list);
        recycleview.setLayoutManager(new GridLayoutManager(this, 4));
        recycleview.setAdapter(myAdapter);

        ItemTouchHelper itemTouchHelper = new ItemTouchHelper(new ItemTouchHelper.Callback() {
            @Override
            public int getMovementFlags(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder) {
                if (recyclerView.getLayoutManager() instanceof GridLayoutManager) {
                    final int dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN |
                            ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT;
                    final int swipeFlags = 0;
                    return makeMovementFlags(dragFlags, swipeFlags);
                } else {
                    final int dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN;
                    final int swipeFlags = 0;
                    return makeMovementFlags(dragFlags, swipeFlags);
                }
            }

            @Override
            public boolean onMove(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, @NonNull RecyclerView.ViewHolder target) {
                int toPosition = target.getAdapterPosition();
                int fromPosition = viewHolder.getAdapterPosition();
                if (fromPosition < toPosition) {
                    for (int i = fromPosition; i < toPosition; i++) {
                        Collections.swap(list, i, i + 1);
                    }
                } else {
                    for (int i = fromPosition; i > toPosition; i--) {
                        Collections.swap(list, i, i - 1);
                    }
                }
                myAdapter.notifyItemMoved(fromPosition, toPosition);
                return true;
            }

            @Override
            public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int direction) {

            }

        });
        itemTouchHelper.attachToRecyclerView(recycleview);

        progressview = findViewById(R.id.progressview);

        progressview.setPersent(Float.valueOf("76.5"));
        progressview.invalidate();*/


        
    }

}

MyAdapter代码:

package com.xuganwen.testdrag;

import com.chad.library.adapter.base.BaseItemDraggableAdapter;
import com.chad.library.adapter.base.BaseViewHolder;

import java.util.List;

/**
 * 文件名 MyAdapter
 * 文件描述
 * 作者 徐干稳
 * 创建日期 2020/03/07 9:59
 * 版本 1.0
 */
public class MyAdapter extends BaseItemDraggableAdapter {


    public MyAdapter(int layoutResId, List data) {
        super(layoutResId, data);
    }

    @Override
    protected void convert(BaseViewHolder helper, String item) {

        helper.setText(R.id.tv,item);
    }
}

MyAdapterTwo.java代码如下:

package com.xuganwen.testdrag;


import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import java.util.ArrayList;
import java.util.List;

import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;

/**
 * 文件名 MyAdapterTwo
 * 文件描述
 * 作者 徐干稳
 * 创建日期 2020/03/07 10:12
 * 版本 1.0
 */
public class MyAdapterTwo extends RecyclerView.Adapter {

    private List mDatas = new ArrayList<>();
    private Context context;
    private MyHolder myHolder;

    public MyAdapterTwo(List datas) {
        mDatas = datas;
    }

    public MyHolder getHolder(){
        return myHolder;
    }

    @NonNull
    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        context = parent.getContext();
        myHolder=new MyHolder(LayoutInflater.from(context).inflate(R.layout.item, null));
        return myHolder;
    }

    @Override
    public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {

        myHolder=(MyHolder) holder;
        myHolder.getTv().setText(mDatas.get(position));
    }

    @Override
    public int getItemCount() {
        return mDatas.size();
    }

    public class MyHolder extends RecyclerView.ViewHolder {
        private TextView tv;
        public MyHolder(@NonNull View itemView) {
            super(itemView);
        }

        public TextView getTv() {
            return itemView.findViewById(R.id.tv);
        }

    }
}

layout.xml代码如下:




    

    

    

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

apply plugin: 'com.android.application'

android {
    compileSdkVersion 29
    buildToolsVersion "29.0.2"
    defaultConfig {
        applicationId "com.xuganwen.testdrag"
        minSdkVersion 25
        targetSdkVersion 29
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'androidx.appcompat:appcompat:1.1.0'
    implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'androidx.test.ext:junit:1.1.1'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
    implementation 'androidx.recyclerview:recyclerview:1.2.0-alpha01'

    implementation 'com.github.CymChad:BaseRecyclerViewAdapterHelper:2.9.30'

   
}

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

你可能感兴趣的:(移动开发)