Android玩 --- Material Design(1) --- Recycleview的裝飾(2)

上一篇我們認識了Recycelview,並且能夠簡單的使用它,這一次我們來點酷炫的東西。

一.側邊欄ScollBars

爲了實現側邊滑動的ScollBars,我們只需要在xml裏添加一行代碼

//當然還有橫向的,根據自身需求選擇
android:scrollbars="vertical

這樣我們就可以看到帶有Scollbars的列表了,這個還是很簡單的。

二.Item分割線

個人認爲不加分割線比較好看,但是有時候我們的需求就是要有分割線,這個分割線實現的方式有很多種,不管是文藝型,大神型,2B青年型等等等等,反正我們能實現就OK。

1.第一種實現方式

這應該是屬於一種文藝型的方式,那就是設置margin
margin大家都知道就是間距,當我們給Recycleview設置背景後,我們可以給item設置一個Margin,這樣我們就能很明顯的看出分割線了。 比較快捷,沒什麼技術含量,而且這個背景可以隨心定製,所以你的分割線也會隨着變化。

2.第二種實現方式

view。典型的2B青年歡樂多,我經常使用這種方法,哈哈。
在item的底部用< view >繪製一條橫線,也非常簡單吶,同樣也可以自己定製顏色

3.第三種實現方式

我們的專業的方法來了,ItemDecoration,系統提供的當然是好東西,我們直接使用就好啦

//直接爲recycleview添加ItemDecoration,傳入上下文和方向值
recyclerView.addItemDecoration(new DividerItemDecoration(RecycleviewActivity.this,DividerItemDecoration.VERTICAL));

預覽在這裏。
這裏寫圖片描述

當然我們也可以通過Style來設置分割線

<item name = "android:listDivider">這裏寫你的背景顏色或者shape或者其他樣式</item>

你可以設置一個漸變的shape添加給他。

三.Item ripple

Material Design爲我們帶來的Ripple效果很不錯,我們可以選擇用在點擊上面,
其實說起來也不難,只在item的佈局上添加一行代碼(如果不是button的話還要實現它的監聽器,才能看到ripple效果)

 android:foreground="?android:attr/selectableItemBackground"

設置layout的前景色就可以實現ripple水波紋,不過需要注意的是,只能在Android5.0以上看到效果,如果要向下兼容的話不如試試Github的Ripple庫,這種庫也有好多,我就不一一列舉了。

四.Item 添加刪除動畫

實際應用中,我們的List當然不能是寫死的,我們會經常收到數據或者刪除數據,Recycleview也爲我們準備了添加刪除數據的一些東西,我們一起來看一下。

我們在Adapter裏添加addData()與removeData()方法,然後我們可以在有新數據或者要刪除數據的時候調用

//addData方法,首先添加數據到list,然後通知適配器更新
 public void addData(int position){
        mStrings.add(position,"ADD"+position);
        notifyItemInserted(position);
    }
//removeData方法,首先刪除數據,然後通知適配器更新
    public void removeData(int position){
        mStrings.remove(position);
        notifyItemRemoved(position);
    }

我們在Toolbar上寫點按鈕來測試一下。

//在Activity裏這樣調用
                  //添加
                adapter.addData(1);

                    //刪除
                adapter.removeData(1);

最後,說好的動畫在這裏

//使用setItemAnimator方法來設置動畫,你可以自定義你的動畫啦,我這裏使用的是默認動畫
recyclerView.setItemAnimator(new DefaultItemAnimator());

我會在後續的文章中介紹具體的動畫

2017年6月25日15:33:41更新
最近些寫項目用Recycleview遇到了不少坑,還好我從坑裏爬了出來。
主要是對於數據item的局部更新,我們有些時候需要對某一項的數據進行更新,我們經常使用notifyDataSetChanged()進行刷新,比如下面,我在今天更改了部分代碼,創建了Student類來演示,我修改了button的點擊事件,點擊後更新本項數據,並且更新

 holder.mButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //獲取點擊位置
                int position = holder.getAdapterPosition();
                Toast.makeText(mContext,"點擊了"+mStudents.get(position).getName(),Toast.LENGTH_SHORT).show();
                mStudents.get(position).setName("我是更新的數據");
                notifyDataSetChanged();
            }
        });

這裏還有更標準的寫法,就是更新單項,而不是更新全部

  mStudents.get(position).setName("我是更新的數據");
                notifyItemChanged(position);

五.下拉刷新

下拉刷新在移動設備上很常見,各種APP都帶有刷新功能,也有各種酷炫的刷新方式,爲此Google也推出了自己的下拉刷新控件—–SwipeRefreshLayout,這個控件可以和Listview,Recycleview等配合使用

我們修改一下我們的佈局代碼,在Recycleview外面加一層SwipeRefreshLayout

 <android.support.v4.widget.SwipeRefreshLayout
      android:id="@+id/swipeRefreshLayout"
      android:layout_width="match_parent"
      android:layout_height="match_parent">
      <android.support.v7.widget.RecyclerView
          android:id="@+id/rec_main"
          android:scrollbars="vertical"
          android:layout_width="match_parent"
          android:layout_height="match_parent"
          android:layout_alignParentTop="true"
          android:layout_alignParentStart="true"/>
  </android.support.v4.widget.SwipeRefreshLayout>

然後在Activity裏寫它的邏輯

//Find到控件後寫刷新的事件。
//在這裏我模仿了一個加載的延時
   new Handler().postDelayed(new Runnable() {
                    public void run() {
                        adapter.addData(1);
                        //顯示或隱藏刷新進度條
                        mSwipeRefreshLayout.setRefreshing(false);
                    }
                }, 1000);  

效果
這裏寫圖片描述

這只是一個簡單的刷新實例,SwipeRefreshLayout還有好多值得探索的地方,具體將在後來的MD專題列舉

六.上拉加載

平時我們閱讀新聞的時候,都是習慣向下滑,滑動越多看的越多,所以說下拉加載也是個很重要的功能。

我們可以使用ScollListener實現上拉加載
這裏我們給recycleview添加OnScrollListener監聽

 recyclerView.addOnScrollListener(new OnScrollListener() {
            //標記當前是否時向最後一項滑動
            boolean isLast = false;
            //滾動狀態改變時
            @Override
            public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
                super.onScrollStateChanged(recyclerView, newState);
                //獲取到當前的layoutmanager
                LinearLayoutManager layoutManager = (LinearLayoutManager) recyclerView.getLayoutManager();
                if(newState == SCROLL_STATE_IDLE){
                    //得到管理器裏面的最後一個item
                    int Last = layoutManager.findLastVisibleItemPosition();
                    //得到管理器全部的item
                    int total = layoutManager.getItemCount();
                    //判斷當前是不是滑動,是否到了最下面的item地方,如果全是就加載
                    if(Last == total-1&&isLast){
                        //開始上拉加載
                        adapter.addData(total);
                    }
                }
            }
            //滾動結束後
            @Override
            public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
                super.onScrolled(recyclerView, dx, dy);
                //如果dy大於0,則說明在向下滑
                if(dy>0){
                    isLast = true;
                }else{
                    isLast  =false;
                }
            }
        });

這樣我們就實現了上拉加載,不過一般的上拉加載都會有人性化處理的,在這裏暫且不介紹。

七.本篇總結

在本篇文章中,我們認進一步裝飾了Recycleview,讓他具有了一個實際生產環境中列表應該具備的特性,不過這都是很簡單的特性,後續文章將會實現一些酷炫的效果

八.相關及預告

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

九.糾錯及更新日誌

十.資源地址

https://github.com/Surine/RecycleviewDemo

十一.參考

敏敏啊呀的簡書:
http://www.jianshu.com/p/c35ca003654d?utm_campaign=haruki&utm_content=note&utm_medium=reader_share&utm_source=qq

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章