使用ItemTouchHelper和RecyclerView实现拖拽移动效果
来源:互联网 发布:java isdirectory 编辑:程序博客网 时间:2024/06/04 17:42
效果图:
在build.gradle文件中加入依赖:
compile 'com.android.support:recyclerview-v7:25.3.1'
使用RecyclerView和ItemTouchHelper可以非常方便的实现上图中的效果。
- 布局文件中加入RecyclerView
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <android.support.v7.widget.RecyclerView android:id="@+id/recycler_view" android:layout_width="match_parent" android:layout_height="match_parent" /></LinearLayout>
- item布局文件,一个TextView和一个ImageView
<?xml version="1.0" encoding="utf-8"?><FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/item" android:layout_width="match_parent" android:layout_height="?listPreferredItemHeight" android:clickable="true" android:focusable="true"> <TextView android:id="@+id/text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:layout_marginLeft="16dp" android:textAppearance="?android:attr/textAppearanceMedium" /> <ImageView android:id="@+id/imageView" android:layout_width="?listPreferredItemHeight" android:layout_height="match_parent" android:layout_gravity="center_vertical|right" android:scaleType="center" android:src="@drawable/ic_menu_red_400_24dp" /></FrameLayout>
- Adapter文件:
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> { private List<String> mData; public MyAdapter(List<String> data) { this.mData = data; } @Override public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_main, parent, false); return new ViewHolder(view); } @Override public void onBindViewHolder(final ViewHolder holder, int position) { holder.text.setText(mData.get(position)); } @Override public int getItemCount() { return mData.size(); } /** * item移动后调用些方法更新 * * @param fromPosition * @param toPosition */ public void onItemMove(int fromPosition, int toPosition) { Collections.swap(mData, fromPosition, toPosition); notifyItemMoved(fromPosition, toPosition); } /** * 删除item调用此方法 * * @param position */ public void onItemRemove(int position) { mData.remove(position); notifyItemRemoved(position); } static class ViewHolder extends RecyclerView.ViewHolder { TextView text; ImageView imageView; public ViewHolder(View itemView) { super(itemView); text = (TextView) itemView.findViewById(R.id.text); imageView = (ImageView) itemView.findViewById(R.id.imageView); } }}
在重写父类的方法后,以添加了两个方法onItemMove和onItemRemove方法,在移动和删除的时候调用这两个方法,更新RecyclerView的数据显示。
- MainActivity代码
public class MainActivity extends AppCompatActivity { private RecyclerView recyclerView; private MyAdapter mAdapter; private List<String> data = new ArrayList<>(); private ItemTouchHelper mItemTouchHelper = new ItemTouchHelper(new ItemTouchHelper.Callback() { //返回一个复合标志,它定义了每个状态中启用的移动方向。 @Override public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) { int dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN;// | ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT; int swipeFlags = ItemTouchHelper.START | ItemTouchHelper.END;// int swipeFlags = 0; return makeMovementFlags(dragFlags, swipeFlags); } //item 移动回调,调用adapter的移动item更新方法 @Override public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) { mAdapter.onItemMove(viewHolder.getAdapterPosition(), target.getAdapterPosition()); return true; } //item拖拽移除,调用adapter中删除item的方法 @Override public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) { mAdapter.onItemRemove(viewHolder.getAdapterPosition()); } }); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); recyclerView = (RecyclerView) findViewById(R.id.recycler_view); initData();// LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);// linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);// recyclerView.setLayoutManager(linearLayoutManager); GridLayoutManager gridLayoutManager = new GridLayoutManager(this, 4); recyclerView.setLayoutManager(gridLayoutManager); mAdapter = new MyAdapter(data); recyclerView.setAdapter(mAdapter); //将ItemTouchHelper和RecyclerView绑定 mItemTouchHelper.attachToRecyclerView(recyclerView); } private void initData() { for (int i = 0; i < 10; i++) { data.add("One"); data.add("Two"); data.add("Three"); data.add("Four"); data.add("Five"); data.add("Six"); data.add("Sever"); data.add("Eight"); data.add("Nine"); data.add("Ten"); } }}
阅读全文
0 0
- 使用ItemTouchHelper和RecyclerView实现拖拽移动效果
- RecyclerView使用ItemTouchHelper实现拖拽和侧滑删除
- RecyclerView之使用ItemTouchHelper和ItemTouchHelper.Callback实现条目拖拽排序
- ItemTouchHelper实现RecyclerView条目拖拽移动、滑动删除
- 使用ItemTouchHelper类轻松实现RecyclerView的拖拽和侧滑
- 使用ItemTouchHelper轻松实现RecyclerView拖拽排序和滑动删除
- 使用ItemTouchHelper轻松实现RecyclerView拖拽排序和滑动删除
- RecyclerView进阶:使用ItemTouchHelper实现拖拽和侧滑删除
- RecyclerView+ItemTouchHelper实现拖拽滑动
- 从源码来看ItemTouchHelper实现RecyclerView列表的拖拽和侧滑
- RecyclerView之使用ItemTouchHelper实现交互动画
- RecyclerView ItemTouchHelper实现拖拽,侧滑删除
- RecyclerView的item拖动排序效果实现和它的ItemTouchHelper详解
- RecyclerView使用ItemTouchHelper
- RecyclerView长按拖动效果,用ItemTouchHelper实现
- Android使用ItemTouchHelper实现RecyclerView的item拖动位置交换
- RecyclerView借助ItemTouchHelper实现拖动和滑动删除功能
- Android实现RecyclerView侧滑删除和长按拖拽-ItemTouchHelper
- react、vue脚手架
- Python---一个简单的自动化测试框架
- Java垃圾回收机制
- 【matlab】解决matlab 2017 help文档需要联网登录
- android 打印 demo
- 使用ItemTouchHelper和RecyclerView实现拖拽移动效果
- 在ArcGIS中【选择元素】工具如何使用?
- Python基础_函数
- 实现统计的年,月,日
- 重写bind方法
- centos7安装iptables
- mongodb添加索引报错:insert: key too large to index
- Mnist进阶代码分析,Tensorboard的基本使用
- 饿了吗第七章better-scroll 中$els 相关问题