1. 程式人生 > >RecyclerView的簡單使用(一)———— 實現各種佈局效果

RecyclerView的簡單使用(一)———— 實現各種佈局效果

文章內容

  本文簡單介紹了RecyclerView的基本使用方式,引入了控制RecyclerView佈局的LayoutManager類, 並且實現了RecyclerView的各種佈局效果。

預覽效果圖


準備工作 

新建一個Android專案,先在其中新增RecyclerView的依賴: compile  'com.android.support:recyclerview-v7:26.0.0-alpha1'。 PS:在這裡需要注意一下:RecyclerView是在v7包下的控制元件,所以匯入的recyclerview依賴版本需要和v7的依賴版本一致,例如:

   compile 'com.android.support:recyclerview-v7:26.0.0-alpha1'

   compile 'com.android.support:appcompat-v7:26.0.0-alpha1'

如果不一致的話編譯時會報錯:                        
Error:Execution failed for task ':app:processDebugManifest'.
> Manifest merger failed : Attribute meta-data#
[email protected]
value=(25.3.1) from [com.android.support:appcompat-v7:25.3.1] AndroidManifest.xml:27:9-31 is also present at [com.android.support:recyclerview-v7:26.0.0-alpha1] AndroidManifest.xml:24:9-38 value=(26.0.0-alpha1). Suggestion: add 'tools:replace="android:value"' to <meta-data> element at AndroidManifest.xml:25:5-27:34 to override.

使用RecylerView實現各種佈局效果

基本程式碼

首先,在activity_main.xml檔案中新增RecyclerView:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:padding="@dimen/app_padding"
    tools:context="com.zgd.recyclerviewdemo.MainActivity">

    <android.support.v7.widget.RecyclerView
        android:id="@+id/rv"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

</LinearLayout>

在MainActivity中初始化RecyclerView:

mRecyclerView = (RecyclerView) findViewById(R.id.rv);
有了RecyclerView之後想要將資料填充進去還需要介面卡,現在來自定義一個介面卡,繼承RecyclerView下的Adapter,新建class 檔案 SimpleAdapter.java:

public class SimpleAdapter extends RecyclerView.Adapter<SimpleAdapter.MyHolder> {

    private Context mContext;
    private List<String> mDatas;
    private LayoutInflater mInflater;

    public SimpleAdapter(Context context, List<String> datas) {
        this.mContext = context;
        this.mDatas = datas;
        this.mInflater = LayoutInflater.from(context);
    }

    @Override
    public MyHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        //使用佈局載入器載入RecyclerView的Item佈局;
        View view = mInflater.inflate(R.layout.item_rv_main, parent, false);
        MyHolder holder = new MyHolder(view);
        return holder;
    }

    @Override
    public void onBindViewHolder(MyHolder holder, int position) {
        holder.tv.setText(mDatas.get(position));
    }

    @Override
    public int getItemCount() {
        return mDatas.size();
    }

    class MyHolder extends RecyclerView.ViewHolder {

        private TextView tv;

        public MyHolder(View itemView) {
            super(itemView);
            tv = (TextView) itemView.findViewById(R.id.tv_rv_main);
        }
    }
}
注意在SimpleAdapter類中的onCreateViewHolder方法中,

需要用佈局載入器LayoutInflater將我們寫好的Item佈局加載出來,

作為ItemView傳入到我們自定義的MyHolder構造器中。然後將 holder物件返回出去。

在這裡我的item佈局是item_rv_main.xml檔案,其中佈局也很簡單,如下所示:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
             android:layout_marginBottom="2dp"
             android:layout_marginEnd="2dp"
             android:background="#e5cccc"
             android:padding="10dp">

    <TextView
        android:id="@+id/tv_rv_main"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"/>

</FrameLayout>

現在介面卡也已經寫好了,那麼我們就在MainActivity中先建立一個SimpleAdapter物件,

但是由上述程式碼可知,建立SimpleAdapter物件需要傳遞兩個構造引數:Context上下文物件和資料來源,

Context上下文物件現在已經有了,傳this過去即可,所以現在我們只需要初始化資料來源,

這裡我寫的比較簡單,直接模擬了一些字串資料:

mDatas = new ArrayList<>();
for (char i = 'A'; i <= 'z'; i ++) {
    mDatas.add("" + i);
}
好了,資料來源也有了,現在可以建立 SimpleAdapter物件了,並且可以為RecyclerView新增Adapter物件:
mAdapter = new SimpleAdapter(this, mDatas);
mRecyclerView.setAdapter(mAdapter);
之前使用ListView的時候,寫到這裡基本上就完成了,可以看到效果了,但是RecyclerView可以嗎?

很顯然,並不能,因為RecyclerView僅僅關注View的回收和複用,並不能控制View的展示,那該怎麼辦呢?下面就會看到RecyclerView如何實現ListView、GridView、橫向GridView以及瀑布流等等的佈局效果了。現在就要引入一個新的類 LayoutManager,這個類可以用來控制RecyclerView中Item的佈局顯示情況。

實現ListView佈局展示效果:

mRecyclerView.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false));

效果圖:


實現GridView佈局展示效果

mRecyclerView.setLayoutManager(new GridLayoutManager(this, 3, GridLayoutManager.VERTICAL, false));
效果圖:


實現橫向GridView佈局展示效果

mRecyclerView.setLayoutManager(new GridLayoutManager(this, 10, GridLayoutManager.HORIZONTAL, false));
效果圖:

(ps:由於上面item佈局檔案中的寬度為match_parent,所以這裡每個item的寬度都佔滿螢幕了,

看起來不像GridView,但其實是一個橫向的GridView佈局。可以在必要的時候可以把寬度調整為需要的值。)

實現瀑布流佈局展示效果

這種展示方式需要根據item的高度來進行佈局,所以在這裡我們先給每一個子佈局賦上一個高度值。

為了不影響其他佈局,這裡我們重新建立一個Adapter類StaggeredGridAdapter.java,用來實現瀑布流,

直接繼承我們之前寫好的SimpleAdapter:

public class StaggeredGridAdapter extends SimpleAdapter {

    //用來盛放模擬View的高度值的集合
    private List<Integer> heights;

    public StaggeredGridAdapter(Context context, List<String> datas) {
        super(context, datas);
        heights = new ArrayList<>();
        //初始化高度值 List
        for (int i = 0; i < datas.size(); i ++) {
            heights.add(200 + new Random().nextInt(200));
        }
    }

    @Override
    public void onBindViewHolder(MyHolder holder, int position) {
        super.onBindViewHolder(holder, position);
        //動態設定 itemView 的高度
        ViewGroup.LayoutParams layoutParams = holder.itemView.getLayoutParams();
        layoutParams.height = heights.get(position);
        holder.itemView.setLayoutParams(layoutParams);
    }
}
此時我們將RecyclerView的Adapter替換成上面寫好的StaggeredGridAdapter,並且將LayoutManager設定為StaggeredGridLayoutManager即可:
StaggeredGridAdapter staggeredGridAdapter = new StaggeredGridAdapter(this, mDatas);
mRecyclerView.setAdapter(staggeredGridAdapter);
mRecyclerView.setLayoutManager(new StaggeredGridLayoutManager(3, StaggeredGridLayoutManager.VERTICAL));
效果圖:


總結

由上述效果可以看出,RecyclerView的佈局展示只需要根據LayoutManager來進行判斷和轉換,是由LayoutManager類進行控制的。

好了,關於RecyclerView的簡單使用就介紹到這裡了,方便自己以後檢視,也希望能對需要的童鞋提供些幫助。