使用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
原创粉丝点击