当前位置: 代码迷 >> Android >> Android新控件RecyclerView剖解
  详细解决方案

Android新控件RecyclerView剖解

热度:25   发布时间:2016-04-27 23:29:37.0
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这个方法变为了onCreateViewHolderViewHolder更适合多种子布局的列表,尤其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的布局很简单,只有一个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

 

版权声明:本文为博主原创文章,未经博主允许不得转载。

  相关解决方案