《第一行代碼》——書中整理摘錄
首先,若要使用RecyclerView佈局,我們需要爲其添加依賴庫。
//noinspection GradleCompatible
implementation 'com.android.support:recyclerview-v7:28.0.0'
使用:寬度和高度佔滿整個佈局空間,併爲其指定id即可。
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/my_recyclerView"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
爲RecyclerView準備一個適配器,該適配器繼承RecyclerView.Adapter
,並將泛型指定爲自定義的內部類,在書中的示例爲FruitAdapter.ViewHolder
。具體代碼如下所示,代碼具體含義見註釋。
總體而言,該適配器需要獲取佈局中的實例並進行綁定,使其能夠呈現到屏幕中來。一個自定義的holder“hold”住了整個實例,通過它進行具體信息的設置。
public class FruitAdapter extends RecyclerView.Adapter {
@NonNull
@Override
private List<Fruit> mFruitList;
//此處創建了一個內部類,該類繼承RecyclerView.viewHolder,通過這個自定義的內部類,可以獲取佈局中的實例。此處的佈局是具體項目信息的實例了,如一組水果的消息包含的圖片和名字。
static class ViewHolder extends RecyclerView.ViewHolder{
ImageView fruitImage;
TextView fruitName;
public ViewHolder(View view){//這裏傳入的view通常是RecyclerView子項的最外層佈局
super(view);
fruitImage = view.findViewById(R.id.fruit_iamge);//獲取佈局實例
fruitName = view.findViewById(R.id.fruit_name);
}
}
//適配器類的構造方法
public FruitAdapter(List<Fruit> fruitList){
this.mFruitList = fruitList;
}
//由於繼承關係必須重寫下列三個方法
//用於創建ViewHloder實例,加載fruit_item佈局並作爲實例返回。此時的fruit_item是具體項目信息的整個的佈局,如上文提到的圖片和名字合在一起的佈局
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.fruit_item,parent,false);
ViewHolder holder = new ViewHolder(view);//實例化自定義的holder
return holder;
}
//對RecyclerView子項的數進行賦值,在每個子項被滾動到屏幕內的時候執行。根據position參數定位,利用viewholder對其進行賦值。
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
Fruit fruit = mFruitList.get(position);
holder.fruitImage.setImageResource(fruit.getImageId());
holder.fruitName.setText(fruit.getName());
}
//RecyclerView共有幾項
@Override
public int getItemCount() {
return mFruitList.size();
}
}
使用方法:在主函數中使用方法如下。
//此處的佈局文件是最外層的recyclerview佈局,建立聯繫
RecyclerView recyclerView = findViewById(R.id.recycler_view);
//爲這個recyclerview設定線性佈局
LinearLayoutManager layoutManager = new LinearLayoutManager(this);
recyclerView.setLayoutManager(layoutManager);
//自定義適配器實例化併爲這個recyclerview添加自定義的適配器
FruitAdapter adapter = new FruitAdapter(fruitList);
recyclerView.setAdapter(adapter);
觀察得知,RecyclerView的佈局交由LayoutManager
管理,因此改變其佈局模式十分容易。listview
無法實現的橫向滑動在此只需要添加一句layoutManager.setOrientation(LinearLayoutManager.HORIZONTAL);
即可。如果想實現瀑布流,則只需要將layoutManager
換成
StaggeredGridLayoutManager layoutManager = new StaggeredGridLayoutManager(3,StaggeredGridLayoutManager.VERTICAL);
其中,3表示列數,VERTICAL表示縱向排列。
下面爲RecyclerView增加監聽事件。RecyclerView可以做到具體任意控件或佈局,這是其優異的地方。因此對剛纔FruitAdapter
類進行一定的修改。增加了fruitView
類保存最外層的view佈局,因此最外層也可以被監聽了。具體監聽修改的部分如下所示。
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.fruit_item,parent,false);
final ViewHolder holder = new ViewHolder(view);//實例化自定義的holder
holder.fruitView.setOnClickListener(new View.OnClickListener(){
@override
public void onClick(View v){
int position = holder.getAdapterPosition();
Fruit fruit = mFruitList.get(position);
Toast.makeText(v.getContext(),...).show();
}
});
holder.fruitImage.setOnClickListener(new View.OnClickListener(){
@override
public void onClick(View v){
int position = holder.getAdapterPosition();
Fruit fruit = mFruitList.get(position);
Toast.makeText(v.getContext(),...).show();
}
});
return holder;
}