1. 程式人生 > >RecyclerView 不一樣的列表

RecyclerView 不一樣的列表

以往,Android開發列表一般用的ListView GridView(這個不懂,自己百度去)etc.

但是,在Google釋出了一個新控制元件:RecyclerView。這是什麼?回收?這樣理解也沒錯,它不管其他,它只負責回收利用,沒有顯示的就回收了不佔資源,要顯示的再拿資料並顯示。

好了不說了。直接說使用吧。

首先,新建一個專案,名字隨便啦

接著,我們先試試xml佈局,開啟 activity_main.xml 輸入
<Recyc
看看IDE有沒有彈出提示選擇RecyclerView,多半是沒有的,我有個專案我沒找到這傢伙的依賴 但是我就是用上了(手動滑稽)
好了,繼續。
沒有的話,我們兩個方式新增依賴

1、 選擇專案(一般開啟都是Android檢視)右鍵找到

1

2

3

4

5

最後ok ,好了 我們依賴就完了

2、直接手動開啟檔案輸入依賴

build
一定要app模組的不要project那個
接著在dependencies方塊裡輸入

implementation ‘com.android.support:recyclerview-v7:27.0.2’

最後sync now。好,匯入成功了

如果報錯,按照提示改就好了,多半是版本問題(就在剛剛我出來的。。。暈)版本一致就ok(支援庫)

接著,開始我們的佈局
activity_main.xml開始寫,直接Recyc然後回車,
恩,得是這個哈

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

好了佈局就完了,接著使用程式碼


public class MainActivity extends AppCompatActivity {

    private
RecyclerView mRecyclerView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mRecyclerView = findViewById(R.id.rv); //介面卡 List<Integer> datas = new ArrayList<>(); for(int i = 0;i < 50;i++){ datas.add(i); } MyAdapter adapter = new MyAdapter(this,datas); //設定layout管理器(list or grid) mRecyclerView.setLayoutManager(new LinearLayoutManager(this,LinearLayoutManager.VERTICAL,false)); //設定動畫效果 預設 mRecyclerView.setItemAnimator(new DefaultItemAnimator()); //設定分隔符 mRecyclerView.addItemDecoration(new DividerItemDecoration(this,DividerItemDecoration.VERTICAL)); //設定adapter mRecyclerView.setAdapter(adapter); } }

基本配置就這些,然後我們看看介面卡

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> {

    private List<Integer> mDates;
    private LayoutInflater layoutInflater;
    private Context mContex;

    public MyAdapter(Context context, List<Integer> dates) {
        this.mDates = dates;
        this.mContex = context;
        layoutInflater = LayoutInflater.from(context);
    }

    @Override
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = layoutInflater.inflate(R.layout.item, parent, false);
        return new MyViewHolder(view);
    }

    @Override
    public void onBindViewHolder(MyViewHolder holder, int position) {
    int a = mDatas.get(position);
    holder.tv.setText(a+"");
    }

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

    class MyViewHolder extends RecyclerView.ViewHolder {

        TextView tv;
        public MyViewHolder(View itemView) {
            super(itemView);

            tv = (TextView) itemView.findViewById(R.id.tv);

        }
    }

然後我們看到有一個 R.layout.item 這個就是每一個item的顯示佈局長什麼樣子

item.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    xmlns:tools="http://schemas.android.com/tools">

    <TextView
        android:id="@+id/tv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="24sp"
        android:layout_margin="8dp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        tools:text="1" />
</android.support.constraint.ConstraintLayout>

好了,差不多了,我們來執行一下。
emmmm
這裡寫圖片描述
咦,我們不是設定了分隔線,額。
不急,這裡的是系統自帶的,一般沒什麼用(簡稱:然並卵)
所以我們要自己寫一個,所以免得麻煩,從網上摘一個下來
這裡給一個。。。原著我也不知道。。。

分隔符檔案

好了我們把那裡重新改一下。

mRecyclerView.addItemDecoration(new DividerDecoration(this,DividerDecoration.VERTICAL_LIST));

執行一下,有線了,但這個是預設的。我們可以自定義一下
然後我們看一下原始碼。

private static final int[] ATTRS = new int[] { android.R.attr.listDivider };

有這樣一句話,說明我們可以自己定義一個
不用改TA的內容,然後我們自己建一個divider_bg.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">

    <gradient
        android:centerColor="#002aff"
        android:endColor="#ff0000"
        android:startColor="#00ff84"
        android:type="linear" />
    <size android:height="2dp" />

</shape>

最後,在style裡面新增

<!-- Base application theme. -->
    <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
        <!-- Customize your theme here. -->
        <item name="colorPrimary">@color/colorPrimary</item>

        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>

        <item name="colorAccent">@color/colorAccent</item>

        <!--新增的-->
        <item name="android:listDivider">@drawable/divider_bg</item>
    </style>

好了,讓我們看看最後的效果
run

然後RecyclerView還有其他的用法例如類似GridView那種
只需要把佈局管理器改了

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

改了

mRecyclerView.setLayoutManager(new GridLayoutManager(this,5,GridLayoutManager.VERTICAL,false));

ok,看一下效果

good

恩,榮老夫點點頭。
甚是漂亮
當然如果你還要玩出更多花樣也可以用其他的。

然後我還沒寫完,因為你會發現點選事件沒有,他居然沒有點選事件
so,你得自己寫,有兩個方法,看你的咯

這裡給一個大神的(手動嘿嘿)

好了,我自己的網站,宣傳一下

有什麼疑問,請說出來,謝謝。