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~