3-VII-RecyclerView的item操作

点击添加、左滑删除、长按移动交换

RecyclerView的item.gif


1、Item 操作的接口
/**
 * 作者:张风捷特烈<br/>
 * 时间:2018/9/17 0017:14:18<br/>
 * 邮箱:1981462002@qq.com<br/>
 * 说明:Item 操作的接口
 */
public interface ItemChangeAdapter<T> {

    /**
     * 交换条目
     *
     * @param from 起点
     * @param to 终点
     */
    void onItemMove(int from, int to);

    /**
     * 删除条目
     *
     * @param position 位置
     */
    void onItemDelete(int position);

    /**
     * 添加条目
     *
     * @param position 位置
     * @param t 数据
     */
    void onItemAdd(int position, T t);
}
2.RecyclerView条目回调
/**
 * 作者:张风捷特烈<br/>
 * 时间:2018/9/17 0017:14:41<br/>
 * 邮箱:1981462002@qq.com<br/>
 * 说明:RecyclerView条目回调
 */
public class ItemTouchCallback extends ItemTouchHelper.Callback{

    private ItemChangeAdapter mAdapter;

    public ItemTouchCallback(ItemChangeAdapter adapter){
        mAdapter = adapter;
    }

    @Override
    public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
        //可向上下拖动
        int dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN;
        //可向左滑动
        int swipeFlags = ItemTouchHelper.LEFT;

        return makeMovementFlags(dragFlags,swipeFlags);
    }

    @Override
    public boolean isLongPressDragEnabled() {
        return true;
    }

    @Override
    public boolean isItemViewSwipeEnabled() {
        return true;
    }

    @Override
    public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
        //移动时:
        mAdapter.onItemMove(viewHolder.getAdapterPosition(),target.getAdapterPosition());
        return true;
    }

    @Override
    public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
        //滑动时
        mAdapter.onItemDelete(viewHolder.getAdapterPosition());
    }
}
3.适配器实现接口
/**
 * 作者:张风捷特烈<br/>
 * 时间:2018/9/17 0017:14:19<br/>
 * 邮箱:1981462002@qq.com<br/>
 * 说明:RecyclerView适配器
 */
public class MyAdapter<T> extends RecyclerView.Adapter<RecyclerView.ViewHolder> implements ItemChangeAdapter {

    private List<T> mData;
    private Context mContext;

    public MyAdapter(List<T> data, Context context) {
        mData = data;
        mContext = context;
    }

    @Override

    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

        View view = LayoutInflater.from(mContext).inflate(R.layout.item_rv, null);
        return new MyViewHolder(view);
    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
        View view = holder.itemView;

        view.setOnClickListener((i) ->{
           onItemAdd(position, ZRandom.randomCnName());
        });

        TextView tv = view.findViewById(R.id.tv_title);
        tv.setText((String) mData.get(position));
    }

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

    @Override
    public void onItemMove(int from, int to) {
        //交换位置
        ToastUtil.showAtOnce(mContext,"已交换:"+mData.get(from)+"和"+mData.get(to)+"的位置");
        Collections.swap(mData, from, to);
        notifyItemMoved(from, to);
    }

    @Override
    public void onItemDelete(int position) {
        //移除数据
        ToastUtil.showAtOnce(mContext,"已删除:"+mData.get(position));
        mData.remove(position);
        notifyItemRemoved(position);
    }

    @Override
    public void onItemAdd(int position, Object o) {
        mData.add(position, (T) o);
        notifyItemInserted(position);//刷新数据
    }


    class MyViewHolder extends RecyclerView.ViewHolder {

        public MyViewHolder(View itemView) {
            super(itemView);
        }
    }
}
4.使用:
RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(this);
MyAdapter adapter = new MyAdapter(mData, this);
//实例化ItemTouchHelper
ItemTouchHelper touchHelper = new ItemTouchHelper(new ItemTouchCallback(adapter));
//调用ItemTouchHelper的attachToRecyclerView方法建立联系
touchHelper.attachToRecyclerView(mRecyclerView);
//设置适配器
mRecyclerView.setAdapter(adapter);
mRecyclerView.setLayoutManager(layoutManager);

二、布局文件

1.Activity布局
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@mipmap/bg11">

    <android.support.v7.widget.RecyclerView
        android:id="@+id/recycler_view"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>

</RelativeLayout>
2.item布局
<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.CardView
    xmlns:android="http://schemas.android.com/apk/res/android"
    style="@style/MyBaseCard"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">
    
    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="?android:attr/selectableItemBackground"
        android:padding="10dp">

        <ImageView
            android:id="@+id/iv_icon"
            android:layout_width="40dp"
            android:layout_height="40dp"
            android:src="@mipmap/head"/>

        <TextView
            android:id="@+id/tv_title"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_centerInParent="true"
            android:layout_marginLeft="3dp"
            android:layout_toRightOf="@+id/iv_icon"
            android:text="Content"
            android:textAllCaps="false"
            android:textColor="#000000"
            android:textSize="@dimen/dp_16"/>

    </RelativeLayout>
</android.support.v7.widget.CardView>

后记、

1.声明:

[1]本文由张风捷特烈原创,转载请注明 [2]欢迎广大编程爱好者共同交流 [3]个人能力有限,如有不正之处欢迎大家批评指证,必定虚心改正 [4]你的喜欢与支持将是我最大的动力

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏潇涧技术专栏

Head First Android SwipeRefreshLayout

本文内容和代码参考自Implementing Swipe to Refresh, an Android Material Design UI Pattern,原...

1022
来自专栏Android干货

浅谈RecyclerView(完美替代ListView,GridView)

5226
来自专栏Android中高级开发

Android开发之漫漫长途 XV——RecyclerView

该文章是一个系列文章,是本人在Android开发的漫漫长途上的一点感想和记录,我会尽量按照先易后难的顺序进行编写该系列。该系列引用了《Android开发艺术探索...

1752
来自专栏向治洪

仿淘宝收货地址,本地数据库

谁说咱们攻城狮不能写出既幽默又能懂的博客呢,本人想推出一系列博文,可以给刚接触Android开发的做一个参考,也可以与接触Android已久的各路大神比较一下,...

1.3K7
来自专栏Android 开发学习

ListView的一个典型crash cannot be cast to android.widget.AbsListView$LayoutParams1. 背景2. 为什么会出现crash3.

3033
来自专栏极客猴

聊聊Activity那些事

Activity身为四大组件之一,在整个App中扮演着向用户呈现界面的角色。在平常的开发中,我们会自定义一个类去继承Activity去实现界面。而Activit...

732
来自专栏向治洪

ViewPager 实现 Galler 效果, 中间大图显示,两边小图展示

正常情况下, ViewPager 一页只能显示一项数据, 但是我们常常看到网上,特别是电视机顶盒的首页经常出现中间大图显示两端也都露出一点来,这种效果怎么实现呢...

6895
来自专栏Android 开发学习

PagerAdapter闪屏坑的修复

2952
来自专栏向治洪

listview动态获取数据

1.主Activity 1 public class MainActivity extends Activity { 2 3 private ...

2279
来自专栏上善若水

002android初级篇之ViewPager及PagerSlidingTabStrip listview的使用

listView是一个可以用来显示视图列表的控件。 它使用适配器来为之提供数据和资源。

1263

扫码关注云+社区

领取腾讯云代金券