首先先上效果图
1.在moudle中的build引用
implementation 'androidx.recyclerview:recyclerview:1.2.0-alpha06'
2.创建列表的adapter
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> { private List<Subject> datas; private Context mContext; private LayoutInflater mLiLayoutInflater; public MyAdapter(List<Subject> datas, Context context) { this.datas = datas; this.mContext = context; this.mLiLayoutInflater = LayoutInflater.from(mContext); } @Override public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { return new ViewHolder(mLiLayoutInflater.inflate(R.layout.item_tuodong, parent, false)); } @Override public void onBindViewHolder(ViewHolder holder, int position) { holder.tv_title.setText(datas.get(position).getTitle()); holder.img.setImageResource(datas.get(position).getImg()); } @Override public int getItemCount() { return datas == null ? 0 : datas.size(); } public class ViewHolder extends RecyclerView.ViewHolder { TextView tv_title; ImageView img; LinearLayout ll_item; public ViewHolder(View itemView) { super(itemView); tv_title = itemView.findViewById(R.id.tv_title); img =itemView.findViewById(R.id.img); ll_item = itemView.findViewById(R.id.ll_item); } } }
3.重点就是创建拖拽的lisilistener
public abstract class OnRecyclerItemClickListener implements RecyclerView.OnItemTouchListener { private GestureDetectorCompat mGestureDetector; private RecyclerView recyclerView; public OnRecyclerItemClickListener(RecyclerView recyclerView) { this.recyclerView = recyclerView; mGestureDetector = new GestureDetectorCompat(recyclerView.getContext(), new ItemTouchHelperGestureListener()); } @Override public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) { mGestureDetector.onTouchEvent(e); return false; } @Override public void onTouchEvent(RecyclerView rv, MotionEvent e) { mGestureDetector.onTouchEvent(e); } @Override public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) { } private class ItemTouchHelperGestureListener extends GestureDetector.SimpleOnGestureListener { @Override public boolean onSingleTapUp(MotionEvent e) { View child = recyclerView.findChildViewUnder(e.getX(), e.getY()); if (child != null) { RecyclerView.ViewHolder vh = recyclerView.getChildViewHolder(child); onItemClick(vh); } return true; } @Override public void onLongPress(MotionEvent e) { View child = recyclerView.findChildViewUnder(e.getX(), e.getY()); if (child != null) { RecyclerView.ViewHolder vh = recyclerView.getChildViewHolder(child); onItemLongClick(vh); } } } public abstract void onItemClick(RecyclerView.ViewHolder vh); public abstract void onItemLongClick(RecyclerView.ViewHolder vh); }
4.activity_main.xml
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" xmlns:app="http://schemas.android.com/apk/res-auto"> <androidx.recyclerview.widget.RecyclerView android:id="@+id/recyclerView" . android:layout_width="match_parent" android:layout_height="match_parent" app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager" tools:listitem="@layout/item_tuodong" tools:itemCount="8"/> </RelativeLayout>
5.重点拖动的功能实现 Activity
public class MainRecycleViewActivity extends AppCompatActivity { private Context mContext; private RecyclerView mRecyclerView; private String[] titles = {"美食", "电影", "酒店住宿", "休闲娱乐", "外卖", "自助餐", "KTV", "机票/火车票", "周边游", "美甲美睫", "火锅", "生日蛋糕", "甜品饮品", "水上乐园", "汽车服务", "美发", "丽人", "景点", "足疗按摩", "运动健身", "健身", "超市", "买菜", "今日新单", "小吃快餐", "面膜", "洗浴/汗蒸", "母婴亲子", "生活服务", "婚纱摄影", "学习培训", "家装", "结婚", "全部分配"}; private List<Subject> datas = new ArrayList<>(); private ItemTouchHelper mItemTouchHelper; private MyAdapter myAdapter; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mContext = this; initDate(); initView(); } public void initDate() { //初始化data for (int i = 0; i < titles.length; i++) { datas.add(new Subject(titles[i], R.mipmap.ic_category)); } } public void initView() { mRecyclerView = findViewById(R.id.recyclerView); myAdapter = new MyAdapter(datas, mContext); mRecyclerView.setAdapter(myAdapter); mRecyclerView.addOnItemTouchListener(new OnRecyclerItemClickListener(mRecyclerView) { @Override public void onItemClick(RecyclerView.ViewHolder vh) { Toast.makeText(mContext, datas.get(vh.getLayoutPosition()).getTitle(), Toast.LENGTH_SHORT).show(); } @Override public void onItemLongClick(RecyclerView.ViewHolder vh) { //判断被拖拽的是否是前两个,如果不是则执行拖拽 // if (vh.getLayoutPosition() != 0 && vh.getLayoutPosition() != 1) { if (vh.getLayoutPosition() != 0) { mItemTouchHelper.startDrag(vh); //获取系统震动服务 // Vibrator vib = (Vibrator) getSystemService(Service.VIBRATOR_SERVICE);//震动70毫秒 // vib.vibrate(70); } } }); mItemTouchHelper = new ItemTouchHelper(new ItemTouchHelper.Callback() { /** * 是否处理滑动事件 以及拖拽和滑动的方向 如果是列表类型的RecyclerView的只存在UP和DOWN, * 如果是网格类RecyclerView则还应该多有LEFT和RIGHT * @param recyclerView * @param viewHolder * @return */ @Override public int getMovementFlags(RecyclerView recyclerView, 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; // final int swipeFlags = ItemTouchHelper.START | ItemTouchHelper.END; return makeMovementFlags(dragFlags, swipeFlags); } } @Override public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) { //得到当拖拽的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); } } myAdapter.notifyItemMoved(fromPosition, toPosition); return true; } @Override public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) { // int position = viewHolder.getAdapterPosition(); // myAdapter.notifyItemRemoved(position); // datas.remove(position); } /** * 重写拖拽可用 * @return */ @Override public boolean isLongPressDragEnabled() { return false; } /** * 长按选中Item的时候开始调用 * * @param viewHolder * @param actionState */ @Override public void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState) { if (actionState != ItemTouchHelper.ACTION_STATE_IDLE) { viewHolder.itemView.setBackgroundColor(Color.LTGRAY); } 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); for (int i = 0; i < datas.size(); i++) { Log.e("======" ,"name = "+datas.get(i).getTitle()); } } }); mItemTouchHelper.attachToRecyclerView(mRecyclerView); } }
到此就结束了,demo下载地址:https://download.csdn.net/download/yyxhzdm/15435538
大家也可以关注“开发者社区”公众号,进行交流
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/119186.html