• 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

  • 相关阅读:
    【Log Explorer】查看和恢复数据库数据
    【MSMQ】消息队列(Message Queue)简介及其使用
    【核心对象】我心目中的Asp.net核心对象
    【SQL Server】CROSS APPLY和OUTER APPLY的应用详解
    【批处理】时间处理
    15件事造就有理想的程序员
    IE8下定义IE=EmulateIE7与IE=7的区别
    【批处理】创建快捷方式
    Ghost备份出错导致磁盘空间被占用
    【AJAX】反向Ajax第1部分:Comet介绍
  • 原文地址:https://www.cnblogs.com/yjbjingcha/p/7086594.html
Copyright © 2020-2023  润新知