顯示具有 recyclerview 標籤的文章。 顯示所有文章
顯示具有 recyclerview 標籤的文章。 顯示所有文章

2018年3月26日 星期一

[Android] ScrollView包SwipeRefreshLayout包RecyclerView完全沒有畫面(RecyclerView does not show in SwipeRefreshLayout)

問題:
因為RecyclerView做的List上面還要放一些固定的東西,但為了小螢幕手機只好用ScrollView包起來,但為了下拉刷新只好加上SwipeRefreshLayout;
就是ScrollView包SwipeRefreshLayout包RecyclerView,然後...RecyclerView就不秀了,怎麼辦呀?

參考:StackOverflowCSDNivankocijan.xyzCSDN珞璃之神

說明:
根據StackOverflow可知,SwipeRefreshLayout外面不能有ScrollView,那就反過來包;SwipeRefreshLayout包ScrollView,這樣就會秀囉。

只是這樣有幾個問題:

  1. 轉圈(progress view)不在List上方,而是在ScrollView上方。
    =>在意的話,只能改成最外面不是SwipeRefreshLayout,而是CoordinatorLayout,參考CSDN珞璃之神
  2. SwipeRefreshLayout會吃ScrollView手勢。
    =>可以判斷List到頭才啟用SwipeRefreshLayout,可參考CSDN

好啦,如果2這做法SwipeRefreshLayout包ScrollView包RecyclerView大致沒問題,只是如果把ScrollView改為NestedScrollView,下面的RecyclerView做的List會全展開,如果想限制項目數,只能自己在程式裡設定高度了。


手機螢幕高度不夠用問題真的很難解,所以Material Design才會用CoordinatorLayout、AppBarLayout、CollapsingToolbarLayout等元件,讓畫面上方有些東西可以在捲動時縮起來,設計畫面時可參考看看囉。


另外,在查資料時發現NestedScrollView在舊版v4包有很多問題,這篇在用v4:27.1.0時已經沒那些問題了。

2018年2月5日 星期一

[Android] RecyclerView 分隔線(divider)製作

問題:用RecyclerView做了一個垂直List,但每項中間要加分隔線,要怎麼做?

參考:
DividerItemDecoration法:DevAndroid簡書1StackOverflow1
自己寫ItemDecoration法:StackOverflow2簡書2
拿別人寫好的來用:GitHub1GitHub2GitHub3 (太多,只寫三個,第一個是看簡書有人推的,後兩個是GitHub超過500★的)

說明:
在RecyclerView裡設分隔線的正途是addItemDecoration,在項目的小View Layout裡做分隔線是邪道(雖然比較簡單 XD)

  • 好啦,那之前都要自己繼承ItemDecoration寫實做,有點難懂,但SupportLibV7 25版後加了DividerItemDecoration,如果用API 25版後編App,可以先用這個試試,詳細用法參考DevAndroid簡書1
  • 如果上面的效果不太理想,或自己編版SDK太舊,或想要更活,就自己寫或用別人寫好的ItemDecoration囉~

嘛...我自己試的結果是,用shape當drawable給DividerItemDecoration,粗細跟顏色都能調,只是會加到最後一個item的下方還有線,如果要解這問題,就要自己實作ItemDecoration了(參考StackOverflow2),如不在意那就OK。

[Android] RecyclerView OnItemClick實作

問題:
我想用RecyclerView來做List點項目開新頁,但是沒有內建項目點擊(OnItemClick)事件,怎辦?

參考:
多方法比較派:30Sparks掘金
OnClickListener派:Little RobotsAndroidPubStackOverflowCSDN1CSDN2冰封承諾CSDN3
OnItemTouchListener派:segmentfault木楊

說明:
從參考資料看來,處理點擊項目分為兩大派:OnClickListener派、跟OnItemTouchListener,


OnClickListener派 ─ 寫法比較簡單,但是其中又分好幾支派:
  • 整個RecyclerView傳進一個Support Class處理,在onChildViewAttachedToWindow時加上OnClickLisener,詳見Little Robots
  • 在onBindLoopViewHolder時加上OnClickLisener,最常見的簡單作法,詳見StackOverflowCSDN3
  • 在onCreateViewHolder時加上OnClickLisener,通常是怕Bind觸發太多次,在那處理效能會變低,詳見冰封承諾
  • 在ViewHolder的Constructor(建構子)裡加上OnClickLisener,理由跟上面一樣,而且code在ViewHodler看起來Adapter裡的code會少一點,詳見AndroidPubCSDN1CSDN2


OnItemTouchListener派 ─ 寫法比較複雜,但是會覺得自己用官方介面比較厲害(誤)。

只是這方法要寫兩個class,一個繼承OnItemTouchListener處理項目觸碰事件、另一個繼承SimpleOnGestureListener分析觸碰的手勢是不是點擊(Click),詳見segmentfault木楊


這幾種方法的話,
我還是比較偏好在ViewHolder的Constructor(建構子)裡加上OnClickLisener,因為簡單;
如果要重複使用那我推薦Little Robots的方案


其中,ItemClick事件的傳遞大部分都用interface傳到外面的Fragment或是Activity,只是也找到用RxJava傳的方法,但RxJava這裡還沒寫到,就先跳過囉,有興趣自己Google相關範例。

[Android] ListView vs RecyclerView 垂直單欄簡單表單

問題:
我要做一個垂直的單欄表單,點項目開新頁,該用ListView 還是 RecyclerView做比較好?

參考:DevAndroidAndroidPub簡書StackOverflow1StackOverflow2

說明:

結論先說,RecyclerView是大家都推的方式,雖然有些缺點且較使用複雜,但都可解。但是如果學習時間不夠或不想學習,就用ListView吧...

綜合參考來源,用RecyclerView,只考慮做垂直的單欄表單 (Vertical single column list)的優缺點分列如下:

優(Pros):

  • 強制要求用ViewHolder提高效能,ListView要自己做。
  • 可用DiffUtil做資料集差異更新,ListView要自己做。
  • 內建指定位置項目更新notifyItemChanged,ListView要自己做。
  • 內建局部更新動畫setItemAnimator,ListView要自己做。

缺(Cons):

  • 學習難度較高,因為太活了,要設定較多 = =;。
  • 沒有內建onItemClickListener,RecyclerView要自己做(這個真的希望內建呀..)
  • 沒有內建頭尾項目 HeaderView、FooterView,RecyclerView要自己做。
  • 沒有內建無資料畫面setEmptyView,RecyclerView要自己做。
  • 分隔線(divider)製作較複雜,RecyclerView官方正途方法要用ItemDecoration。
  • 要加入v7包recyclerview項目,如果很討厭引用的話 XD

當然,其他很多人提到的是RecyclerView跟Layout分開,可做直的(Vertical)、橫的(Horizontal)、格子的(Grid)、不對齊的格子(StaggeredGrid),但是太活也是個問題呀 XD
一般同一資料集只會用一種,除非可設定版面變換的。

結論再說一次,RecyclerView是未來寫Android一定會用到的元件,所以能學的時候就學吧,但是拿來做簡單ListView又太麻煩,時間不允許就繼續用ListView,或是上網找找有沒有用RecyclerView做出ListView所有功能實作的包裝範例囉~

關於項目點擊分隔線實作,應該會另外寫一篇,不然太長囉~