RecyclerView的特點(diǎn)
- 自帶ViewHolder
- 橫向皆辽,豎向、列表蹦哼,多行列表和流式皆可
- 分割線控制方便
使用之前
導(dǎo)入這個(gè)md設(shè)計(jì)包
compile 'com.android.support:design:23.4.0'
如何使用
XML的布局
- activity_main.xml
<android.support.v7.widget.RecyclerView
android:id="@+id/recyclerView"
android:layout_width="match_parent"
android:layout_height="match_parent">
</android.support.v7.widget.RecyclerView>
- item.xml
<TextView
android:id="@+id/textView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="子布局" />
代碼部分1
首先必須要設(shè)置一個(gè)LayoutManager
recyclerView.setLayoutManager();
這個(gè)LayoutManager有三種模式 :
1.線性流模式 : LinearLayoutManager
2.網(wǎng)格流模式 : GridLayoutManager
3.瀑布流模式 : StaggerGridLayoutManager
- 如果是 LinearLayoutManager 模式 :
//可以通過下面方法設(shè)置垂直或者水平
linearLayoutManager.setOrientation(OrientationHelper.VERTICAL);
linearLayoutManager.setOrientation(OrientationHelper.HORIZONTAL);
- 如果是 GridLayoutManager 模式 :
//2表示一排顯示2個(gè)網(wǎng)格,如果是3,一排就顯示3個(gè)網(wǎng)格
GridLayoutManager gridLayoutManager = new GridLayoutManager(getContext(),2);
//這個(gè)是設(shè)置當(dāng)?shù)趲着艜r(shí),占用多少個(gè)網(wǎng)格,從0開始
gridLayoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
@Override
public int getSpanSize(int position) {
if (position == 0){
return 2; //當(dāng)?shù)?排時(shí),占用2個(gè)網(wǎng)格(意思是第1排只有一整排)
}
if (position == 3){
return 2; //當(dāng)?shù)?排時(shí),占用2個(gè)網(wǎng)格(意思是第3排只有一整排)
}
return 1; //其他排占用1個(gè)網(wǎng)格(意思是其他都是兩兩一排)
}
});
- 如果是StaggerGridLayoutManager模式 :
待定,沒有玩過...
代碼部分2
然后就需要一個(gè)Adapter繼承下面這個(gè)自帶VIewHolder的Adapter
RecyclerView.Adapter<RecyclerView.ViewHolder> 最好有幾個(gè)item就在Adapter里面寫幾個(gè) int 型的 ITEM 比如 : private static final int ITEM_1 = 1 , ITEM_2 = 2 , ITEM_3 = 3 , ITEM_4 = 4;
重寫里面重要的四個(gè)方法
//創(chuàng)建子布局的方法,有幾個(gè)item就需要返回幾個(gè)不同的ViewHolder
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType){...}
//綁定item的ViewHolder的方法,可以在此方法里查找item里的控件
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position){...}
//確定返回總共有多少個(gè)item
@Override
public int getItemCount(){...}
//可以根據(jù)不同的type來確定當(dāng)多少行的時(shí)候,返回什么類型的item
@Override
public int getItemViewType(int position){...}
onCreateViewHolder方法簡寫 :
View view = null;
switch (viewType){
case ITEM_1:
view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item1,parent,false);
return new Holder1(view);
case ITEM_2:
view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item2,parent,false);
return new Holder2(view);
//此方法里也可以查找控件,設(shè)置監(jiān)聽
//mImageView = (ImageView) view.findViewById(R.id.img);
//mImageView1.setOnClickListener();
onBindViewHolder方法簡寫 :
if (holder instanceof Holder1){
Holder1 holder1 = (Holder1) holder;
//里面寫邏輯代碼
if (holder instanceof Holder2){
Holder2 holder2 = (Holder2) holder;
//里面寫邏輯代碼
getItemViewType方法簡寫 :
if (position == 0){
return ITEM_2;
}
if (position == 2){
return ITEM_1;
}
if (position == 3){
return ITEM_2;
}
return ITEM_1;