使用RecyclerView


tags: 新建,模板,小书匠

RecyclerView 是 Android 团队新推出的控件,不只能轻松实现 ListView 的一样的效果,还优化了 ListView 中许多不足之处。
目前 Android 团队是更推荐咱们使用 Recycler 的。java

为了能在多版本的 Android 系统中使用,Android 团队把它定义在了 support 库中,想要使用须要在 build.gradle 中添加依赖库。android

在 Android Studio 中选用 Project Files 视图,打开 app/build.gradle 文件,在 dependencies 闭包中添加
compile 'com.android.support:recyclerview-v7:24.2.1'闭包

而后点一下 Sncy Now 来进行同步,而后修改 activity_main.xmlapp

<android.support.v7.widget.RecyclerView
        android:id="@+id/hero_recycler"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

这里 AS(Android Studio)很是方便的提示了剩下的代码,很方便函数

而后像 ListView 同样,为它设计一个子项样式,新建一个 hero_item.xml
hero_item.xml布局

<ImageView
        android:id="@+id/hero_image"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:srcCompat="@mipmap/ic_launcher" />

    <TextView
        android:id="@+id/hero_text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_vertical"
        android:text="TextView" />

固然还要一个实体类用来作为 RecyclerView 的适配类型
Hero.javagradle

public class Hero {
    private String name;
    private int imageId;

    public Hero(String name, int imageId) {
        this.name = name;
        this.imageId = imageId;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void setImageId(int imageId) {
        this.imageId = imageId;
    }

    public String getName() {

        return name;
    }

    public int getImageId() {
        return imageId;
    }
}

而后就要为 Recycler 准备一个适配器了优化

新建一个 HeroAdapter.java,而后让这个适配器类继承 RecyclerView.Adapter,并将泛型指定为 HeroAdapter.ViewHolder。
其中 ViewHoler 是咱们在 HeroAdapter 定义的一个内部类ui

HeroAdapter.javathis

public class HeroAdapter extends RecyclerView.Adapter<HeroAdapter.ViewHolder> {

    private List<Hero> mHerolist;
    static class ViewHolder extends RecyclerView.ViewHolder {
        View heroView;
        ImageView hero_image;
        TextView hero_name;
        public ViewHolder(View itemView) {
            super(itemView);
            heroView=itemView;
            hero_image= (ImageView) itemView.findViewById(R.id.hero_image);
            hero_name= (TextView) itemView.findViewById(R.id.hero_text);
        }
    }

    public HeroAdapter(List<Hero> heroList){
        mHerolist=heroList;
    }

    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view= LayoutInflater.from(parent.getContext()).inflate(R.layout.hero_item,parent,false);
        ViewHolder holder=new ViewHolder(view);
        return holder;
    }

    public void onBindViewHolder(ViewHolder holder, int position) {
        Hero hero=mHerolist.get(position);
        holder.hero_image.setImageResource(hero.getImageId());
        holder.hero_name.setText(hero.getName());

    }

    public int getItemCount() {
        return mHerolist.size();
    }
}

上面代码看着不少,其实大部分 AS会帮咱们写好,而且代码逻辑清晰,很好理解。
首先定义一个内部类 ViewHolder,而后这个内部类要继承 RecyclerView.ViewHolder,而后要传入一个构造函数 View,这个参数一般是 RecyclerView 的子项最外层布局,因此咱们能够经过 findViewById 来获取布局中的实例。

接着要有个构造函数 HeroAdapter,做用是把 RecyclerView 的数据源传进来,并赋给一个全局变量,做为全局数据,由于咱们后续操做都须要这数据源。

最后是继承了 RecyclerView.Adapter 要重写的三个方法:

  • onCreateViewHolder 是用于建立 ViewHolder 实例的。
    咱们先把 hero_item.xml 加载进来
    代码已经在 ListView 那篇解释过了
    而后建立一个 ViewHodler 实例,并把加载出来的 View 布局添加到 ViewHoder 里面去,最后返回 ViewHodler 的实例。

  • onBindViewHolder 主要用来绑定数据
    咱们经过 position 得出当前项的数值,而后绑定便可。

  • getItemCount 用于告诉 RecyclerView 有多少项,直接返回数据源长度便可。




最后咱们来到 MainActivity.java 中
MainActivity.java

public class MainActivity extends AppCompatActivity {

    private List<Hero> heroList=new ArrayList<>();
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initHero();
       >>** RecyclerView recyclerView= (RecyclerView) findViewById(R.id.hero_recycler); **<<
        LinearLayoutManager layoutManager=new LinearLayoutManager(this);
        recyclerView.setLayoutManager(layoutManager);
        HeroAdapter heroAdapter=new HeroAdapter(heroList);
        recyclerView.setAdapter(heroAdapter);
    }
    public void initHero(){
        for (int i=0;i<2;i++) {
            Hero lin=new Hero("lin",R.drawable.b2);
            heroList.add(lin);
            Hero delia=new Hero("delia",R.drawable.b3);
            heroList.add(delia);
            Hero fire=new Hero("fire",R.drawable.b4);
            heroList.add(fire);
            Hero saber=new Hero("saber",R.drawable.b5);
            heroList.add(saber);
            Hero christina=new Hero("christina",R.drawable.b6);
            heroList.add(christina);
            Hero dva=new Hero("dva",R.drawable.b9);
            heroList.add(dva);
        }
    }
}

代码比较简单,就不解释了 ***

相关文章
相关标签/搜索