上一篇我們認識了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