Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
LOADING, LOADED, ERROR どこに何を表示するか
Search
konifar
May 28, 2018
Programming
720
3
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
LOADING, LOADED, ERROR どこに何を表示するか
https://nohana.connpass.com/event/80530/
で話した資料です。
konifar
May 28, 2018
More Decks by konifar
See All by konifar
自分が詳しくない領域でAIを使う #プロヒス2026
konifar
20
8.9k
マネージャー版 "提案のレベル" を上げる
konifar
27
21k
AIで 浮いた時間で 何をする? 2026春 #devsumi
konifar
21
6.2k
登壇資料を作る時に意識していること #登壇資料_findy
konifar
7
3.2k
事業部のプロジェクト進行と開発チームの改善の “時間軸" のすり合わせ
konifar
12
4.5k
チーム開発の “地ならし"
konifar
8
18k
AIで 浮いた時間で 何をする? #プロヒス2025
konifar
27
17k
物語を動かす行動"量" #エンジニアニメ
konifar
19
7.4k
提案のレベルを上げる #QiitaConference
konifar
98
43k
Other Decks in Programming
See All in Programming
Terraform標準の組織で AWS CDKをどう使うか
mu7889yoon
1
350
信頼性について考えてみる(SRE NEXT 2026 miniLT)
hayama17
0
210
アルゴリズムは何を圧縮しているのか ─ Haskell から育った「圧縮代数」というメンタルモデル
naoya
16
3.6k
AI時代、エンジニアはどう育つのか -未経験エンジニアの成長を間近で見て考えたこと-
thasu0123
0
140
act1-costs.pdf
sumedhbala
0
240
音楽のための関数型プログラミング言語mimiumにおける多段階計算の活用
tomoyanonymous
1
350
Built Our Own Background Agent at LayerX #aidevex_findy
layerx
PRO
8
3k
分散システム、なんですぐ死んでしまうん?耐障害性を高めたいあなたのためのレジリエンスパターン入門
mshibuya
7
6.7k
Claude Team Plan導入・ガイド
tk3fftk
0
220
鹿野さんに聞く!『TypeScriptコードレシピ集』で磨く実践力
tonkotsuboy_com
4
1.1k
生成AI導入の「期待外れ」を乗り越える ー 開発フロー改革が目指す、真の組織変革
starfish719
0
1.8k
エンジニアにデザインハーネスを 〜デザインプロセスを規定するためのハーネス〜 / Design harness from an engineer's perspective
rkaga
2
1.6k
Featured
See All Featured
How to build a perfect <img>
jonoalderson
1
5.8k
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
49
3.5k
Lightning talk: Run Django tests with GitHub Actions
sabderemane
0
220
Darren the Foodie - Storyboard
khoart
PRO
3
3.5k
Digital Projects Gone Horribly Wrong (And the UX Pros Who Still Save the Day) - Dean Schuster
uxyall
1
2.1k
A Soul's Torment
seathinner
6
3.1k
SEOcharity - Dark patterns in SEO and UX: How to avoid them and build a more ethical web
sarafernandez
0
220
A designer walks into a library…
pauljervisheath
211
24k
Introduction to Domain-Driven Design and Collaborative software design
baasie
1
910
Digital Ethics as a Driver of Design Innovation
axbom
PRO
1
350
End of SEO as We Know It (SMX Advanced Version)
ipullrank
3
4.3k
The Straight Up "How To Draw Better" Workshop
denniskardys
239
140k
Transcript
LOADING, LOADED, ERROR どこに何を表示するか Kyash Inc. Yusuke Konishi (@konifar) 1
マテリアルデザインのおかげで それなりの見た目のアプリを 楽に作れるようになった 2
にもかかわらず 3
統一感のないアプリが できてしまう 4
解決策 5
マテリアルデザインに沿った 細かいガイドラインを作る 6
わかる、 けど難しい 7
ガイドラインの中でも 整理しにくい部分がある 8
整理しにくい = パター ンが複雑 = デザイナー さんも想定しにくい 9
その代表格 通信とユー ザー への通知 10
今日話すこと LOADING, LOADED, ERROR のとき、 どこに何を表示するか 11
分類 1. デー タの取得 => 比較的整理しやすい 2. デー タの更新 =>
なやんでる 12
デー タの取得 13
大まかな分類 1. 画面全体のロー ド 2. 画面の一部のロー ド 3. 追加のロー ド
Pull to Refresh リストの追加読み込み 14
1. 画面全体のロー ド 15
1. 画面全体のロー ド どこに 画面の真ん中 何を デフォルトのProgressBar <ProgressBar android:id="@+id/loading" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_gravity="center" /> 16
LoadingAndErrorView CustomView とDataBinding で共通化 loadState にenum を渡すといい感じに表示 <co.kyash.ui.view.LoadingAndErrorView android:layout_width="match_parent" android:layout_height="match_parent"
android:layout_below="@id/toolbar" app:loadState="@{viewModel.state}" app:onRetryClick="@{viewModel::onReloadClick}" /> 17
画面全体のロー ディング表示 がベストなのか? 画面全体のロー ドってわりとストレスたまる 部分的にロー ドできないのか? 18
2. 画面の一部のロー ド ロー ドする部分ごとにplaceholder 置いて部分的にロ ー ディングを表示する 19
考えること多い デー タがなかった時の表示の切り替え 一部エラー だった時の表示 ロー ドの待ち合わせとView の切り替え ロー ドの結果、View
がガクつかないためのwidth、 height、 アニメー ションの調整 20
開発効率とのトレー ドオフ 個人的にはデザインガイドラインには入れない方 がいいと思う どうしてもこだわりたい大事な画面は特別扱いで 対応する LOADING 中のView の表示について は、https://github.com/ethanhua/Skeleton
のよ うなライブラリである程度楽になるかもしれない 21
3-1. Pull to Refresh 22
3-1. Pull to Refresh どこに 画面の上部 何を デフォルトのSwipeRefreshLayout 23
DataBinding を使った実装 <android.support.v4.widget.SwipeRefreshLayout android:layout_width="match_parent" android:layout_height="match_parent" android:layout_below="@id/toolbar" app:onRefreshListener="@{viewModel::onRefresh}" app:refreshing="@{viewModel.swipeRefreshing}"> fun onRefresh()
{ swipeRefreshing.set(true) refreshAll(true) } 24
3-2. リストの追加読み込み 25
3-2. リストの追加読み込み どこに リストの下部 何を デフォルトのProgressBar 26
DataBinding を使った実装 @BindingAdapter(value = ["onScrolled", "onScrollTop", "onScrollE fun RecyclerView.setOnScrollEnd( ...
onScrollEnd: RecyclerViewExt.OnScrollEnd? ) { addOnScrollListener(object : RecyclerView.OnScrollListener() ... override fun onScrolled(recyclerView: RecyclerView?, dx: onScrolled?.onScrolled(recyclerView, dx, dy) val llm = layoutManager as? LinearLayoutManager ... // BOTTOM llm?.let { val visibleItemCount = it.childCount val totalItemCount = it.itemCount val pastVisibleItems = it.findFirstVisibleItemPo if (pastVisibleItems + visibleItemCount >= total onScrollEnd?.onScrollEnd() 27
DataBinding を使った実装 <android.support.v7.widget.RecyclerView android:id="@+id/recycler_view" android:layout_width="match_parent" android:layout_height="match_parent" app:onScrollEnd="@{viewModel::onScrollEnd}" /> ViewModel で処理を書くだけ
fun onScrollEnd() { if (hasMore.get() && !loadingMore) { loadingMore = true refreshData() } } 28
デー タの更新 29
整理のポイント 更新が終わる前にユー ザー に 操作をさせてよいかどうか 30
Kyash の場合 『 送金、 請求、 チャー ジ』 => 決済などお金にかかわる部分なので、LOADING 中
は操作できないように画面をロックしたい 『 プロフィー ル、 設定の変更、 メッセー ジの送信』 => 更新できなかったとしても大きな問題ではないの で、LOADING 中でも操作できるようにしたい 31
送金時( 画面全体) 32
送金時( 画面全体) ProgressDialog を使っていたが今日やめた 透明 or 半透明なFragment にProgressBar を載せて 表示するのがよいかも
送金、 請求は重要なアクションの一つなので、 ガ イドライン外でこだわってもいいかもしれない ガイドラインはあくまで基本的な思想に留めたい 33
プロフィー ル画像の変更 画像の更新は時間がかかることがある UPLOADING の状態を表示しつつ、Noti cation で 進捗を表示するのがよさそう 34
設定の変更 何も表示しないのがよさそう ダメだった時にやり直すためのSnackbar を表示す る 35
メッセー ジの送信 送信したメッセー ジを送信中としてすぐに表示す る 送信し終わったらView を更新する 表示用のモデルに isTemporary みたいなフラグを持
たせて表示を切り替えるのがよさそう 36
まとめ 37
デー タの取得は 画面全体のロー ディングを どうするか以外は簡単そう 38
デー タの更新は とにかく悩ましい 39
モデルの実際の更新と View の表示が一致しないこと が起こりそうなので 表示用のモデルを作っておく のがよさそう 40
どうしようか考え中なので 懇親会で教えてください konifar kobakei 41
Thanks! https://material.io/guidelines/components/progre ss-activity.html https://goodpatch.com/blog/progress-indicator/ https://github.com/ethanhua/Skeleton 42