美文网首页
重学RecyclerView (一) 基础入门

重学RecyclerView (一) 基础入门

作者: 张哲1111 | 来源:发表于2017-11-22 12:23 被阅读9次

    最近几年的android 版本更新,从影响深远的角度上来说,android L推出的Recyclerview 是对广大开发者影响最大的。因为平日开发中我们开发者用的最多的莫过于用listview 展示大量数据,百分之九十九点九的app都会用到listview。虽然listview 有很多不足,但是如此广泛的应用也衍生出了很多的优秀开源类库来加强listview。所以开发者们也乐于用listview。然而,事情发生了变化,在recyclerview面世之后。说recyclerview 各种好处的有,也有很多人说不好用,我当时刚刚转行干android开发,还是菜鸟阶段,所以属于后者啦,尴尬 ,,,但是过去两年的使用回顾这期间慢慢尝试使用,中间经历过好多次的使用不得法,而再次转向listview的大旗下(鄙视我吧 ,因为我菜 )。现在用的多了,但是感觉知识还是很不系统,总感觉学艺不精,我们那边的土话叫,一瓶不满半瓶晃荡。所以呀,打算开始输出一下我我的储备,话说输出也是学习啊!机智,路过的看官拍砖点赞随意。

    一 .不说recyclerview是来取代listview的吗?到底怎么替换的?

    本着从小白到进阶的路径

    首先我们在gradle文件中依赖进来recyclerview

    implementation 'com.android.support:recyclerview-v7:26.1.0'
    

    在创建activity,和他的布局文件 ,加入recyclerview

    MainActivity.java
    
    package com.example.processapp;
    
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.support.v7.widget.RecyclerView;
    
    
    import java.util.ArrayList;
    
    public class MainActivity extends AppCompatActivity {
    
    private RecyclerView recyclerView;
      @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        recyclerView = ((RecyclerView) 
     findViewById(R.id.recyclerview));
      
        }
      }
    

    创建用于显示的假数据

    public class PersonBean {
    private String name;
    private String avatar;
    
    public String getName() {
        return name;
    }
    
    public void setName(String name) {
        this.name = name;
    }
    
    public String getAvatar() {
        return avatar;
    }
    
    public void setAvatar(String avatar) {
        this.avatar = avatar;
    }
    }
    

    生产假数据的工具类

    public class PersonDataServer {
    /**
     * 获取假数据list
     * @param size
     * @return
     */
    public static ArrayList<PersonBean> getSampleList(int size){
        ArrayList<PersonBean> list = new ArrayList<>();
        for (int i = 0; i < size; i++) {
            PersonBean person = new PersonBean();
            person.setName("ReRe"+i);
            person.setAvatar("http://7xi8d6.com1.z0.glb.clouddn.com/20171120074925_ZXDh6l_joanne_722_20_11_2017_7_49_16_336.jpeg");
            list.add(person);
        }
        return list;
    }
    }
    

    至此 是不是和之前写listview的流程一样一样的 ?那接下来就是写适配器和viewhodler了呗?对的,没错,适配器和和viewholder 总该和listview 不同了吧?是的没错。但还是很相似的,为了让刚从listview转变过来的同学易于接受,我就还是按listview的思路来写喽。

    首先是viewhodler,ViewHolder和listview的大体上和listview是一样的 ,但是不是一样儿一样儿的。哈哈,不同点是你必须继承自 RecyclerView.ViewHolder,这是谷歌团队想统一化viewhodler的写法,避免之前listview 各种各样的写法 ,在性能和也达到官方的一样。

    代码:
    我们先建立一个布局文件,上面放置一个显示图片的imageview 和一个显示名字的textview

    item_person.xml
    
    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal"
    android:padding="10dp"
    >
    <ImageView
        android:id="@+id/thumb"
        android:layout_width="100dp"
        android:layout_height="100dp" />
    <TextView
        android:id="@+id/tv_name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_vertical"
        android:textColor="#000"
        android:typeface="sans"
        android:textSize="30sp"
        />
    </LinearLayout>
    

    PersonViewHolder继承 RecyclerView.ViewHolder,并复写构造方法,其他的和写listview的hodler是一样的 。

    PersonViewHolder.java
    public class PersonViewHolder extends RecyclerView.ViewHolder {
    protected ImageView mThumb;
    protected TextView mTvName;
    
    public PersonViewHolder(View itemView) {
        super(itemView);
    
        mThumb = (ImageView) itemView.findViewById(R.id.thumb);
        mTvName = (TextView) itemView.findViewById(R.id.tv_name);
    }
    }
    

    目前为止和listview不同的只有两处,简单吧?
    接下来是适配器,同样是为了统一开发者的写法和优化recyclerview 的性能,谷歌官方同样要求你的adapter要继承自 RecyclerView.Adapter<VH> ,看吧,又是RecyclerView的内部类都给你写好了,你直接继承用就行了,那个泛型就是刚才定义的viewhodler 类 这样适配器和viewhodler 就联系起来了 ,然后重写相关方法,
    卡卡卡。发现什么没有?和继承BaseAdapter有什么区别?
    我直接贴了实现的代码。

    package com.example.processapp;
    
    import android.content.Context;
    import android.support.v7.widget.RecyclerView;
    import android.view.LayoutInflater;
    import android.view.ViewGroup;
    
    import com.example.processapp.data.PersonBean;
    import com.squareup.picasso.Picasso;
    
    import java.util.ArrayList;
    
    /**
    * Created by zhangzhe on 2017/11/22.
     */
    
    public class PersonAdapter extends RecyclerView.Adapter<PersonViewHolder> {
    private Context mContext;
    private ArrayList<PersonBean> mDatas;
    private LayoutInflater inflater;
    
    public PersonAdapter(Context mContext, ArrayList<PersonBean> mDatas) {
        this.mContext = mContext;
        this.mDatas = mDatas;
        this.inflater = LayoutInflater.from(mContext);
    }
    
    @Override
    public PersonViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        return new PersonViewHolder(inflater.inflate(R.layout.item_person,parent,false));
    }
    
    @Override
    public void onBindViewHolder(PersonViewHolder holder, int position) {
        PersonBean person = mDatas.get(position);
        holder.mTvName.setText(person.getName());
        Picasso.with(mContext).load(person.getAvatar()).into(holder.mThumb);
    
    }
    
    @Override
    public int getItemCount() {
        return mDatas == null ?0 :mDatas.size();
    }
    }
    

    从网上找了个继承自baseAdapter的代码,发现了什么小伙子们?我们发现recyclerview的adapter把之前我们自己实现缓存viewhodler的逻辑封装在父类里面了,让子类只去生产必要的viewhodler,和设置数据到viewhodler的实现就行了,是不是觉得好多代码不用写了,而且从性能的角度来说,之前我们大部分只是用tag的方式来缓存,谷歌的实现咱们不去猜测,但肯定比这牛逼是不是,仔细想想而且写法上和用listview 还是差不多的,赶紧用起来吧!!


    image.png

    现在回到MainAcitivity中,我们开始正经的写代码了。

    package com.example.processapp;
    
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.support.v7.widget.LinearLayoutManager;
    import android.support.v7.widget.RecyclerView;
    
    import com.example.processapp.data.PersonBean;
    import com.example.processapp.data.PersonDataServer;
    
    import java.util.ArrayList;
    
    public class MainActivity extends AppCompatActivity {
    
    private RecyclerView recyclerView;
    private LinearLayoutManager layoutManager;
    private PersonAdapter personAdapter;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        recyclerView = ((RecyclerView) findViewById(R.id.recyclerview));
    //必须给recyclerview 设置layoutmanager 不设置的话啥也显示不出来
        layoutManager = new LinearLayoutManager(this);
        recyclerView.setLayoutManager(layoutManager);
    //下面不用废话了
        ArrayList<PersonBean> sampleList = PersonDataServer.getSampleList(10);
        personAdapter = new PersonAdapter(this, sampleList);
        recyclerView.setAdapter(personAdapter);
    
    }
    }
    

    我们连上手机跑起来

    image.png

    刷的一下。。。。出来了


    image.png

    是不是和listview 一毛一样。小成功。

    小结:

    示例代码在:https://github.com/williamzz2015/ReRecyclerView ,TAG [基础用法]

    recyclerview 基础使用可以说是和listview的用法很相似,如果现在还没开始用的开发者同行,希望通过此篇小文快速了解并可以立刻使用起来,因为大家都知道recyclerview的用处不仅于此,此文算是快速demo,让还没接触的不望而却步。如有写的不对的地方,非常想听到指责,谢谢

    相关文章

      网友评论

          本文标题:重学RecyclerView (一) 基础入门

          本文链接:https://www.haomeiwen.com/subject/dtpnvxtx.html