RecycleView实现左右滑动监听和上下拖拽调换顺序

       之前想实现ListView右滑删除和上下拖拽交换位置的功能,但是找来找去,要么就实现上比较复杂,要么就是代码太老了。从github找了几个开源项目,但是总是有这样那样的bug。但是后来得知看到Google居然已经内置了这两个功能,只需要使用v7包里的RecycleView去实现就可以了。

代码如下


package justwen.demorecycleview;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.helper.ItemTouchHelper;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class MainActivity extends AppCompatActivity {

    private RecyclerView mRecyclerView;

    private List<Integer> mData = new ArrayList<>();

    private class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder>{

        public class MyViewHolder extends RecyclerView.ViewHolder{

            public TextView mTextView;

            public MyViewHolder(View itemView) {
                super(itemView);
                mTextView = (TextView) itemView.findViewById(R.id.tv);
            }
        }
        @Override
        public MyAdapter.MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
            View view = LayoutInflater.from(MainActivity.this).inflate(R.layout.activity_list_item,parent,false);
            return new MyViewHolder(view);
        }

        @Override
        public void onBindViewHolder(MyAdapter.MyViewHolder holder, int position) {

            holder.mTextView.setText(mData.get(position)+"");
        }

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

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initData();
        initViews();
    }

    private void initData(){
        Collections.addAll(mData, new Integer[]{1,2,3,4,5,6,7,8,9,10});
    }

    private void initViews(){
        mRecyclerView = (RecyclerView) findViewById(R.id.list);
        // 设置布局管理器,默认是vertical布局
        mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
        // 设置适配器
        mRecyclerView.setAdapter(new MyAdapter());
        // 重点,创建一个ItemTouchHelper类的对象,需要传入一个ItemTouchHelper的内部类Callbacl的对象,这里使用了Google内置的SimpleCallback
		// 第一个参数是可以拖拽的方向,第二个参数是可以滑动的方向
        ItemTouchHelper touchHelper = new ItemTouchHelper(new ItemTouchHelper.SimpleCallback(ItemTouchHelper.UP|ItemTouchHelper.DOWN,ItemTouchHelper.RIGHT) {
            @Override
            public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
                mRecyclerView.getAdapter().notifyItemMoved(viewHolder.getAdapterPosition(),target.getAdapterPosition());
                Collections.swap(mData,viewHolder.getAdapterPosition(),target.getAdapterPosition());
                return true;
            }

            @Override
            public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
                mData.remove(viewHolder.getAdapterPosition());
                mRecyclerView.getAdapter().notifyDataSetChanged();
            }
        });
        //将recycleView和ItemTouchHelper绑定
        touchHelper.attachToRecyclerView(mRecyclerView);
    }
}

    

    上面我是直接用的Google写好的SimpleCallBack类,如果想自己判断回调上述两个方法的时机,可以使用Callback类重载getMoveMentFlags方法。

     PS  我感觉RecycleView已经可以完全替代ListView, 不仅不用自己去实现ViewHolder了,Google还支持了很多的功能,自己写的app所有需要显示列表数据的地方都已经使用了RecycleView了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值