软件编程
位置:首页>> 软件编程>> Android编程>> RecyclerView实现拖拽排序效果

RecyclerView实现拖拽排序效果

作者:崔晨博  发布时间:2022-09-14 01:23:40 

标签:RecyclerView,拖拽,排序

效果就是这样,RecyclerView列表可拖拽排序,可删除,可添加;

RecyclerView实现拖拽排序效果

RecyclerView给我们提供了一个手势器:


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

@Override
 public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
  //滑动事件 下面注释的代码,滑动后数据和条目错乱,被舍弃
//   Collections.swap(datas,viewHolder.getAdapterPosition(),target.getAdapterPosition());
//   ap.notifyItemMoved(viewHolder.getAdapterPosition(),target.getAdapterPosition());

//得到当拖拽的viewHolder的Position
  int fromPosition = viewHolder.getAdapterPosition();
  //拿到当前拖拽到的item的viewHolder
  int toPosition = target.getAdapterPosition();
  if (fromPosition < toPosition) {
   for (int i = fromPosition; i < toPosition; i++) {
    Collections.swap(datas, i, i + 1);
   }
  } else {
   for (int i = fromPosition; i > toPosition; i--) {
    Collections.swap(datas, i, i - 1);
   }
  }
  ap.notifyItemMoved(fromPosition, toPosition);
  return true;
 }

@Override
 public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
   //侧滑删除可以使用;
 }

@Override
 public boolean isLongPressDragEnabled() {
  return true;
 }
 /**
  * 长按选中Item的时候开始调用
  * 长按高亮
  * @param viewHolder
  * @param actionState
  */
 @Override
 public void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState) {
  if (actionState != ItemTouchHelper.ACTION_STATE_IDLE) {
   viewHolder.itemView.setBackgroundColor(Color.RED);
   //获取系统震动服务//震动70毫秒
   Vibrator vib = (Vibrator) getSystemService(Service.VIBRATOR_SERVICE);
   vib.vibrate(70);
  }
  super.onSelectedChanged(viewHolder, actionState);
 }

/**
  * 手指松开的时候还原高亮
  * @param recyclerView
  * @param viewHolder
  */
 @Override
 public void clearView(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
  super.clearView(recyclerView, viewHolder);
  viewHolder.itemView.setBackgroundColor(0);
  ap.notifyDataSetChanged(); //完成拖动后刷新适配器,这样拖动后删除就不会错乱
 }
});

设置给RecyclerView即可:


helper.attachToRecyclerView(rv);

下面是完整的代码和Xml布局文件:


public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private final String TAG = this.getClass().getSimpleName();
private List<String> d = Arrays.asList(
  "A","B","C","D","E","F","G"
  ,"H","I","J","K","L","M","N"
  ,"O","P","Q","R","S","T"
  ,"U","V","W","X","Y","Z");
private RecyclerView rv ;
private Ap<String> ap;
private List<String> datas;
private EditText edAdd;

@Override
protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.activity_main);
 initData();
 rv = findViewById(R.id.rv);
 edAdd =findViewById(R.id.et_add);
 rv.setLayoutManager(new GridLayoutManager(this,3));
//  rv.setLayoutManager(new LinearLayoutManager(this));
 ap = new Ap(this, datas);
 rv.setAdapter(ap);
 helper.attachToRecyclerView(rv);
 findViewById(R.id.tv).setOnClickListener(this);
 findViewById(R.id.tv_add).setOnClickListener(this);
}

private void initData() {
 datas = new ArrayList<>();
//  直接用d操作集合会崩溃,Arrays.asList集合不可增删改;详细可以看我的博客
 for (int i = 0; i < d.size(); i++) {
  datas.add(d.get(i));
 }
}

@Override
public void onClick(View view) {
 switch (view.getId()){
  case R.id.tv:
   for (int i = 0; i < datas.size(); i++) {
    Log.i(TAG, "onClick: ____"+datas.get(i));
   }
   break;
  case R.id.tv_add:
   ap.add(edAdd.getText().toString().trim());
   edAdd.setText(null);
   break;
 }
}

class Ap<T> extends RecyclerView.Adapter<Ap.Vh>{
 private Context context;
 public List<T> stringList;
 public Ap(Context context, List<T> stringList) {
  this.context = context;
  this.stringList = stringList;
 }

@Override
 public Ap.Vh onCreateViewHolder(ViewGroup parent, int viewType) {
  return new Vh(LayoutInflater.from(context).inflate(R.layout.item_rv,null));
 }

@Override
 public void onBindViewHolder(Ap.Vh holder, final int position) {
  holder.tv.setText(stringList.get(position).toString());
  holder.iv.setOnClickListener(new View.OnClickListener() {
   @Override
   public void onClick(View view) {
    remove(position);
   }
  });
 }

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

public void add(T item){
  int position = stringList.size();
  stringList.add(item);
  notifyItemInserted(position);
 }

public void add(int position,T item){
  stringList.add(position,item);
  notifyItemInserted(position);
 }
//  public void remove(T item) {
//   final int position = stringList.indexOf(item);
//   if (-1 == position)
//    return;
//   stringList.remove(item);
//   notifyItemRemoved(position);
//  }

public void remove(int position) {
  stringList.remove(position);
  notifyItemRemoved(position);
  notifyItemRangeChanged(position,stringList.size());
 }

class Vh extends RecyclerView.ViewHolder {

public Vh(View itemView) {
   super(itemView);
   tv = itemView.findViewById(R.id.tv);
   iv = itemView.findViewById(R.id.iv_delete);
  }
  public TextView tv;
  public ImageView iv;
 }
}

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

@Override
 public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
  //滑动事件 下面注释的代码,滑动后数据和条目错乱,被舍弃
//   Collections.swap(datas,viewHolder.getAdapterPosition(),target.getAdapterPosition());
//   ap.notifyItemMoved(viewHolder.getAdapterPosition(),target.getAdapterPosition());

//得到当拖拽的viewHolder的Position
  int fromPosition = viewHolder.getAdapterPosition();
  //拿到当前拖拽到的item的viewHolder
  int toPosition = target.getAdapterPosition();
  if (fromPosition < toPosition) {
   for (int i = fromPosition; i < toPosition; i++) {
    Collections.swap(datas, i, i + 1);
   }
  } else {
   for (int i = fromPosition; i > toPosition; i--) {
    Collections.swap(datas, i, i - 1);
   }
  }
  ap.notifyItemMoved(fromPosition, toPosition);
  return true;
 }

@Override
 public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
   //侧滑删除可以使用;
 }

@Override
 public boolean isLongPressDragEnabled() {
  return true;
 }
 /**
  * 长按选中Item的时候开始调用
  * 长按高亮
  * @param viewHolder
  * @param actionState
  */
 @Override
 public void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState) {
  if (actionState != ItemTouchHelper.ACTION_STATE_IDLE) {
   viewHolder.itemView.setBackgroundColor(Color.RED);
   //获取系统震动服务//震动70毫秒
   Vibrator vib = (Vibrator) getSystemService(Service.VIBRATOR_SERVICE);
   vib.vibrate(70);
  }
  super.onSelectedChanged(viewHolder, actionState);
 }

/**
  * 手指松开的时候还原高亮
  * @param recyclerView
  * @param viewHolder
  */
 @Override
 public void clearView(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
  super.clearView(recyclerView, viewHolder);
  viewHolder.itemView.setBackgroundColor(0);
  ap.notifyDataSetChanged(); //完成拖动后刷新适配器,这样拖动后删除就不会错乱
 }
});
}

Xml布局文件:


<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.ccb.pactera.dragrecyclerviewdemo.MainActivity">

<LinearLayout
 android:id="@+id/ll"
 android:background="#eeeeee"
 android:orientation="horizontal"
 android:layout_width="match_parent"
 android:layout_height="48dp">
 <TextView
  android:layout_width="0dp"
  android:layout_weight="1"
  android:layout_height="48dp"
  android:id="@+id/tv"
  android:text="查看数据"
  android:textColor="#fff"
  android:textSize="16dp"
  android:gravity="center"
  android:background="@color/colorAccent"
  />
 <EditText
  android:id="@+id/et_add"
  android:layout_width="0dp"
  android:layout_height="match_parent"
  android:layout_weight="1"/>
 <TextView
  android:layout_width="0dp"
  android:layout_weight="1"
  android:layout_height="48dp"
  android:id="@+id/tv_add"
  android:text="添加数据"
  android:textColor="#fff"
  android:textSize="16dp"
  android:gravity="center"
  android:background="#fc1"
  />
</LinearLayout>
<android.support.v7.widget.RecyclerView
 android:id="@+id/rv"
 android:layout_below="@id/ll"
 android:layout_width="match_parent"
 android:layout_height="match_parent" />

</RelativeLayout>

RecyclerView的Item:


<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:background="#f1f1f1"
android:layout_height="match_parent">
<RelativeLayout
 android:layout_width="match_parent"
 android:background="#fff"
 android:layout_margin="0.5dp"
 android:layout_height="match_parent">
<ImageView
 android:layout_width="match_parent"
 android:layout_height="50dp"
 android:src="@mipmap/icon"
 android:id="@+id/iv"
 android:layout_marginTop="10dp"
 />
<TextView
android:id="@+id/tv"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="16dp"
android:layout_below="@id/iv"
android:gravity="center_horizontal"
android:layout_marginBottom="10dp"
/>
<ImageView
 android:layout_width="25dp"
 android:layout_height="25dp"
 android:layout_alignParentRight="true"
 android:src="@mipmap/detele"
 android:id="@+id/iv_delete"
 />
</RelativeLayout>
</RelativeLayout>

资源链接Github

来源:https://blog.csdn.net/qq_35605213/article/details/80541461

0
投稿

猜你喜欢

手机版 软件编程 asp之家 www.aspxhome.com