《第一行代碼》——RecyclerView詳解

《第一行代碼》——書中整理摘錄

首先,若要使用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;
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章