美文网首页
RecyclerView(一)基本使用

RecyclerView(一)基本使用

作者: 大灰狼zz | 来源:发表于2018-11-05 17:17 被阅读0次

添加依赖

要使用RecyclerView,由于该控件并不在Andorid SDK中的,而是在support v7包中,因此我们要手动添加该控件。
在build.gradle中添加如下依赖:

//RecyclerView
compile 'com.android.support:recyclerview-v7:27.1.1'

RecyclerView中几个重要的类

1、RecyclerView.Adapter 适配器,为RecyclerView提供数据。
2、RecyclerView.LayoutManager 布局管理器,为RecyclerView实现不同布局效果。
3、RecyclerView.ItemDecoration item装饰类,为RecyclerView的item添加分割线等。
4、RecyclerView.ItemAnimator item动画类,实现item添加或删除时的动画。

这些类都是抽象类,如果利用不同的实现类,我们就能高度定制RecyclerView。

RecycylerView并没有处理点击事件的监听器,所以如果要监听RecycylerView的点击事件,我们需要自己写监听器

简单使用

首先需要写两个简单的布局文件:

这两个布局都非常简单,MainActivity中就一个RecycylerView,item布局中也只有一个TextView。
MainActivity的布局:

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

item布局:

<?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="wrap_content"
    android:layout_margin="5dp"
    android:background="#00CED1"
    android:orientation="vertical">
 
    <TextView
        android:id="@+id/tv_test"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:textColor="#000000"
        android:textSize="24sp" />
</LinearLayout>

2、适配器

RecyclerView的适配器,继承自RecyclerView.Adapter,下面再讲它的几个方法。


public class TestAdapter extends RecyclerView.Adapter<TestAdapter.MyViewHolder> {
    private List<String> stringList;
 
    public TestAdapter(List<String> stringList) {
        this.stringList = stringList;
    }
 
    @Override
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_test_recyclerview, parent, false);
        MyViewHolder vh = new MyViewHolder(v);
        return vh;
    }
 
    @Override
    public void onBindViewHolder(final MyViewHolder holder, int position) {
        holder.tvTest.setText(stringList.get(position));
    }
 
 
    @Override
    public int getItemCount() {
        return stringList.size();
    }
 
    class MyViewHolder extends RecyclerView.ViewHolder {
        public TextView tvTest;
 
        public MyViewHolder(View itemView) {
            super(itemView);
            tvTest = (TextView) itemView.findViewById(R.id.tv_test);
        }
    }
}

适配器中的几个抽象方法:

public abstract VH onCreateViewHolder(ViewGroup parent, int viewType);
public abstract void onBindViewHolder(VH holder, int position);
public abstract int getItemCount();

onCreateViewHolder()该方法会在RecyclerView需要展示一个item的时候回调,重写该方法,使ViewHolder加载item的布局,布局复用,提高性能,就ListView的优化一样,只不过RecyclerView把这个集成到官方方法中了。

onBindViewHolder()该方法是填充绑定item数据的。

getItemCount()该方法是返回item的数量。

3、MainActivity中创建并添加数据

MainActivity:

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        RecyclerView rvTest = (RecyclerView) findViewById(R.id.rv_test);
        // 如果可以确定每个item的高度是固定的,设置这个选项可以提高性能
        rvTest.setHasFixedSize(true);
        //竖直排列
        LinearLayoutManager mLinearLayoutManager = new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false);
//        GridLayoutManager mGridLayoutManager = new GridLayoutManager(this, 3, GridLayoutManager.VERTICAL, false);
//        StaggeredGridLayoutManager mStaggeredGridLayoutManager = new StaggeredGridLayoutManager(3, StaggeredGridLayoutManager.VERTICAL);
        rvTest.setLayoutManager(mLinearLayoutManager);
        TestAdapter mTestAdapter = new TestAdapter(getList());
        rvTest.setAdapter(mTestAdapter);
    }
 
 
 
    private List<String> getList() {
        List<String> stringList = new ArrayList<>();
        for (int i = 0; i < 100; i++) {
            String string = "Item " + i;
            stringList.add(string);
        }
        return stringList;
    }
}
经过上面的操作,我们已经可以成功使用RecycylerView显示数据了,如果不出现失误的话,应该会出现下面的结果: image.png

4、布局管理器

LinearLayoutManager

刚才使用的LinearLayoutManager是线性布局管理器,也就是跟线性布局差不多,可以让item呈垂直或者水平排列。
LinearLayoutManager有两种构造方法:

public LinearLayoutManager(Context context) ;

public LinearLayoutManager(Context context, int orientation, boolean reverseLayout);

第一个参数是Context不必多说,第二个参数orientation是布局方向,其值有LinearLayoutManager.HORIZONTAL(水平方向)和LinearLayoutManager.VERTICAL(垂直方向),第三个参数reverseLayout是是否逆向布局,如果为true,则为逆向布局,举个例子,如果是水平布局,然后设置第三个参数为true,那么RecycylerView将是从右向左滑动,具体效果大家可以试一下。

GridLayoutManager

GridLayoutManager是表格布局管理器,也就跟表格布局差不多,使用它的效果跟GridView的效果差不多
GridLayoutManager也有两种构造方法:

public GridLayoutManager(Context context, int spanCount);

public GridLayoutManager(Context context, int spanCount, int orientation,boolean reverseLayout);

第一个参数是上下文,第二个参数spanCount是行数或列数,第三个orientation是布局方向,第四个参数reverseLayout是是否逆向布局,跟LinearLayoutManager差不多

注释掉LinearLayoutManager那一行,再打开GridLayoutManager,设置mGridLayoutManager。

//        LinearLayoutManager mLinearLayoutManager = new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false);
        GridLayoutManager mGridLayoutManager = new GridLayoutManager(this, 3, GridLayoutManager.VERTICAL, false);
//        StaggeredGridLayoutManager mStaggeredGridLayoutManager = new StaggeredGridLayoutManager(3, StaggeredGridLayoutManager.VERTICAL);
        TestAdapter mTestAdapter = new TestAdapter(getList());
        rvTest.setLayoutManager(mGridLayoutManager);

显示效果


image.png

StaggeredGridLayoutManager

StaggeredGridLayoutManager是瀑布流布局管理器,瀑布流效果相信大家现在经常看到,如果只使用LIstView或者GridView的话,实现起来是很麻烦的,但是使用RecycylerView就会简单很多,只要使用这个瀑布流布局管理器就行了

StaggeredGridLayoutManager只有一种构造方法:

public StaggeredGridLayoutManager(int spanCount, int orientation);

第一个参数spanCount是行数或列数,第二个参数orientation是布局方向。

注释掉LinearLayoutManager那一行,再打开StaggeredGridLayoutManager,设置mStaggeredGridLayoutManager 。


//        LinearLayoutManager mLinearLayoutManager = new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false);
//        GridLayoutManager mGridLayoutManager = new GridLayoutManager(this, 3, GridLayoutManager.VERTICAL, false);
        StaggeredGridLayoutManager mStaggeredGridLayoutManager = new StaggeredGridLayoutManager(3, StaggeredGridLayoutManager.VERTICAL);
        TestAdapter mTestAdapter = new TestAdapter(getList());
        rvTest.setLayoutManager(mStaggeredGridLayoutManager);

单纯使用StaggeredGridLayoutManager效果也跟GridLayoutManager差不多,没有出现瀑布流效果,所以还需要修改每一个item的height(如果是横向布局的话,则修改width),我们需要将Adapter中的OnBindViewHolder()方法修改一下。

@Override
public void onBindViewHolder(MyViewHolder holder, int position) {
    holder.tvTest.setText(stringList.get(position));
    ViewGroup.LayoutParams lp = holder.itemView.getLayoutParams();
    lp.height = (int) (100 + Math.random() * 300);
    holder.itemView.setLayoutParams(lp);
}

添加几行代码,即随机设置item的height。
显示效果:


image.png

相关文章

网友评论

      本文标题:RecyclerView(一)基本使用

      本文链接:https://www.haomeiwen.com/subject/qlquzftx.html