RecylerView使用详解(分享整理)

来源:互联网 发布:知乎 dota2 编辑:程序博客网 时间:2024/06/05 23:52

RecylerView介绍

RecyclerView是support-v7包中的新组件,是一个强大的滑动组件,与经典的ListView相比,同样拥有item回收复用的功能,但是直接把viewholder的实现封装起来,用户只要实现自己的viewholder就可以了,该组件会自动帮你回收复用每一个item。

用它替代listview的原因有几个:

  • 封装了viewholder的回收复用;
  • RecyclerView使用布局管理器管理子view的位置,也就是说你再不用拘泥于ListView的线性展示方式,如果之后提供其他custom LayoutManager的支持,你能够使用复杂的布局来展示一个动态组件。
  • 自带了ItemAnimation,可以设置加载和移除时的动画,方便做出各种动态浏览的效果。

RecylerView在哪里

包名:android.support.v7.widget.RecyclerView

文件地址有两个
1:android-sdk/extras/android/m2repository/com/android/support/
recyclerview-v7
2:android-sdk/extras/android/support/v7/recyclerview

AndroidStudio中添加依赖

在build.gradle(Module:app)中添加:

    dependencies {            compile 'com.android.support:recyclerview-v7:21.0.0'    }

如何使用

layout文件中:

<?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:orientation="vertical"    >    <android.support.v7.widget.RecyclerView        android:id="@+id/view_recycler"        android:layout_width="match_parent"        android:layout_height="match_parent"        android:padding="5dp"        android:scrollbars="vertical"        ></android.support.v7.widget.RecyclerView></LinearLayout>

代码中:

        LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false);        mRecyclerView.setLayoutManager(linearLayoutManager);        RecyclerViewAdapter viewAdapter = new RecyclerViewAdapter(this, getListdata());        mRecyclerView.setAdapter(viewAdapter);public List<String> getListdata() {        ArrayList<String> strings = new ArrayList<>();        for (int i = 0; i < 100; i++) {            strings.add(i, i + "ddddd");        }        return strings;    }

RecyclerView.Adapter介绍

package com.ht.fyforandroid;import android.content.Context;import android.support.v4.widget.TextViewCompat;import android.support.v7.widget.RecyclerView;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.TextView;import java.util.ArrayList;import java.util.List;/** * Created by niehongtao on 16/8/14. */public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.ViewHolder> {    private List<String> dataList;    private LayoutInflater mInflater;    public RecyclerViewAdapter(Context context, List<String> dataList) {        this.dataList = dataList;        mInflater = LayoutInflater.from(context);    }    @Override    public RecyclerViewAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {        View view = mInflater.inflate(R.layout.item_recycler_view, parent, false);        return new ViewHolder(view);    }    @Override    public void onBindViewHolder(RecyclerViewAdapter.ViewHolder holder, int position) {        holder.tv.setText(dataList.get(position));    }    @Override    public int getItemCount() {        return dataList.size();    }    static class ViewHolder extends RecyclerView.ViewHolder {        private TextView tv;        public ViewHolder(View itemView) {            super(itemView);            tv = (TextView) itemView.findViewById(R.id.tv_name);        }    }}

3种LayoutManager

LinearLayoutManager:线性布局,支持横向和纵向布局。
public LinearLayoutManager(Context context)
public LinearLayoutManager(Context context, int orientation, boolean reverseLayout)

GridLayoutManager: Grid布局
public GridLayoutManager(Context context, int spanCount)
public GridLayoutManager(Context context, int spanCount, int orientation, boolean reverseLayout)

StaggeredGridLayoutManager: 瀑布流布局
public StaggeredGridLayoutManager(int spanCount, int orientation)

参数:
orientation:设置布局方向,参数:HORIZONTAL 或者 VERTICAL
spanCount:设置行列数值
reverseLayout:设置是否反向布局,默认false横向时从左向右,纵向时从上到下

添加点击事件

http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2015/0327/2647.html

数据变化刷新

public final void notifyDataSetChanged()
public final void notifyItemChanged(int position)
public final void notifyItemRangeChanged(int positionStart, int itemCount)
public final void notifyItemInserted(int position)
public final void notifyItemMoved(int fromPosition, int toPosition)
public final void notifyItemRangeInserted(int positionStart, int itemCount)
public final void notifyItemRemoved(int position)
public final void notifyItemRangeRemoved(int positionStart, int itemCount)

添加删除数据动画

1   Person person = new Person(i, "WangJie_" + i, 10 + i);2   adapter.notifyItemInserted(2);3   personList.add(2, person);4   adapter.notifyItemRangeChanged(2, adapter.getItemCount());

如上代码:
Line2:表示在position为2的位置,插入一条数据,这个时候动画开始执行。
Line3: 表示在数据源中position为2的位置新增一条数据(这个才是真正的新增数据)。
Line4: 为什么要刷新position为2以后的数据呢?因为,在position为2的位置插入了一条数据后,新数据的position变成了2,那原来的position为2的应该变成了3,3的应该变成了4,所以2以后的所有数据的position都发生了改变,所以需要把position2以后的数据都要刷新。理论上是这样,但是实际上刷新的数量只有在屏幕上显示的position为2以后的数据而已。如果这里使用notifyDataSetChanged()来刷新屏幕上显示的所有item可以吗?结果不会出错,但是会有一个问题,前面调用了notifyItemInserted()方法后会在执行动画,如果你调用notifyDataSetChanged()刷新屏幕上显示的所有item的话,必然也会刷新当前正在执行动画的那个item,这样导致的结果是,前面的动画还没执行完,它马上又被刷新了,动画就看不见了。所以只要刷新2以后的item就可以了。

设置Item动画效果

mRecyclerView.setItemAnimator(new DefaultItemAnimator());

参考资料

https://github.com/CymChad/CymChad.github.io

0 0
原创粉丝点击