Android App开发中使用RecyclerView实现Gallery画廊的实例

2019-12-10 18:27:32于海丽

可以看到数据适配器与BaseAdapter比较发生了相当大的变化,主要有3个方法:

  • getItemCount 这个不用说,获取总的条目数
  • onCreateViewHolder 创建ViewHolder
  • onBindViewHolder 将数据绑定至ViewHolder

    可见,RecyclerView对ViewHolder也进行了一定的封装,但是如果你仔细观察,你会发出一个疑问,ListView里面有个getView返回View为Item的布局,那么这个Item的样子在哪控制?

    其实是这样的,我们创建的ViewHolder必须继承RecyclerView.ViewHolder,这个RecyclerView.ViewHolder的构造时必须传入一个View,这个View相当于我们ListView getView中的convertView (即:我们需要inflate的item布局需要传入)。
    还有一点,ListView中convertView是复用的,在RecyclerView中,是把ViewHolder作为缓存的单位了,然后convertView作为ViewHolder的成员变量保持在ViewHolder中,也就是说,假设没有屏幕显示10个条目,则会创建10个ViewHolder缓存起来,每次复用的是ViewHolder,所以他把getView这个方法变为了onCreateViewHolder。有兴趣的自己打印下Log,测试下。
    最后在Activity中使用:

    package com.example.zhy_horizontalscrollview03; 
     
    import java.util.ArrayList; 
    import java.util.Arrays; 
    import java.util.List; 
     
    import android.app.Activity; 
    import android.os.Bundle; 
    import android.support.v7.widget.LinearLayoutManager; 
    import android.support.v7.widget.RecyclerView; 
    import android.view.Window; 
     
    public class MainActivity extends Activity 
    { 
     
      private RecyclerView mRecyclerView; 
      private GalleryAdapter mAdapter; 
      private List<Integer> mDatas; 
       
       
      @Override 
      protected void onCreate(Bundle savedInstanceState) 
      { 
        super.onCreate(savedInstanceState); 
        requestWindowFeature(Window.FEATURE_NO_TITLE); 
        setContentView(R.layout.activity_main); 
         
        initDatas(); 
        //得到控件 
        mRecyclerView = (RecyclerView) findViewById(R.id.id_recyclerview_horizontal); 
        //设置布局管理器 
        LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this); 
        linearLayoutManager.setOrientation(LinearLayoutManager.HORIZONTAL); 
        mRecyclerView.setLayoutManager(linearLayoutManager); 
        //设置适配器 
        mAdapter = new GalleryAdapter(this, mDatas); 
        mRecyclerView.setAdapter(mAdapter); 
     
         
      } 
     
     
      private void initDatas() 
      { 
        mDatas = new ArrayList<Integer>(Arrays.asList(R.drawable.a, 
            R.drawable.b, R.drawable.c, R.drawable.d, R.drawable.e, 
            R.drawable.f, R.drawable.g, R.drawable.h, R.drawable.l)); 
      } 
     
    }