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

来源:互联网 发布:分贝测试软件 编辑:程序博客网 时间:2024/06/04 20:03

       之前想实现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了。

0 0