RecyclerView使用介绍

来源:互联网 发布:宋岳庭的故事 知乎 编辑:程序博客网 时间:2024/06/15 16:23

RecyclerView是一个比ListView更灵活的一个控件 ,可以说是ListView和GridView的升级版,RecyclerView的使用方法和ListView 类似

添加库依赖: compile 'com.android.support:recyclerview-v7:25.3.1+'

在布局文件中加入 RecyclerView控件,为 RecyclerView控件指定一个ID,设置宽和高都为 match_parent 占满整个屏幕

activity_main.xml

<?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_test_rv"        android:scrollbars="vertical"        android:layout_width="match_parent"        android:layout_height="match_parent"/></LinearLayout>

接下来修改MainActivity的代码 ,在Activity中获取RecyclerView控件然后进行设置LayoutManger以及Adapter

MainActivity.Java

public class MainActivity extends AppCompatActivity {    private RecyclerView recyclerView;//获取控件    private PersonAdapter adapter;//添加适配器    private List<Person> personList = new ArrayList<>();//存放数据集合    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        //通过id获取到recyclerView        recyclerView= (RecyclerView) findViewById(R.id.recycler_view_test_rv);        //设置RecyclerView保持固定的大小,提高RecyclerView的性能        recyclerView.setHasFixedSize(true);        // 1  设置布局方式LinearLayout        RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(this);        // 2  设置瀑布流式的布局StaggeredGridLayout        //在适配器的onBindViewHolder方法中为我们的item设置个随机的高度 就可以实现瀑布流布局        //StaggeredGridLayoutManager layoutManager = new StaggeredGridLayoutManager(4,StaggeredGridLayoutManager.VERTICAL);        //  3 设置布局方式 GridLayout       // GridLayoutManager layoutManager=new GridLayoutManager(this,4);        //设置水平滚动布局,, 不设置默认是  垂直滚动布局        // layoutManager.setOrientation(OrientationHelper.HORIZONTAL);        //将布局管理器加载到 recyclerView中        recyclerView.setLayoutManager(layoutManager);        //设置动画效果        recyclerView.setItemAnimator(new DefaultItemAnimator());        initData();//初始化数据        //新建适配器        adapter = new PersonAdapter(personList);        //RecyclerView 设置item 点击和长按 监听事件        adapter.setOnRecyclerViewListener(new PersonAdapter.OnRecyclerViewListener() {            @Override            public void onItemClick(int position) {                Toast.makeText(MainActivity.this, "点击了"+position, Toast.LENGTH_SHORT).show();            }            @Override            public boolean onItemLongClick(int position) {                if(recyclerView!=null) {                    //长按删除                    //adapter.notifyItemRemoved(position);                    //personList.remove(position);                   // adapter.notifyItemRangeChanged(position, adapter.getItemCount());                    Toast.makeText(MainActivity.this, "长按了" + position, Toast.LENGTH_SHORT).show();                }                return false;            }        });        //recyclerview设置适配器        recyclerView.setAdapter(adapter);        //---------------------------------Item拖拽和滑动删除-----------------------------        ItemTouchHelper itemTouchHelper = new ItemTouchHelper(new ItemTouchHelper.Callback() {            //用于设置拖拽和滑动的方向            @Override            public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {                int dragFlags = 0, swipeFlags = 0;                if (recyclerView.getLayoutManager() instanceof StaggeredGridLayoutManager || recyclerView.getLayoutManager() instanceof GridLayoutManager) {                    //网格式布局有4个方向                    dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN | ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT;                } else if (recyclerView.getLayoutManager() instanceof LinearLayoutManager) {                    //线性式布局有2个方向                    dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN;                    swipeFlags = ItemTouchHelper.START | ItemTouchHelper.END; //设置侧滑方向为从两个方向都可以                }                return makeMovementFlags(dragFlags, swipeFlags);//swipeFlags 为0的话item不滑动            }            //长摁item拖拽时会回调这个方法            @Override            public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {                int from = viewHolder.getAdapterPosition();                int to = target.getAdapterPosition();                //处理拖拽操作   ***前提是isLongPressDragEnabled()方法 返回true***                Person moveItem = personList.get(from);                personList.remove(from);                personList.add(to, moveItem);//交换数据链表中数据的位置                adapter.notifyItemMoved(from, to);//移动刷新                return true;            }            @Override            public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {                //这里处理滑动删除                int index = viewHolder.getAdapterPosition();//获取到拖动到位置                personList.remove(index);//删除                adapter.notifyItemRemoved(index);//删除刷新                /*                 //新Adapter还提供了其他的方法                //调用adapter.notifyDataSetChanged()方法,会重新调用onBindViewHolder()方法                    public final void notifyDataSetChanged()                //调用adapter.notifyItemChanged(int position),position数据发生了改变,会回调对应position的onBindViewHolder()方法来刷新数据                    public final void notifyItemChanged(int position)                //调用adapter.notifyItemRangeChanged(int positionStart, int itemCount) 刷新从positionStart开始itemCount数量的item了(这里的刷新指回调onBindViewHolder()方法)                    public final void notifyItemRangeChanged(int positionStart, int itemCount)                //调用adapter.notifyItemInserted(int position) 在第position位置被插入了一条数据的时候 用这个方法刷新数据                    public final void notifyItemInserted(int position)                //调用adapter.notifyItemMoved(int fromPosition, int toPosition) 从fromPosition移动到toPosition的时候可以使用这个方法刷新数据                    public final void notifyItemMoved(int fromPosition, int toPosition)                //调用adapter.notifyItemRangeInserted(int positionStart, int itemCount) 批量添加。刷新数据                    public final void notifyItemRangeInserted(int positionStart, int itemCount)                //调用adapter. notifyItemRemoved(int position) 第position个被删除的时候刷新,同样会有动画。                    public final void notifyItemRemoved(int position)                //调用adapter.notifyItemRangeRemoved(int positionStart, int itemCount) 批量删除 刷新数据                    public final void notifyItemRangeRemoved(int positionStart, int itemCount)                */            }            @Override            public boolean isLongPressDragEnabled() {                return true;//返回true则为所有item都设置可以拖拽            }        });        //itemTouchHelper需要与recyclerView绑定才有效果,在recyclerView初始化的时候调用        itemTouchHelper.attachToRecyclerView(recyclerView);        //----------------------------------------------------------------------------    }    //初始化数据    private void initData() {        for (int i=1; i < 100; i++) {            Person person = new Person("zhaosi" + i, i);            personList.add(person);        }    }}

Person 类只有个name 和age两个字段,这里就不写代码了。

自定义一个适配器PersonAdapter 来进行创建item view以及绑定数据

class PersonAdapter extends RecyclerView.Adapter {    public interface OnRecyclerViewListener {        void onItemClick(int position);        boolean onItemLongClick(int position);     }    private static final String TAG = PersonAdapter.class.getSimpleName();    private OnRecyclerViewListener onRecyclerViewListener;    private List<Person> list;    //构造函数    public PersonAdapter(List<Person> list) {        this.list = list;    }    public void setOnRecyclerViewListener(OnRecyclerViewListener onRecyclerViewListener) {        this.onRecyclerViewListener = onRecyclerViewListener;    }    /**     * 这个方法主要生成为每个Item inflater出一个View,但是该方法返回的是一个ViewHolder。     * 方法是把View直接封装在ViewHolder中,然后我们面向的是ViewHolder这个实例     * */    @Override    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {        Log.d(TAG, "onCreateViewHolder, i: " + viewType);        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.person_item, null);        LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);        view.setLayoutParams(lp);        return new PersonViewHolder(view);    }    /**     * 这个方法主要用于适配渲染数据到View中。方法提供给你了一个viewHolder,而不是原来的convertView。     */    @Override    public void onBindViewHolder(RecyclerView.ViewHolder vholder, int position) {        Log.d(TAG, "onBindViewHolder, i: " + position + ", viewHolder: " + vholder);        PersonViewHolder holder = (PersonViewHolder) vholder;        holder.position = position;        Person person = list.get(position);        holder.nameTv.setText(person.getName());        holder.ageTv.setText(person.getAge() + "岁");    }    @Override    public int getItemCount() {        return list.size();    }    class PersonViewHolder extends RecyclerView.ViewHolder {        public View rootView;        public TextView nameTv;        public TextView ageTv;        public int position;        public PersonViewHolder(View view) {            super(view);            //通过id  加载控件            nameTv = (TextView) itemView.findViewById(R.id.recycler_view_test_item_person_name_tv);            ageTv = (TextView) itemView.findViewById(R.id.recycler_view_test_item_person_age_tv);            rootView = itemView.findViewById(R.id.recycler_view_test_item_person_view);            //item点击事件监听            rootView.setOnClickListener(new View.OnClickListener() {                @Override                public void onClick(View v) {                    if (null != onRecyclerViewListener) {                        onRecyclerViewListener.onItemClick(position);                    }                }            });            //item长按事件监听            rootView.setOnLongClickListener(new View.OnLongClickListener() {                @Override                public boolean onLongClick(View v) {                    if(null != onRecyclerViewListener){                        return onRecyclerViewListener.onItemLongClick(position);                    }                    return false;                }            });        }    }}

每个item的布局person_item.xml

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:id="@+id/recycler_view_test_item_person_view"    android:orientation="vertical"    android:layout_width="match_parent"    android:layout_height="wrap_content"    android:padding="15dp"    android:background="#aa00cc"  >    <TextView        android:id="@+id/recycler_view_test_item_person_name_tv"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:textSize="18sp"        android:background="#cc55aa" />    <TextView        android:id="@+id/recycler_view_test_item_person_age_tv"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:paddingLeft="5dp"        android:background="#cc33bb"        android:textSize="15sp" /></LinearLayout>
0 0