1. 程式人生 > >《第一行程式碼》RecyclerView學習筆記

《第一行程式碼》RecyclerView學習筆記

1、使用

RecyclerView需要一個佈局管理器和一個介面卡

        RecyclerView recyclerView=(RecyclerView)findViewById(R.id.recyclerView);
        LinearLayoutManager layoutManager=new LinearLayoutManager(this);//線性佈局,還可以是其它佈局嗎?
        recyclerView.setLayoutManager(layoutManager);
        VegeAdapterSecond vegeAdapterSecond=new
VegeAdapterSecond(vegetableList); recyclerView.setAdapter(vegeAdapterSecond);

介面卡需要繼承自RecyclerView.Adapter<>;建立一個ViewHolder內部類用於儲存資料;
重寫三個方法:
public ViewHolder onCreateViewHolder(ViewGroup parent,int viewType)
public void onBindViewHolder(ViewHolder viewHolder,int position)
public int getItemCount()


class VegeAdapterSecond extends RecyclerView.Adapter<VegeAdapterSecond.ViewHolder>{
    private List<Vegetable> mVegeList;
    static class ViewHolder extends RecyclerView.ViewHolder{
        ImageView imageView;
        TextView textView;
        public ViewHolder(View view){
            super(view);
            imageView=(ImageView)view.findViewById(R.id.image_vege);
            textView=(TextView)view.findViewById(R.id.text_vege);
        }
    }
    public
VegeAdapterSecond(List<Vegetable> vegetableList){ mVegeList=vegetableList; } @Override public ViewHolder onCreateViewHolder(ViewGroup parent,int viewType){ View view= LayoutInflater.from(parent.getContext()).inflate(R.layout.vege,parent,false); ViewHolder viewHolder=new ViewHolder(view); return viewHolder; } @Override public void onBindViewHolder(ViewHolder viewHolder,int position){ Vegetable vegetable=mVegeList.get(position); viewHolder.imageView.setImageResource(vegetable.getImageNum()); viewHolder.textView.setText(vegetable.getName()); } @Override public int getItemCount(){ return mVegeList.size(); } }

注意:若設定子項的寬高為match_parent,會導致在該方向上佈滿整個佈局

2、介面卡Adapter

其實說到底,控制元件就是為了互動和展示資料用的,只不過ListView更加特殊,它是為了展示很多很多資料用的,但是ListView只承擔互動和展示工作而已,至於這些資料來自哪裡,ListView是不關心的。因此,我們能設想到的最基本的ListView工作模式就是要有一個ListView控制元件和一個數據源。

不過如果真的讓ListView和資料來源直接打交道的話,那ListView所要做的適配工作就非常繁雜了。因為資料來源這個概念太模糊了,我們只知道它包含了很多資料而已,至於這個資料來源到底是什麼樣型別,並沒有嚴格的定義,有可能是陣列,也有可能是集合,甚至有可能是資料庫表中查詢出來的遊標。所以說如果ListView真的去為每一種資料來源都進行適配操作的話,一是擴充套件性會比較差,內建了幾種適配就只有幾種適配,不能動態進行新增。二是超出了它本身應該負責的工作範圍,不再是僅僅承擔互動和展示工作就可以了,這樣ListView就會變得比較臃腫。

那麼顯然Android開發團隊是不會允許這種事情發生的,於是就有了Adapter這樣一個機制的出現。顧名思義,Adapter是介面卡的意思,它在ListView和資料來源之間起到了一個橋樑的作用,ListView並不會直接和資料來源打交道,而是會藉助Adapter這個橋樑來去訪問真正的資料來源,與之前不同的是,Adapter的介面都是統一的,因此ListView不用再去擔心任何適配方面的問題。而Adapter又是一個介面(interface),它可以去實現各種各樣的子類,每個子類都能通過自己的邏輯來去完成特定的功能,以及與特定資料來源的適配操作,比如說ArrayAdapter可以用於陣列和List型別的資料來源適配,SimpleCursorAdapter可以用於遊標型別的資料來源適配,這樣就非常巧妙地把資料來源適配困難的問題解決掉了,並且還擁有相當不錯的擴充套件性。

3、RecyclerView的橫向滾動

使用LinearLayoutManager時,預設垂直線性佈局
用layoutManager.setOrientation(LinearLayoutManager.HORIZONTAL)可設定為水平佈局,實現橫向滾動(需要對子項佈局進行一些修改)

4、RecyclerView的瀑布流佈局實現

RecyclerView recyclerView=(RecyclerView)findViewById(R.id.recyclerView);
StaggeredGridLayoutManager staggeredGridLayoutManager=new StaggeredGridLayoutManager(3,StaggeredGridLayoutManager.VERTICAL);//三列,每列垂直
recyclerView.setLayoutManager(staggeredGridLayoutManager);

注:RecyclerView還可以實現網格佈局GridLayout