Android新控件RecyclerView剖析

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

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


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


一、RecyclerView 

替代ListViewRecyclerView使ViewHolder标准化,在ListView中。convertView是复用的。在RecyclerView中。是把ViewHolder作为缓存的单位,convertView作为ViewHolder的成员变量保持在ViewHolder中。也就是说。如果没有屏幕显示10个条目。则会创建10ViewHolder缓存起来。每次复用的是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"

 

<TextView 

android:id="@+id/text" 

android:layout_width="match_parent" 

android:layout_height="match_parent" 

android:gravity="center" 

/> 

</FrameLayout> 

item的布局非常easy,仅仅有一个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

 

posted on 2017-06-27 18:21  yjbjingcha  阅读(237)  评论(0编辑  收藏  举报

导航