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
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
AI Engineeringは、AIプロダクトだけのものか? 〜AIがソフトウェアを作る時代の新しい当たり前〜 / No AI in your product. AI Engineering in your development.
rkaga
5
500
わからない話を追いかけたら、プログラミング言語を作る側にいた
ydah
3
530
いまどきの Codex で開発する visionOS アプリの開発スタイルについて
karad
0
150
【デモ】Kiroで体験する仕様駆動開発|設計からコーディングまでAIと進める開発フロー
cmkudo
0
290
What's New in Android 2026
veronikapj
0
270
自動化したのに回らない テスト運用の壁―AI時代の品質責任と生産性
mfunaki
0
360
S3 を使うアプリケーションをローカル完結で動かすことに全力を注いでみた / Running S3 Apps Offline
contour_gara
0
560
VibeCodingからAgenticWorkflowへ
starfish719
0
720
まずはプロンプトガイドを読もう、話はそれからだ
kiakiraki
1
180
ここ半年くらいでAIに作らせたR用ツール
eitsupi
0
400
【QA Test Talk Vol.8】AI-DLC による Whole Team Approach の加速
pkshadeck
PRO
0
220
Gmail/Google DriveをトリガーにAIエージェントを動かそう! / Run AI agents with Gmail/Google Drive as triggers!
har1101
2
340
Featured
See All Featured
XXLCSS - How to scale CSS and keep your sanity
sugarenia
249
1.3M
Building Adaptive Systems
keathley
44
3.2k
Making the Leap to Tech Lead
cromwellryan
135
10k
Being A Developer After 40
akosma
91
590k
Leadership Guide Workshop - DevTernity 2021
reverentgeek
1
340
Unsuck your backbone
ammeep
672
58k
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
659
62k
How to train your dragon (web standard)
notwaldorf
97
6.8k
Producing Creativity
orderedlist
PRO
348
40k
State of Search Keynote: SEO is Dead Long Live SEO
ryanjones
0
250
More Than Pixels: Becoming A User Experience Designer
marktimemedia
3
500
HU Berlin: Industrial-Strength Natural Language Processing with spaCy and Prodigy
inesmontani
PRO
0
660
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ͷංେԽ͕ ͛Δ
͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠ɻ