RecyclerView

Posted Fishbonell

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了RecyclerView相关的知识,希望对你有一定的参考价值。

  android系统在5.0版本推出了新控件——RecyclerView。RecyclerView几乎要将我们过去使用的ListView取代掉。因为我们不再需要自己管理一个带有static关键字的ViewHolder,不再需要控制Item的回收,同时,它也为我们提供了Item的添加和减除的动画接口。最后,最重要的是,它为ListView这样的,多项重复布局,提供了更好的解耦。将ListView这样的列表,拆解成了一个没有布局规则的可回收布局,和一个布局管理器。

  本系列将记录我学习使用RecyclerView的过程,希望通过这一次的学习,我能够用它完全地替代掉RecyclerView。

  首先看基本使用:

   RecyclerView的基本使用由4部分构成,分别是RecyclerView、Adapter、ViewHolder和LayoutManager。

  其中,Adapter负责ViewHolder、数据和RecyclerView三者的连接,而LayoutManager则管理了多个ViewHolder之间的关系。

  这里我写了一个简单的例子:

  ViewHolder:

import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.widget.TextView;

/**
 * Created by fishboneLsy on 2016/6/25.
 */
public class ItemViewHolder<T extends BaseBean> extends RecyclerView.ViewHolder {

    TextView textView;

    public ItemViewHolder(View itemView) {
        super(itemView);
        textView = (TextView) itemView.findViewById(R.id.item_textview_id);
    }

    public void bindViewHolder(T bean , int position){
        if (bean instanceof DataBean){
            textView.setText(((DataBean) bean).getName());
        }
    }
}

  我们在ViewHolder的构造方法中,获取Item子控件的实例。然后,自己编写一个public方法,用于连接数据和ViewHolder。

 

  Adapter:

import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import java.util.List;

/**
 * Created by fishboneLsy on 2016/6/25.
 */
public class RecyclerViewAdapter extends RecyclerView.Adapter<ItemViewHolder> {

    Context mContext;
    List<BaseBean> mDataList;

    public RecyclerViewAdapter(Context context , List<BaseBean> dataList){
        mContext = context;
        mDataList = dataList;
    }

    @Override
    public ItemViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(mContext).inflate(R.layout.recyclerview_item_layout , parent , false);
        return new ItemViewHolder(view);
    }

    @Override
    public void onBindViewHolder(ItemViewHolder holder, int position) {
        holder.bindViewHolder(mDataList.get(position) ,  position);
    }

    @Override
    public int getItemCount() {
        if (mDataList != null){
            return mDataList.size();
        }
        return 0;
    }
}

 

  Adapter中三个方法,分别是:

  获取ViewHolder实例,通常一个item在一个列表中只会调用一次;

  连接ViewHolder和数据,当item被回收又重新需要显示时,此方法会调用一次;

  获取RecyclerView管理的item个数,在setAdapter和adapter.notifyDataSetChanged时调用。

 

  最后来看一下RecyclerView的设置:

  

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.StaggeredGridLayoutManager;

import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity {

    RecyclerView recyclerView;
    RecyclerViewAdapter adapter;

    List<BaseBean> dataList;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        dataList = new ArrayList<>();

        recyclerView = (RecyclerView) findViewById(R.id.recycler_view_id);

        adapter = new RecyclerViewAdapter(this , dataList);
        recyclerView.setAdapter(adapter);

        RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(this);
        recyclerView.setLayoutManager(layoutManager);


        initTest();
        adapter.notifyDataSetChanged();

    }

    private void initTest(){
        for (int i = 0 ; i < 30 ; i++){
            dataList.add(new DataBean("position = " + i));
        }
    }
}

 

  

  这样,一个基本的类ListView列表就诞生了。目前来说,它的主要优势只有两个,一个是更好看的回收机制,另一个是自由的布局方式。

  缺点就一大堆了:没有HeaderView和FooterView、没有FastScroller等等。接下来,我们将逐步发现它更多的优点,并弥补它的缺陷。

  

 

 

 

 

 

 

  Done~

以上是关于RecyclerView的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Firebase 获取数据到 Recyclerview 中的片段?

从片段类中的对话框添加项目到recyclerview。

从其他片段添加新的 RecyclerView 项

为啥 recyclerview$adapter 在片段中为空

片段中的Android Studio RecyclerView [重复]

RecyclerView holder中的Android Google Maps动态片段