1. 程式人生 > >Android玩 --- Material Design(1) --- Recycleview基本使用(1)

Android玩 --- Material Design(1) --- Recycleview基本使用(1)

一不小心就寫了個很長的題目啊,估計大家也能猜到這樣做的意圖(intent!)是啥了,作為一個小白開發者,能做的就是不斷整理筆記,既方便了自己,也為更多小白指引道路,何樂而不為呢。我的標題分了三級,Android玩,表示這是Android的文章(廢話!),Material Design,代表這一系列是MD的專題,在後面我加了一個(1),說明還有(2,3,4……)咯,Recycleview基本使用(1),也說明後面還有(2),學習就是個不斷探索積累的過程,所以從小開始,慢慢的成長。

廢話不多說了,開始我們今天的工作。

一.開發工具

Android Studio,真機一部,一根資料線……

二.基本介紹

Material Design,中文名:材料設計語言,是由Google在Android5.0系統時推出的全新的設計語言,谷歌表示,這種設計語言旨在為手機、平板電腦、桌上型電腦和“其他平臺”提供更一致、更廣泛的“外觀和感覺”。

在Material Design裡包含了很多新奇的效果,控制元件,讓你一眼看上去就能愛上的那種有木有!!!

那麼今天要討論的Recycleview是個什麼東東,顧名思義,這是一個“回收”檢視,那回收檢視是啥,聯想一下我們用的Listview,學習Android基礎的時候,學到Listview發現,這玩意好簡單啊,並沒有想象中那麼難,但是當你開始踩優化的坑的時候,你會發現,這什麼玩意,還要有這麼多講究,所以今天我們的主角登場了。
下面是Google官方的介紹,這個話有點拗口,
大概就是“為有限資料集提供有限視窗的靈活檢視”。

A flexible view for providing a limited window into a large data set.

Recycleview的核心優點已經提到了,那就是你不必再為回收item而犯愁了,系統自己幫你做好了,這也是他為什麼不叫SuperListView……等等名字的原因。

另外Recycleview的靈活定製:LayoutManager,ItemDecoration,ItemAnimator等可以讓開發者定義各種樣式

好了,到此結束吧,下面進入正式敲程式碼階段。

三.簡易Demo

一.新建一個工程

我們在Android Studio裡新建一個專案,這裡我的包名命名為
com.surine.recycleviewdemo,系統為我們生成好程式碼,截圖如下

這裡寫圖片描述

這裡的話,如果系統沒有新增support庫支援,可以先在Gradle裡面新增好,新增好記得Sync now

compile 'com.android.support:recyclerview-v7:25.3.1'

二.建立一個item佈局

建立item佈局,這個地方和Listview一樣,需要建立item佈局,我就簡單的加一個按鈕,一個文字。
//檔名:item.xml


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:layout_width="match_parent"
              android:layout_height="wrap_content"
              android:orientation="horizontal">

    <TextView
        android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:gravity="center"
        android:text="TextView"/>

    <Button
        android:id="@+id/button"
        style="@style/Widget.AppCompat.Button.Colored"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Button"/>
</LinearLayout>
很簡單的佈局,相信不會難倒你們

三.新增一個Recycleview

在我們的主介面新增一個Recycleview,
//檔名 : activity_main

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <android.support.v7.widget.RecyclerView
        android:id="@+id/rec_main"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_alignParentTop="true"
        android:layout_alignParentStart="true"/>
</RelativeLayout>

四.建立一個自定義介面卡

在Listview的時候我們就知道,Adapter是data與view的互動橋樑,在Recycleview裡面同樣是這樣。
其實介面卡的程式碼雖然多,但是我們可以通過IAS的補全,糾錯等功能快速建立Adapter,另外網路上有很多的萬能介面卡,有興趣可以研究一下。

下面就按照我的方法來實現這個介面卡。(放大招啦!!!)

A:新建一個MainAdapter.java的檔案
這裡寫圖片描述
B:填好繼承類和內部類

這裡我們需要繼承自Recycleview.Adapter,並且新增內部類ViewHolder
這裡寫圖片描述
C:這時候會出現報錯

我們把游標指到ViewHolder上面按Alt+Enter鍵
這裡寫圖片描述
選擇建立ViewHolder,然後我們會發現viewholder已經出現了。

 public class ViewHolder {
    }

D:接著消除重寫錯誤
在第一行比較長的報錯上面按Alt+Enter
這裡寫圖片描述
選擇抽象方法一項,然後就多了好多方法(注意遇到選擇方法的視窗時候,要選中全部方法)

@Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        return null;
    }

    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {

    }

    @Override
    public int getItemCount() {
        return 0;
    }

E:修改ViewHolder
這裡寫圖片描述

選擇第一項,我們的ViewHolder變成了這樣

public class ViewHolder extends RecyclerView.ViewHolder {
    }

但是這個還是有錯誤,同樣Alt+Enter,第一項,OK。
ViewHolder裡多了這麼一個構造方法。

public ViewHolder(View itemView) {
            super(itemView);
        }

F:新增構造方法
構造方法是adapter很重要的方法,我們的值也是通過構造方法傳進去的
這裡我們在類內新增兩個屬性

 private Context mContext;  //上下文
    private List<String> mStrings;   //資料集
    //這裡我用string型別的,我們還可以實現自己的bean來填充

然後在類內(大括號之間)按Alt+Insert,出現下面的情況
這裡寫圖片描述

我貌似看到了一些神奇的東西,Constructor,Getter,Setter,點選Constructor自動生成了構造方法,嗯就是這樣,壓根就不用寫。
同樣注意,屬性全選。

 public MainAdapter(Context context, List<String> strings) {
        mContext = context;
        mStrings = strings;
    }

那麼你會想到我以後寫Bean類的時候怎麼辦了吧。

G:Find控制元件
我們修改ViewHolder程式碼如下
在ViewHolder中宣告自己的控制元件

 public class ViewHolder extends RecyclerView.ViewHolder {
        //這裡定義屬性
        TextView mTextView;
        Button mButton;
        public ViewHolder(View itemView) {
            super(itemView);
            //這裡找到控制元件
            mTextView = (TextView) itemView.findViewById(R.id.textView);
            mButton = (Button) itemView.findViewById(R.id.button);
        }
    }

H:反射佈局
我們修改onCreateViewHolder方法,以找到我們的item佈局

  @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    //建立一個view物件,利用LayoutInflater載入檢視,inflate引數分別是,佈局,viewgroup,attachToRoot(預設false就可以)
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item,parent,false);
        //建立viewholder物件,構造方法傳入view
        ViewHolder holder = new ViewHolder(view);
        return holder;
    }

I:載入資料
我們修改onBindViewHolder方法,載入我們的資料
在這裡繫結資料

 @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
    //position是item的位置
       holder.mTextView.setText(mStrings.get(position));
        holder.mButton.setText("按鈕"+mStrings.get(position));
    }

J:還有很重要的一個東西
能不能顯示出來就靠它了。

   @Override
    public int getItemCount() {
    //返回列表長度
        return mStrings.size();
    }

介面卡到此結束,你會發現瞬間不想繼續了,怎麼這麼多東西……這還多?基本上都是As給你生成的有木有!如果你還嫌多,那就用AS動態模板幫你實現吧。
更多的還在後頭呢,繼續探索吧!(完整的介面卡可以參考我的專案地址,文後)

五.最後一步—–顯示

激動人心的時候到了,馬上就可以看到效果了。

程式碼貼一邊:

private List<String> mStrings = new ArrayList<>();
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_recycleview);
        //載入資料
        for(int i = 0;i<=20;i++){
            mStrings.add("我是"+i);
        }
        //激動人心的時候到了,馬上就可以看到效果了。
        RecyclerView recyclerView = (RecyclerView) findViewById(R.id.rec_main);
        //這裡必須設定LayoutManager,你可以根據你的需要選擇不同的Manager,當然你也可以自定義。
        recyclerView.setLayoutManager(new LinearLayoutManager(this));
        //必須設定Adapter
        recyclerView.setAdapter(new MainAdapter(this,mStrings));

現在我想我們可以run一下試試了。

As跑的真慢,我要靜靜的喝杯Java去。
終於好了,因為我的馬虎出現了一些小錯誤,已經糾正好,介面如下
額,就在這時,肚子超級疼…………As也瞬間黑屏,還是先跑去廁所,回來繼續

回來了,看看我們的截圖
這裡寫圖片描述

不知道該怎麼形容它,反正我們做成功了。

不滿足與現在?
我們還有GridLayout,

//修改檔案RecycleviewActivity裡的recyclerView的setLayoutManager方法,一行程式碼實現網格佈局!!!好神奇! GirdLayoutManager構造方法接受的引數有上下文,和網格列數

recyclerView.setLayoutManager(new GridLayoutManager(this,2));

這裡寫圖片描述

還不喜歡?我們還有瀑布流!!!
瀑布流不知道是啥?……自行百度吧

//引數的含義是:列數,瀑布方向
recyclerView.setLayoutManager(new StaggeredGridLayoutManager(3,StaggeredGridLayoutManager.VERTICAL));

由於我的資料不是長短不一的,所以我這裡沒有截圖,如果設定了長短不一的文字也看不出效果,那就得檢查一下item佈局了

此外我們可以橫向顯示佈局

LinearLayoutManager linearLayoutManager  = new LinearLayoutManager(this);
linearLayoutManager.setOrientation(LinearLayoutManager.HORIZONTAL)

更多方法,以後再探索。

六.真正的最後一步—–事件

話說我們才剛剛弄了個列表顯示,點選按鈕都沒反應啊,你會說,這簡單,設定個
setOnitemClickListener不就ok了……錯!Google爸爸不屑於使用這種方法,所以Recycleview根本沒有!!!
這就完蛋了,各種百度,找到了各種各樣的方法,不過我還是更喜歡《第一行程式碼》的寫法。

我們在介面卡裡完成各種點選事件
修改onCreateViewHolder方法,新增button點選事件,這個監聽器都寫爛了,相信你可以的,獲取點選位置是由holder來完成的。

 @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item,parent,false);
        final ViewHolder holder = new ViewHolder(view);
        holder.mButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //獲取點選位置
                int position = holder.getAdapterPosition();
                Toast.makeText(mContext,"點選了"+mStrings.get(position),Toast.LENGTH_SHORT).show();
            }
        });

        return holder;
    }

接下來你就可以測試一下點選事件了,以後所有的點選事件都可以寫在這裡面。

四.本篇總結

在本篇文章中,我們認識了Recycleview,瞭解了它的基本使用,還收穫了Adapter的大招,作為本系列的第一篇文章,寫了好多,按照最基本的方式,我想我這個小白都能看懂的,再沒有小白看不懂了吧,好東西就要一起分享哦,你們有什麼新的玩法都可以跟我說哦

五.相關及預告

Android玩 — Material Design(1) — Recycleview的裝飾(2)
分割線,側邊欄,動畫效果

Android玩 — Material Design(1) — Recycleview側滑移位(3)
側滑刪除,移動換位。

Android玩 — Material Design(1) — Recycleview重新整理(4)
下拉重新整理,上拉重新整理

六.糾錯及更新日誌

2017年6月4日12:48:17 更新了部分細節,語言描述

七.資源地址