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
Adapter and Custom Layout
Search
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
Tatsuya Arai
February 18, 2015
Programming
990
3
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Adapter and Custom Layout
Tatsuya Arai
February 18, 2015
More Decks by Tatsuya Arai
See All by Tatsuya Arai
5 minutes PWA
cutmail
0
240
Androidアプリ開発における技術顧問としての役割 #DroidKaigi 2018
cutmail
1
2.5k
4年続くアプリにおけるチーム開発 #DroidKaigi 2017
cutmail
13
5k
フリルにおけるドッグフーディング / Fashion Tech Meetup #2 LT
cutmail
2
4k
いかにして不具合発見時の フィードバックを素早く行うか #potatotips 12
cutmail
0
2.6k
Androidのログ出力をいい感じにする #potatotips 9
cutmail
8
10k
コーディング規約を緩く守りつつ仕事の成果を出す方法
cutmail
2
670
Other Decks in Programming
See All in Programming
Snowflake Summitでの新機能 CoCo / CoWork / snowflake-summit-2026-overall-what-new-coco
tatsuhiro
1
130
「なぜそう決めたのか」を残し続ける仕組み ― Notion AI カスタムエージェント × Slack連携による設計判断の自動記録 - NIKKEI Tech Talk #47
niftycorp
PRO
0
170
Make SRE Operations Easier with Azure SRE Agent
kkamegawa
0
6k
AIとASP.NET Coreで雑Webアプリを作った話
mayuki
0
620
DynamoDBには集計系のクエリがないけどなんとかしたい
musan
1
140
jQueryをバージョンアップする前に使いたいjQuery Migrate
matsuo_atsushi
0
500
TSKaigi Night Talks 2026_TypeScriptでサプライチェーンの整合性を型に閉じ込める
geekplus_tech
0
350
生成AI時代にこそ効くGo | Why Go Works in the Age of Generative AI
mom0tomo
8
3.2k
ローカルLLMでどこまでコードが書けるか -拡張版 / How much code can be written on a local LLM Extended
kishida
11
4.1k
正しくソフトウェアを作る、前提を疑うための認知の視点 / doubt-premise
minodriven
21
6.6k
「エンジニアインターン、どうやって取った?」準備のリアルを語るLT会 Progate BAR
akiomatic
0
130
さぁV100、メモリをお食べ・・・
nilpe
0
140
Featured
See All Featured
The MySQL Ecosystem @ GitHub 2015
samlambert
251
13k
Fireside Chat
paigeccino
42
3.9k
Data-driven link building: lessons from a $708K investment (BrightonSEO talk)
szymonslowik
1
1.1k
The Invisible Side of Design
smashingmag
302
52k
Building a Scalable Design System with Sketch
lauravandoore
463
34k
How Fast Is Fast Enough? [PerfNow 2025]
tammyeverts
3
610
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
133
19k
The innovator’s Mindset - Leading Through an Era of Exponential Change - McGill University 2025
jdejongh
PRO
1
200
From π to Pie charts
rasagy
0
210
GraphQLの誤解/rethinking-graphql
sonatard
75
12k
Leveraging LLMs for student feedback in introductory data science courses - posit::conf(2025)
minecr
1
280
For a Future-Friendly Web
brad_frost
183
10k
Transcript
"EBQUFSBOE $VTUPN-BZPVU QPUBUPUJQT
@cutmail • Fablic, Inc. • Co-Founder • Mobile Application Engineer
AdapterͷߴԽ
AdapterͷߴԽ • ViewHolder
ViewHolder • AdapterͷߴԽख๏ • Adapter#getView()ͰfindViewById()ͷճΛݮΒ͢ (ViewΛ͍·Θ͢)
public class ItemAdapter extends ArrayAdapter<Item> { private LayoutInflater inflater; private
List<Item> items; @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder viewHolder; if (convertView == null) { convertView = inflater.inflate(R.layout.list_item, parent, false); viewHolder = new ViewHolder(); convertView.setTag(viewHolder); } else { viewHolder = (ViewHolder) convertView.getTag(); } Item item = getItem(position); viewHolder.titleView.setText(item.getItemName()); return convertView; } public static class ViewHolder { ImageView thumbnail; TextView titleView; public ViewHolder(View view) { this.thumbnail = (ImageView) view.findViewById(R.id.thumbnail); this.titleView = (TextView) view.findViewById(R.id.title); } } } 7JFXͷࢀরΛอ࣋ ॳճͷΈ7JFX)PMEFSΛੜ
ෳͷҟͳΔϨΠΞτ 5JUMF 5JUMF 5JUMF 5JUMF %BUF %BUF %BUF
ViewType @Override public int getViewTypeCount() { return 2; } @Override
public int getItemViewType(int position) { if (position % 1 == 0) { return VIEW_TYPE_ODD; } else { return VIEW_TYPE_EVEN; } } ϨΠΞτͷछྨ QPTJUJPOʹରͯ͠ͲͷϨΠΞτΛ͏͔
ෳϨΠΞτ(ViewHolder) public static class ViewHolderOdd { TextView title; ImageView image;
} public static class ViewHolderEven { TextView title; TextView detail; ImageView image; }
ෳϨΠΞτ(ViewHolder൛) @Override public View getView(int position, View convertView, ViewGroup parent)
{ ViewHolder1 viewHolder1; ViewHolder2 viewHolder2; Item item = getItem(position); switch (getItemViewType(position)) { case VIEW_TYPE_ODD: if (convertView == null) { convertView = inflater.inflate(R.layout.list_item_1, parent, false); viewHolder1 = new ViewHolder(convertView); convertView.setTag(viewHolder1); } else { viewHolder1 = 1(ViewHolder) convertView.getTag(); } holder.title.setText(item.getName()); Picasso.with(getContext()) .load(item.getImageUrl) .placeholder(R.drawable.icon_user) .error(R.drawable.icon_user) .resizeDimen(R.dimen.list_item_user_icon_size, R.dimen.list_item_user_icon_size) .centerCrop() .into(holder.imageView); break; case VIEW_TYPE_EVEN: ɾɾɾ ɾɾɾ return convertView; } ͍
AdapterͷංେԽ • ViewHolderAdapter͕ංେ͍͢͠ • ෳϨΠΞτରԠ͢Δͱ͞ΒʹංେԽ • AdapterͷׂViewͱදࣔσʔλͷbinding • Viewͷදࣔॲཧ֤ViewΫϥε͕ॲཧ͢Δ͖
AdapterͷߴԽ • ViewHolder • Custom Layout
Custom Layoutͷಋೖ
LayoutΛܧঝͯ͠Custom LayoutΛ࡞ public class NormalLayout extends LinearLayout { TextView titleView;
ImageView imageView; @Override protected void onFinishInflate() { super.onFinishInflate(); titleView = (TextView) findViewById(R.id.title); imageView = (ImageView) findViewById(R.id.image); } public void setItem(Item item) { titleView.setText(item.getItemName()); Picasso.with(getContext()) .load(item.getImageUrl) .placeholder(R.drawable.icon_user) .error(R.drawable.icon_user) .resizeDimen(R.dimen.icon_size, R.dimen.user_icon_size) .centerCrop() .into(holder.imageView); } } PO'JOJTI*OqBUF ͕ݺΕͨޙʹpOE7JFX#Z*E ͢Δ͜ͱͰ 7JFX)PMEFSͱಉ༷ͷޮՌ͕ಘΒΕΔ
@Override public View getView(int position, View convertView, ViewGroup parent) {
NormalLayout normalLayout; SpecialLayout specialLayout; Item item = getItem(position); switch (getItemViewType(position)) { case VIEW_TYPE_ODD: if (convertView != null && (convertView instanceof NormalLayout)) { normalLayout = (NormalLayout) convertView; } else { normalLayout = (NormalLayout) inflater.inflate(R.layout.list_item_odd, parent, false); } normalLayout.setItem(item); return normalLayout; case VIEW_TYPE_EVEN: ɾɾɾ return specialLayout; } return null; } ෳϨΠΞτ(Custom Layout൛) -BZPVUपΓͷίʔυ͕ݮ͖ͬͯͬ͢Γ
ෳϨΠΞτ(ViewHolder൛) @Override public View getView(int position, View convertView, ViewGroup parent)
{ ViewHolder1 viewHolder1; ViewHolder2 viewHolder2; Item item = getItem(position); switch (getItemViewType(position)) { case VIEW_TYPE_ODD: if (convertView == null) { convertView = inflater.inflate(R.layout.list_item_1, parent, false); viewHolder1 = new ViewHolder(convertView); convertView.setTag(viewHolder1); } else { viewHolder1 = 1(ViewHolder) convertView.getTag(); } holder.title.setText(item.getName()); Picasso.with(getContext()) .load(item.getImageUrl) .placeholder(R.drawable.icon_user) .error(R.drawable.icon_user) .resizeDimen(R.dimen.list_item_user_icon_size, R.dimen.list_item_user_icon_size) .centerCrop() .into(holder.imageView); break; case VIEW_TYPE_EVEN: ɾɾɾ ɾɾɾ return convertView; }
ϦετͷදࣔཁૉΛमਖ਼Λ͢Δࡍ AdapterͰͳ͘ɺ Custom LayoutΫϥεΛमਖ਼͢ΕOK
ଞͷAdapterͰCustom Layout Λ͏͜ͱՄೳ
(SJE7JFXಉ༷ʹରԠՄೳ
·ͱΊ • Custom LayoutΛ͏͜ͱͰAdapterͷංେԽ͕ ͛Δ
͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠ɻ