传智·没羽箭(传智播客北京校区Java学院高级讲师)

个人简介:APKBUS专家之一,黑马技术沙龙会长,在移动领域有多年的实际开发和研究经验,精通HTML5、Oracle、J2EE 、Java Web编程、对Android应用开发与平台开发有较深入研究。从基础到高级的课程中,授课风格深受学员的喜爱。


Android L版本中新增了RecyclerView,用于显示复杂视图的新增Widget。


一、RecyclerView 

替代ListView的RecyclerView使ViewHolder标准化,在ListView中,convertView是复用的,在RecyclerView中,是把ViewHolder作为缓存的单位,convertView作为ViewHolder的成员变量保持在ViewHolder中,也就是说,假设没有屏幕显示10个条目,则会创建10个ViewHolder缓存起来,每次复用的是ViewHolder,所以他把getView这个方法变为了onCreateViewHolder。ViewHolder更适合多种子布局的列表,尤其IM的对话列表。RecyclerView不提供setOnItemClickListener方法,你可以在ViewHolder中添加事件。RecyclerView的使用可以参考《Material Design UIWidgets》。


二、RecyclerView可以实现横向、纵向滑动视图 

每个item的布局如下:

<?xml version="1.0" encoding="utf-8"?> 
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="72dp"
android:layout_margin="3dp"
android:background="#0000ff"
>
TX

item的布局很简单,只有一个TextView,然后需要使用到RecyclerView,所以需要把support v7添加到class path,并在布局中添加该控件:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent"
android:layout_height="match_parent" >
<android.support.v7.widget.RecyclerView
android:id="@+id/recyclerView"
android:layout_width="match_parent"
android:layout_height="match_parent"
/>
</RelativeLayout>

然后在onCreate中: 

mDatas = new ArrayList<>(); 
for (int i = 0; i < 100; i++) {
mDatas.add("我是item---" + i);
}
LinearLayoutManager manager = new LinearLayoutManager
(this,LinearLayoutManager.HORIZONTAL,false);
adapter = new SimpleAdapter(this, mDatas);
recyclerView.setAdapter(adapter);
recyclerView.setLayoutManager(manager);
recyclerView.setItemAnimator(new DefaultItemAnimator());


直接看代码:

Public class  
SimpleAdapter extends RecyclerView.Adapter<SimpleAdapter.MyViewHolder> {
private Context mContext;
private List<String> mDatas;
private final LayoutInflater inflater;
public SimpleAdapter(Context mContext, List<String> mDatas) {
this.mContext = mContext;
this.mDatas =mDatas;
inflater = LayoutInflater.from(mContext);
}
@Override
public MyViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
View view = inflater.inflate
(R.layout.item_main, viewGroup, false);
MyViewHolder viewHolder = new MyViewHolder(view);
return viewHolder;
}
@Override
public void onBindViewHolder(final MyViewHolder holder, final int position) {
holder.text.setText(mDatas.get(position));
}
@Override
public int getItemCount() {
return mDatas.size();
}
class MyViewHolder extends RecyclerView.ViewHolder{
public final
TextView text;
public MyViewHolder(View itemView) {
super(itemView);
text = (TextView) itemView.findViewById(R.id.text);
}
}
}

如上代码所示:

 

publicRecyclerView.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i)

 

这个方法主要生成为每个Item inflater出一个View,但是该方法返回的是一个ViewHolder。方法是把View直接封装在ViewHolder中,然后我们面向的是ViewHolder这个实例,当然这个ViewHolder需要我们自己去编写,直接省去了当初的convertView.setTag(holder)和convertView.getTag()这些繁琐的步骤。


public voidonBindViewHolder(RecyclerView.ViewHolder viewHolder, int i)这个方法主要用于适配渲染数据到View中。方法提供给你了一个viewHolder,而不是原来的convertView。