《第一行程式碼》筆記3.1—UI控制元件之—RecyclerView
比ListView更強大的滾動控制元件——RecyclerView
它優化了ListView中存在的需要技巧提升效率、不能橫向滾動的不足。
1. 用RecyclerView實現ListView的效果
使用步驟:
1-新增依賴
將RecyclerView定義在support庫中,使其可以在所有Android版本上都能使用,所以在build.gradle中新增依賴。

2-在layout中引用
由於它不是內建在SDK中,在layout中引用時需要用完整包路徑。

3-為RecyclerView準備介面卡
RecyclerView介面卡繼承自RecyclerView.Adapter,泛型指定為 FruitAdapter.ViewHolder
,其中ViewHolder是 FruitAdapter
類中定義的內部類,繼承自RecyclerView.Viewholder。
這裡泛型指定為FruitAdapter.ViewHolder,系統會使用在FruitAdapter中定義的ViewHolder類;如果沒有指定的話,系統會使用RecyclerView.ViewHolder類,這樣在兩個重寫的方法中的返回值也會是RecyclerView.ViewHolder類。
ViewHolder類中主要是在onCreateViewHolder()方法把通過LayoutInflate...from...inflate()載入好的佈局View傳入ViewHolder的構造方法中後,通過findViewById()方法載入View所對應的子類的佈局,方便後續onBindViewHolder()方法中對子類佈局賦值。

由於FruitAdapter是繼承自RecyclerView.Adapter的,所以必須重寫onCreateViewHolder()、onBindViewHolder()和getItemCount()這三個方法。
onCreateViewHolder():
用於建立ViewHolder例項,這個方法中將fruitItem佈局載入進來,然後建立一個ViewHolder例項,並 把加載出來的佈局傳入ViewHolder建構函式 當中,最後將ViewHolder的例項返回。
onBindViewHolder():
用於對RecyclerView子項的資料進行賦值的,會在每個子項被滾動到螢幕內的時候執行
getItemCount():
告訴RecyclerView一共有多少子項,返回資料來源的長度就可以了
到這裡介面卡就配好了:
public class FruitAdapter extends RecyclerView.Adapter<FruitAdapter.ViewHolder> { private List<Fruit> fruitList; static class ViewHolder extends RecyclerView.ViewHolder{ ImageView fruitImage; TextView fruitName; public ViewHolder(@NonNull View itemView) { super(itemView); fruitImage = itemView.findViewById(R.id.fruit_image); fruitName = itemView.findViewById(R.id.fruit_name); } } public FruitAdapter(List<Fruit> fruitList) { this.fruitList=fruitList; } @NonNull @Override public ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int viewType) { View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.fruit_item,viewGroup,false); ViewHolder holder = new ViewHolder(view); return holder; } @Override public void onBindViewHolder(@NonNull ViewHolder viewHolder, int i) { Fruit fruit = fruitList.get(i); viewHolder.fruitImage.setImageResource(fruit.getImageId()); viewHolder.fruitName.setText(fruit.getName()); } @Override public int getItemCount() { return fruitList.size(); } }
4.修改RecyclerViewActivity中的程式碼,開始使用RecyclerView
package com.example.test.RecyclerView; import android.app.Activity; import android.os.Bundle; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import com.example.test.uidemo.R; import java.util.ArrayList; import java.util.List; public class RecyclerViewActivity extends Activity { private List<Fruit> fruitList = new ArrayList<>(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_recycler_view); //初始化水果資料 initFruit(); //開始使用RecyclerView RecyclerView recyclerView = findViewById(R.id.recycler_view); //LayoutManager用於指定RecyclerView的佈局方式,這裡指定線性佈局,可以實現和ListView類似的效果, //如果不指定,介面會一片空白 RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(this); recyclerView.setLayoutManager(layoutManager); FruitAdapter fruitAdapter = new FruitAdapter(fruitList); recyclerView.setAdapter(fruitAdapter); } private void initFruit() { Fruit apple = new Fruit("apple", R.drawable.apple); fruitList.add(apple); Fruit banana = new Fruit("banana", R.drawable.banana); fruitList.add(banana); Fruit grape = new Fruit("grape", R.drawable.grape); fruitList.add(grape); Fruit orange = new Fruit("orange", R.drawable.orange); fruitList.add(orange); Fruit peach = new Fruit("peach", R.drawable.peach); fruitList.add(peach); Fruit pear = new Fruit("pear", R.drawable.pear); fruitList.add(pear); Fruit pineapple = new Fruit("pineapple", R.drawable.pineapple); fruitList.add(pineapple); Fruit watermelon = new Fruit("watermelon", R.drawable.watermelon); fruitList.add(watermelon); } }
介面效果如圖所示:

用recyclerview實現listview和線性佈局的效果
2. 用RecyclerView實現橫向滾動
只需要為layoutManager新增一條如下方法,設定它的方向是水平的,就可以實現了,不過要記得將item中的控制元件寬度改為 wrap_content
(new LinearLayoutManager(this)).setOrientation(LinearLayoutManager.HORIZONTAL);
3.用RecyclerView實現瀑布流佈局
也是在實現ListView的基礎上進行少量變化
- 將佈局管理器從LinearLayoutManager換成StaggeredGridLayoutManager:
StaggeredGridLayoutManager staggeredGridLayoutManager = new StaggeredGridLayoutManager(3,StaggeredGridLayoutManager.VERTICAL);
其中第一個引數表示瀑布流的列數,這裡是3列;第二個引數表示是豎向瀑布流
- 增加一個getRandomLengthName(String name)方法用於改變介面中文字的高度,顯示參差不齊的效果
- 用該方法替換item中TextView的字串
如圖所示:

效果如圖:

豎向瀑布流效果圖
4. RecyclerView的點選事件
RecyclerView沒有類似於OnItemClickListner()的註冊監聽器方法,但是在點選每一項裡具體的一個控制元件時,RecyclerView更加方便,因為RecyclerView直接用具體的View去註冊點選事件,可以輕鬆實現 子項中任意控制元件或佈局的點選事件
重點:
- 在Viewholder類中儲存了 子項 最外層佈局 的例項
- 在onCreateViewHolder中註冊監聽事件

效果:

先點選了圖片,又點選了文字部分(相當於點選了外層佈局)
完結(ง •_•)ง