用RecyclerView轻松实现gridview中itemview拖拽效果

以前一直认为支付宝中的gridview拖拽效果很牛逼,局限于当时不会使用RecyclerView,眼光一直在GridView上打转,各种自定义,可是效果都不理想,前几天开始接触RecyclerView,使我打开了一个新的方向。言归正传,进入正题。
项目中不会导入RecyclerView使用的jar包的人可以[点击这里](http://blog.csdn.net/a396901990/article/details/40153759)
//创建一个RecyclerView
private void initView() {
        recyclerView = new RecyclerView(this);
        ViewGroup.LayoutParams layoutParams = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
        recyclerView.setLayoutParams(layoutParams);
        recyclerView.setBackgroundDrawable(ContextCompat.getDrawable(this, android.R.color.white));
        setContentView(recyclerView);
    }

//适配Adapter
class MyAdapter extends RecyclerView.Adapter{

        private Context ctx;

        MyAdapter(Context ctx){
            this.ctx = ctx;
        }

        @Override
        public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
            return new ViewHolder(View.inflate(ctx, R.layout.item_fresco_icon_name, null));
        }

        @Override
        public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
            ViewHolder holder1 = (ViewHolder) holder;
            StringBuilder sb = new StringBuilder("ac_");
            sb.append(position%6+1);
            holder1.face.setImageResource(getResources().getIdentifier(sb.toString(), "mipmap", "包名"));
            holder1.title.setText(datas.get(position));
        }

        @Override
        public int getItemCount() {
            return datas.size();
        }
    }
//xml item布局
<?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="120dp">

    <android.support.v7.widget.AppCompatImageView
        android:id="@+id/face"
        android:layout_width="50dp"
        android:layout_height="50dp"
        android:layout_centerHorizontal="true"
        android:src="@mipmap/ic_launcher"/>

    <TextView
        android:id="@+id/mark_name"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_below="@id/face"
        android:textColor="@android:color/black"
        android:textSize="16sp"
        android:gravity="center_horizontal"/>

</RelativeLayout>
//对应xml的Adapter的ViewHolder
class ViewHolder extends RecyclerView.ViewHolder{

        AppCompatImageView face;
        TextView title;

        public ViewHolder(View itemView) {
            super(itemView);
            face = (AppCompatImageView) itemView.findViewById(R.id.face);
            title = (TextView) itemView.findViewById(R.id.mark_name);
        }
    }
下面再来给RecyclerView设置一下

private void initConainter() {
recyclerView.setHasFixedSize(true);
recyclerView.setLayoutManager(new GridLayoutManager(this, 4, GridLayoutManager.VERTICAL, false));
recyclerView.setAdapter(adapter = new MyAdapter(this));
new ItemTouchHelper(mCallback).attachToRecyclerView(recyclerView);
}

要想给RecyclerView实现gridview的布局拖动效果,最关键的是给添加一个ItemTouchHelper,代码如下:

这里写代码片

ItemTouchHelper.Callback mCallback = new ItemTouchHelper.SimpleCallback(
ItemTouchHelper.UP|ItemTouchHelper.DOWN|ItemTouchHelper.LEFT|ItemTouchHelper.RIGHT,//drag方向,长按振动后可以拖动
0//swip方向,实现滑动删除) {
        /**
         * @param recyclerView
         * @param viewHolder 拖动的ViewHolder
         * @param target 目标位置的ViewHolder
         * @return
         */
        @Override
        public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
            int fromPosition = viewHolder.getAdapterPosition();//得到拖动ViewHolder的position
            int toPosition = target.getAdapterPosition();//得到目标ViewHolder的position
            if (fromPosition < toPosition) {
                //分别把中间所有的item的位置重新交换
                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);
                }
            }
            adapter.notifyItemMoved(fromPosition, toPosition);
            //返回true表示执行拖动
            return true;
        }

        @Override
        public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
            int position = viewHolder.getAdapterPosition();
            datas.remove(position);
            adapter.notifyItemRemoved(position);
        }

    };

这就是上面出现的mCallBack了

好啦,到这里就over了,就是一个简单的ItemTouchHelper.SimpleCallback实现

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值