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); } } }
代码比较简单,就不解释了 ***