RecyclerView(一)

  Android系統在5.0版本推出了新控件——RecyclerView。RecyclerView幾乎要將咱們過去使用的ListView取代掉。由於咱們再也不須要本身管理一個帶有static關鍵字的ViewHolder,再也不須要控制Item的回收,同時,它也爲咱們提供了Item的添加和減除的動畫接口。最後,最重要的是,它爲ListView這樣的,多項重複佈局,提供了更好的解耦。將ListView這樣的列表,拆解成了一個沒有佈局規則的可回收佈局,和一個佈局管理器。java

  本系列將記錄我學習使用RecyclerView的過程,但願經過這一次的學習,我可以用它徹底地替代掉RecyclerView。android

  首先看基本使用:app

   RecyclerView的基本使用由4部分構成,分別是RecyclerView、Adapter、ViewHolder和LayoutManager。ide

  其中,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。this

 

  Adapter:spa

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中三個方法,分別是:code

  獲取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~

相關文章
相關標籤/搜索