使用RecyclerView
tags: 新建,模板,小书匠
RecyclerView 是 Android 团队新推出的控件,不仅能轻松实现 ListView 的同样的效果,还优化了 ListView 中许多不足之处。
目前 Android 团队是更推荐我们使用 Recycler 的。
为了能在多版本的 Android 系统中使用,Android 团队把它定义在了 support 库中,想要使用需要在 build.gradle 中添加依赖库。
在 Android Studio 中选用 Project Files 视图,打开 app/build.gradle 文件,在 dependencies 闭包中添加
compile 'com.android.support:recyclerview-v7:24.2.1'
然后点一下 Sncy Now 来进行同步,然后修改 activity_main.xml
<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.java
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 定义的一个内部类
HeroAdapter.java
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);
}
}
}
代码比较简单,就不解释了
最新文章
- Hibernate Hql 总结(2)---laoyang
- CSS实现各种形状
- Javascript之旅——第九站:吐槽function
- canvas动画基础
- Visual C++ 设置适合自己的解决方案目录结构
- CodeForces 474.D Flowers
- erlang局域网内节点通信——艰难四步曲 (转)
- 如何把由js生成的内容水平居中?
- 关于 JavaScript 数据类型判断
- C#的dictionary使用总结
- jquery keypress事件浏览器兼容性
- linux学习笔记之进程
- [Ruby]How to create singleton class ?
- 使用Idea作为go的IDE
- spark2.2 DataFrame的一些算子操作
- ASP.NET的checkboxlist,RadioButtonList,FileUpload,image控件的综合使用
- 第四次作业之oop
- 转载:margin外边距合并问题以及解决方式
- day38数据库MySQL基础
- spring 之 factory-bean &; factory-method