SlideShare a Scribd company logo
1 of 70
Download to read offline
RecyclerView
droid girls meetup #2
Yuki Anzai (@yanzm)
• blog : Y.A.M の雑記帳
• y-anz-m.blogspot.com
• twitter : @yanzm (やんざむ)
• uPhyca Inc. (株式会社ウフィカ)
あんざいゆき
RecyclerView
A flexible view for
providing a limited window
into a large data set.
RecyclerView
RecyclerView は
サポートライブラリ
https://developer.android.com/topic/libraries/support-
library/features.html#v7-recyclerview
RecyclerView
大規模なデータセットに、
限定されたウィンドウを
提供するための柔軟なビュー
RecyclerView
大規模なデータセットの一部を
ビューを再利用しながら
表示するためのコンポーネント
RecyclerView
ListViewとかGridView
みたいなやつ
RecyclerViewの構成
• RecyclerView
• データを表示するためのスクロール可能な
View
• RecyclerView
• データを表示するためのスクロール可能な
View
• RecyclerView.LayoutManager
• アイテム用のビューのサイズを計算し、配
置する
RecyclerViewの構成
• RecyclerView.Adapter
• RecyclerViewに表示するデータセットを
管理し、アイテム用のViewにデータを紐
づける
RecyclerViewの構成
• RecyclerView.Adapter
• RecyclerViewに表示するデータセットを
管理し、アイテム用のViewにデータを紐
づける
• RecyclerView.ViewHolder
• アイテム用のビューとメタデータを保持す
る
RecyclerViewの構成
RecyclerViewの構成
RecyclerView LayoutManager
Adapter
子ビュー配置
子ビュー
(ViewHolder)
にデータ紐付
Recycler
ViewHolderを再利用
再利用する
ViewHolder
ListViewの構成
RecyclerView LayoutManager
Adapter
子ビュー配置
子ビュー
(ViewHolder)
にデータ紐付
Recycler
ViewHolderを再利用
再利用する
ViewHolder
ListView
ListAdapter
ListViewの構成
ListView =
RecyclerView + LayoutManager + Recycler
+ その他もろもろの機能
ListAdapter = Adapter + ViewHolder
ListViewの構成
ListView =
RecyclerView + LayoutManager + Recycler
+ その他もろもろの機能
ListAdapter = Adapter + ViewHolder
ListView vs RecyclerView
ListView RecyclerView
区切り線 ⚪ 自分で実装
listSelector ⚪
onItemClick ⚪ 自分で実装
choiceMode ⚪
*
* android.support.v7.widget.DividerItemDecoration が 25.0.0 で追加されました
ListView vs RecyclerView
ListView RecyclerView
Filter ⚪ 自分で実装
FadingEdge ⚪ 自分で実装
Header, Footer ⚪ 自分で実装
StaggeredGrid ⚪
ListView vs RecyclerView
ListView RecyclerView
追加・削除の
アニメーション
自分で実装 ⚪
Swipe to Dismiss 自分で実装 ⚪
Drag & Drop 自分で実装 ⚪
横スクロール配置 ⚪
RecyclerViewの
一番シンプルな
使い方
gradle の設定
dependencies {

…



compile 'com.android.support:recyclerview-v7:25.1.0'

}
最低限必要なもの
• RecyclerView
• RecyclerView.LayoutManager
• RecyclerView.Adapter
• RecyclerView.ViewHolder
最低限必要なもの
• RecyclerView
• RecyclerView.LayoutManager
• RecyclerView.Adapter
• RecyclerView.ViewHolder
<android.support.v7.widget.RecyclerView

android:id="@+id/recycler_view"

android:layout_width="match_parent"

android:layout_height="match_parent"

app:layoutManager="LinearLayoutManager"/>
RecyclerView + LayoutManager
<android.support.v7.widget.RecyclerView

android:id="@+id/recycler_view"

android:layout_width="match_parent"

android:layout_height="match_parent"

app:layoutManager="android.support.v7.widget.LinearLayou
RecyclerView + LayoutManager
RecyclerView + LayoutManager
<android.support.v7.widget.RecyclerView

android:id="@+id/recycler_view"

android:layout_width="match_parent"

android:layout_height="match_parent"

app:layoutManager="net.yanzm.sample.MyLayoutManager"/>
最低限必要なもの
• RecyclerView
• RecyclerView.LayoutManager
• RecyclerView.Adapter
• RecyclerView.ViewHolder
public class ViewHolder extends RecyclerView.ViewHolder {



private static final int LAYOUT_ID = android.R.layout.simple_list_item_1;



@NonNull

public static ViewHolder create(@NonNull LayoutInflater inflater,

ViewGroup parent) {

return new ViewHolder(inflater.inflate(LAYOUT_ID, parent, false));

}



final TextView textView;



private ViewHolder(View itemView) {

super(itemView);

textView = (TextView) itemView.findViewById(android.R.id.text1);

}

}
ViewHolder
public class SimpleAdapter extends RecyclerView.Adapter<ViewHolder> {



@NonNull

private final List<String> data;



public SimpleAdapter(@NonNull List<String> data) {

this.data = data;

}



@Override

public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

final LayoutInflater inflater = LayoutInflater.from(parent.getContext())
return ViewHolder.create(inflater, parent);

}



@Override

public void onBindViewHolder(ViewHolder holder, int position) {

final String text = data.get(position);

holder.textView.setText(text);

}



@Override

public int getItemCount() {

return data.size();

}

}
Adapter
public class MainActivity extends AppCompatActivity {



@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);



RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recycler_view)
recyclerView.setHasFixedSize(true);



List<String> data = new ArrayList<>();

for (int i = 0; i < 30; i++) {

data.add("Item : " + i);

}



final SimpleAdapter adapter = new SimpleAdapter(data);

recyclerView.setAdapter(adapter);

}

}
Activity
LinearLayoutManager
GridLayoutManager
StaggeredGridLayoutManager
LinearLayoutManager
• 設定項目
• orientation
• reverseLayout
• stackFromEnd
orientation
• デフォルトはLinearLayoutManager.VERTICAL
<?xml version="1.0" encoding="utf-8"?>

<android.support.v7.widget.RecyclerView

…

android:orientation="horizontal"

app:layoutManager="LinearLayoutManager" />
new LinearLayoutManager(this,
LinearLayoutManager.HORIZONTAL, false);
layoutManager.setOrientation(LinearLayoutManager.HORIZONTAL);
or
or
app:reverseLayout="true" app:stackFromEnd="true"
GridLayoutManager
• 設定項目
• spanCount
• orientation
• reverseLayout
• stackFromEnd
spanCount
• 列数、デフォルトは1
<?xml version="1.0" encoding="utf-8"?>

<android.support.v7.widget.RecyclerView

…

app:layoutManager="GridLayoutManager"

app:spanCount="2" />
new GridLayoutManager(this, 2);
layoutManager.setSpanCount(2);
or
or
StaggeredGridLayoutManager
• 設定項目
• spanCount
• orientation
• reverseLayout
ItemDecorationで
Dividerをつける
DividerItemDecoration
• v25.0.0 で DividerItemDecoration が追加された
のでそれを使うのが簡単
• https://developer.android.com/reference/
android/support/v7/widget/
DividerItemDecoration.html
• 一番最後のアイテムの下にも描画されてしまう
recyclerView.addItemDecoration(
new DividerItemDecoration(this, DividerItemDecoration.VERTICAL));
ItemDecoration
• 装飾を行うためのクラス
• アイテム用のViewのoffsetを指定
• onDraw()でRecyclerViewの下に描画
• onDrawOver()でRecyclerVieの上に描画
アイテム用のViewのOffsetを指定
final int offset = (int) (8 * getResources().getDisplayMetrics().density);



RecyclerView.ItemDecoration itemDecoration = new RecyclerView.ItemDecoration() {

@Override

public void getItemOffsets(Rect outRect, View view,

RecyclerView parent, RecyclerView.State state) {

outRect.set(offset, offset, offset, offset);

}

};

recyclerView.addItemDecoration(itemDecoration);
アイテム用のViewのOffsetを指定
RecyclerView.ItemDecoration itemDecoration = new RecyclerView.ItemDecoration() {

@Override

public void getItemOffsets(Rect outRect, View view,

RecyclerView parent, RecyclerView.State state) {

int position = ((RecyclerView.LayoutParams) view.getLayoutParams())

.getViewLayoutPosition();

if (position == 0) {

outRect.set(offset, offset, offset, offset);

} else {

outRect.set(offset, 0, offset, offset);

}

}

};



recyclerView.addItemDecoration(itemDecoration);
public class DividerDecoration extends RecyclerView.ItemDecoration {



private final Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);

private final int dividerHeight;



public DividerDecoration(Resources res) {

paint.setColor(Color.GRAY);

dividerHeight = (int) (4 * res.getDisplayMetrics().density);

}



@Override

public void getItemOffsets(Rect outRect, View view, RecyclerView parent, 

RecyclerView.State state) {

final int position = ((RecyclerView.LayoutParams) view.getLayoutParams())

.getViewLayoutPosition();

// 位置が2番目以降なら上部にdividerを描画したいので、

// divider分だけ上をあける



int top = position == 0 ? 0 : dividerHeight;

outRect.set(0, top, 0, 0);

}
Dividerを描画
@Override

public void onDrawOver(Canvas c, RecyclerView parent, RecyclerView.State state) {

super.onDrawOver(c, parent, state);

// アイテムのビューより上に描画される





final RecyclerView.LayoutManager manager = parent.getLayoutManager();

final int left = parent.getPaddingLeft();

final int right = parent.getWidth() - parent.getPaddingRight();

final int childCount = parent.getChildCount();

for (int i = 1; i < childCount; i++) {

final View child = parent.getChildAt(i);

final RecyclerView.LayoutParams params =

(RecyclerView.LayoutParams) child.getLayoutParams();

if (params.getViewLayoutPosition() == 0) {

continue;

}



// ViewCompat.getTranslationY()を入れないと

// 追加・削除のアニメーション時の位置が変になる

final int top = manager.getDecoratedTop(child)

- params.topMargin + Math.round(ViewCompat.getTranslationY(child));

final int bottom = top + dividerHeight;

c.drawRect(left, top, right, bottom, paint);

}

}

}

Dividerを描画
onItemClick
OnItemClick
• 方法がいくつかある
• ViewHolderのitemViewに
View.setOnClickListener
• ItemDecorationでタップされたアイテムの
位置にselectorを描画
OnItemClick
• 方法がいくつかある
• ViewHolderのitemViewに
View.setOnClickListener
• ItemDecorationでタップされたアイテムの
位置にselectorを描画
v17 leanback
library はこっち
public class SimpleAdapter extends RecyclerView.Adapter<ViewHolder> {



…



protected void onItemClicked(String text) {

}



@Override

public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

final LayoutInflater inflater = LayoutInflater.from(parent.getContext());

final ViewHolder holder = ViewHolder.create(inflater, parent);

holder.itemView.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

final int position = holder.getAdapterPosition();

final String text = data.get(position);

onItemClicked(text);

}

});

return holder;

}



…

}
OnItemClick
public class MainActivity extends AppCompatActivity {



@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);



…



final SimpleAdapter adapter = new SimpleAdapter(data) {

@Override

protected void onItemClicked(String text) {

super.onItemClicked(text);

Toast.makeText(MainActivity.this, text, Toast.LENGTH_SHORT).show();

}

};

recyclerView.setAdapter(adapter);
OnItemClick
データの追加・削除・変更
notify**
• ArrayAdapterに相当するものは用意されていない
• データの追加・削除・変更時にはnotifyItem**()を呼ぶ
• notifyDataSetChanged()はそれ以外のときだけにする
notify**
• notifyItemChanged(int position)
• positionの位置のアイテムの変更された
• notifyItemInserted(int position)
• posiitonの位置にアイテムが追加された
• notifyItemRemoved(int position)
• positionの位置のアイテムが削除された
notify**
• notifyItemMoved(int fromPosition, int toPosition)
• fromPositionにあったアイテムがtoPositionに移動した
• notifyItemRangeChanged(int positionStart, int itemCount)
• positionStartからitemCount個のアイテムが変更された
• notifyItemRangeInserted(int positionStart, int itemCount)
• positionStartにitemCount個のアイテムが追加された
notify**
• notifyItemRangeRemoved(int positionStart, int itemCount)
• positionStartからitemCount個のアイテムが削除された
• notifyDataSetChanged()
• データセットが変更された
public abstract class ArrayAdapter<T, VH extends RecyclerView.ViewHolder> extends
RecyclerView.Adapter<VH> {



private final Object lock = new Object();

private final List<T> objects;



public ArrayAdapter() {

this(new ArrayList<T>());

}



public ArrayAdapter(List<T> objects) {

this.objects = objects;

}



public void add(@NonNull T object) {

final int position;

synchronized (lock) {

position = objects.size();

objects.add(object);

}

notifyItemInserted(position);

}

ArrayAdapter的なRecyclerView用Adapter
public void addAll(@NonNull Collection<? extends T> collection) {

final int itemCount = collection.size();

final int positionStart;

synchronized (lock) {

positionStart = objects.size();

objects.addAll(collection);

}

notifyItemRangeInserted(positionStart, itemCount);

}



public void insert(@NonNull T object, int index) {

synchronized (lock) {

objects.add(index, object);

}

notifyItemInserted(index);

}



public void remove(@NonNull T object) {

final int position = objects.indexOf(object);

synchronized (lock) {

objects.remove(object);

}

notifyItemRemoved(position);

}

}
ArrayAdapter的なRecyclerView用Adapter
ItemViewType
getItemViewType()
• レイアウトの種類(ViewHolder の種類)に応じて別の値
を返すようにする
• データの種類ではない
• 同じ itemViewType で ViewHolder が再利用される
Header と Footer をつくる
• レイアウトの種類(ViewHolder の種類)に応じて別の値
を返すようにする
• データの種類ではない
• 同じ itemViewType で ViewHolder が再利用される
Header と Footer をつくる
public class SimpleAdapter2 extends RecyclerView.Adapter {



private static final int VIEW_TYPE_HEADER = 0;

private static final int VIEW_TYPE_FOOTER = 1;

private static final int VIEW_TYPE_ITEM = 2;



…



@Override

public int getItemCount() {

return data.size() + 2; // header + footer

}



@Override

public int getItemViewType(int position) {

if (position == 0) {

return VIEW_TYPE_HEADER;

}

if (position == getItemCount() - 1) {

return VIEW_TYPE_FOOTER;

}

return VIEW_TYPE_ITEM;

}

}
Header と Footer をつくる
public class SimpleAdapter2 extends RecyclerView.Adapter {



…



@Override

public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

final LayoutInflater inflater = LayoutInflater.from(parent.getContext());

switch (viewType) {

case VIEW_TYPE_HEADER: {

return HeaderViewHolder.create(inflater, parent);

}

case VIEW_TYPE_FOOTER: {

return FooterViewHolder.create(inflater, parent);

}

case VIEW_TYPE_ITEM: {

final ViewHolder holder = ViewHolder.create(inflater, parent);

holder.itemView.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

final int position = holder.getAdapterPosition();

final String text = data.get(position);

onItemClicked(text);

}

});

return holder;

}

}



return null;

}
Header と Footer をつくる
public class SimpleAdapter2 extends RecyclerView.Adapter {



…



@Override

public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {

if (holder instanceof ViewHolder) {

final ViewHolder viewHolder = (ViewHolder) holder;

final String text = data.get(position);

viewHolder.textView.setText(text);

}

}
まとめ
• シンプルなList, Grid →
• ListView, GridView
• RecyclerView
• ListView, GridView では無理な配置 →
• RecyclerView
まとめ

More Related Content

Viewers also liked

What's new in Android N at Google I/O extended in Fukuoka
What's new in Android N at Google I/O extended in FukuokaWhat's new in Android N at Google I/O extended in Fukuoka
What's new in Android N at Google I/O extended in FukuokaYuki Anzai
 
今どきの若手育成にひそむ3つの思いこみ
今どきの若手育成にひそむ3つの思いこみ今どきの若手育成にひそむ3つの思いこみ
今どきの若手育成にひそむ3つの思いこみMariko Hayashi
 
application Next Generation presented by android女子部
application Next Generation presented by android女子部application Next Generation presented by android女子部
application Next Generation presented by android女子部Yuki Anzai
 
How to read "marble diagram"
How to read "marble diagram"How to read "marble diagram"
How to read "marble diagram"Yuki Anzai
 
「Android アプリのガチ開 発者が Mobile Backend Starter を使ってみた」
「Android アプリのガチ開 発者が Mobile Backend Starter を使ってみた」「Android アプリのガチ開 発者が Mobile Backend Starter を使ってみた」
「Android アプリのガチ開 発者が Mobile Backend Starter を使ってみた」Yuki Anzai
 
Tech Talk #2: Android app performance tips
Tech Talk #2: Android app performance tipsTech Talk #2: Android app performance tips
Tech Talk #2: Android app performance tipsNexus FrontierTech
 
Android 02 - Recycler View Adapter
Android 02 - Recycler View AdapterAndroid 02 - Recycler View Adapter
Android 02 - Recycler View AdapterAline Borges
 
Mastering RecyclerView Layouts
Mastering RecyclerView LayoutsMastering RecyclerView Layouts
Mastering RecyclerView LayoutsDave Smith
 
Android Training (AdapterView & Adapter)
Android Training (AdapterView & Adapter)Android Training (AdapterView & Adapter)
Android Training (AdapterView & Adapter)Khaled Anaqwa
 
Tutorial android - créer des apps
Tutorial android - créer des appsTutorial android - créer des apps
Tutorial android - créer des appsNoé Breiss
 
Life with Android - Docomo SmartPhone Lounge Event -
Life with Android - Docomo SmartPhone Lounge Event -Life with Android - Docomo SmartPhone Lounge Event -
Life with Android - Docomo SmartPhone Lounge Event -Yuki Anzai
 
Architecture et Bonnes pratiques Android #DevoxxFr2016 Part2
Architecture et Bonnes pratiques Android #DevoxxFr2016 Part2Architecture et Bonnes pratiques Android #DevoxxFr2016 Part2
Architecture et Bonnes pratiques Android #DevoxxFr2016 Part2Mathias Seguy
 
Adapter & ListView & ExpandalbeListView
Adapter & ListView & ExpandalbeListViewAdapter & ListView & ExpandalbeListView
Adapter & ListView & ExpandalbeListViewYuki Anzai
 
主婦でもできる Android Layout
主婦でもできる Android Layout主婦でもできる Android Layout
主婦でもできる Android LayoutHiromi Tsuzuki
 
FirefoxOSで学ぶJavaScript作法
FirefoxOSで学ぶJavaScript作法FirefoxOSで学ぶJavaScript作法
FirefoxOSで学ぶJavaScript作法cch-robo
 
Titanium 3.3 / 3.4 と iOS で気をつけたいこと
Titanium 3.3 / 3.4 と iOS で気をつけたいことTitanium 3.3 / 3.4 と iOS で気をつけたいこと
Titanium 3.3 / 3.4 と iOS で気をつけたいことRyutaro Miyashita
 

Viewers also liked (20)

What's new in Android N at Google I/O extended in Fukuoka
What's new in Android N at Google I/O extended in FukuokaWhat's new in Android N at Google I/O extended in Fukuoka
What's new in Android N at Google I/O extended in Fukuoka
 
今どきの若手育成にひそむ3つの思いこみ
今どきの若手育成にひそむ3つの思いこみ今どきの若手育成にひそむ3つの思いこみ
今どきの若手育成にひそむ3つの思いこみ
 
application Next Generation presented by android女子部
application Next Generation presented by android女子部application Next Generation presented by android女子部
application Next Generation presented by android女子部
 
How to read "marble diagram"
How to read "marble diagram"How to read "marble diagram"
How to read "marble diagram"
 
「Android アプリのガチ開 発者が Mobile Backend Starter を使ってみた」
「Android アプリのガチ開 発者が Mobile Backend Starter を使ってみた」「Android アプリのガチ開 発者が Mobile Backend Starter を使ってみた」
「Android アプリのガチ開 発者が Mobile Backend Starter を使ってみた」
 
Fun with RecyclerView
Fun with RecyclerViewFun with RecyclerView
Fun with RecyclerView
 
Tech Talk #2: Android app performance tips
Tech Talk #2: Android app performance tipsTech Talk #2: Android app performance tips
Tech Talk #2: Android app performance tips
 
Recyclerview in action
Recyclerview in action Recyclerview in action
Recyclerview in action
 
Bonnes pratiques développement android
Bonnes pratiques développement androidBonnes pratiques développement android
Bonnes pratiques développement android
 
Android 02 - Recycler View Adapter
Android 02 - Recycler View AdapterAndroid 02 - Recycler View Adapter
Android 02 - Recycler View Adapter
 
Mastering RecyclerView Layouts
Mastering RecyclerView LayoutsMastering RecyclerView Layouts
Mastering RecyclerView Layouts
 
Android Training (AdapterView & Adapter)
Android Training (AdapterView & Adapter)Android Training (AdapterView & Adapter)
Android Training (AdapterView & Adapter)
 
Tutorial android - créer des apps
Tutorial android - créer des appsTutorial android - créer des apps
Tutorial android - créer des apps
 
Life with Android - Docomo SmartPhone Lounge Event -
Life with Android - Docomo SmartPhone Lounge Event -Life with Android - Docomo SmartPhone Lounge Event -
Life with Android - Docomo SmartPhone Lounge Event -
 
Architecture et Bonnes pratiques Android #DevoxxFr2016 Part2
Architecture et Bonnes pratiques Android #DevoxxFr2016 Part2Architecture et Bonnes pratiques Android #DevoxxFr2016 Part2
Architecture et Bonnes pratiques Android #DevoxxFr2016 Part2
 
Android adapters
Android adaptersAndroid adapters
Android adapters
 
Adapter & ListView & ExpandalbeListView
Adapter & ListView & ExpandalbeListViewAdapter & ListView & ExpandalbeListView
Adapter & ListView & ExpandalbeListView
 
主婦でもできる Android Layout
主婦でもできる Android Layout主婦でもできる Android Layout
主婦でもできる Android Layout
 
FirefoxOSで学ぶJavaScript作法
FirefoxOSで学ぶJavaScript作法FirefoxOSで学ぶJavaScript作法
FirefoxOSで学ぶJavaScript作法
 
Titanium 3.3 / 3.4 と iOS で気をつけたいこと
Titanium 3.3 / 3.4 と iOS で気をつけたいことTitanium 3.3 / 3.4 と iOS で気をつけたいこと
Titanium 3.3 / 3.4 と iOS で気をつけたいこと
 

Similar to droidgirls Recyclerview

チュートリアルをリッチにしよう
チュートリアルをリッチにしようチュートリアルをリッチにしよう
チュートリアルをリッチにしようshinya sakemoto
 
React+redux+saga 02
React+redux+saga 02React+redux+saga 02
React+redux+saga 02TIS Inc
 
SocialWeb Conference vol.5 OpenSocial Night #2
SocialWeb Conference vol.5 OpenSocial Night #2SocialWeb Conference vol.5 OpenSocial Night #2
SocialWeb Conference vol.5 OpenSocial Night #2Nobuhiro Nakajima
 
UICollectionViewLayoutでカバーフローを作りたい!
UICollectionViewLayoutでカバーフローを作りたい!UICollectionViewLayoutでカバーフローを作りたい!
UICollectionViewLayoutでカバーフローを作りたい!sawat1203
 
Windows ストアアプリのgrid viewを入門してみた
Windows ストアアプリのgrid viewを入門してみたWindows ストアアプリのgrid viewを入門してみた
Windows ストアアプリのgrid viewを入門してみた一希 大田
 
はじめよう Backbone.js
はじめよう Backbone.jsはじめよう Backbone.js
はじめよう Backbone.jsHiroki Toyokawa
 
React+redux+saga 01
React+redux+saga 01React+redux+saga 01
React+redux+saga 01TIS Inc
 
Featuring Project Silk & Liike: 楽しい "モダン" Web 開発のちょっとディープなお話
Featuring Project Silk & Liike: 楽しい "モダン" Web 開発のちょっとディープなお話Featuring Project Silk & Liike: 楽しい "モダン" Web 開発のちょっとディープなお話
Featuring Project Silk & Liike: 楽しい "モダン" Web 開発のちょっとディープなお話Akira Inoue
 
Android Architecture Componentsの新機能
Android Architecture Componentsの新機能Android Architecture Componentsの新機能
Android Architecture Componentsの新機能Damper Matsu
 
Xamarin で ReactiveUI を使ってみた
Xamarin で ReactiveUI を使ってみたXamarin で ReactiveUI を使ってみた
Xamarin で ReactiveUI を使ってみたHironov OKUYAMA
 
アップルのテンプレートは有害と考えられる
アップルのテンプレートは有害と考えられるアップルのテンプレートは有害と考えられる
アップルのテンプレートは有害と考えられるBrian Gesiak
 
scala+liftで遊ぼう
scala+liftで遊ぼうscala+liftで遊ぼう
scala+liftで遊ぼうyouku
 
Next2Dで始めるゲーム開発 - Game Development Starting with Next2D
Next2Dで始めるゲーム開発  - Game Development Starting with Next2DNext2Dで始めるゲーム開発  - Game Development Starting with Next2D
Next2Dで始めるゲーム開発 - Game Development Starting with Next2DToshiyuki Ienaga
 
RestKitの紹介 - Webサービスのクライアント実装補助フレームワーク -
RestKitの紹介 - Webサービスのクライアント実装補助フレームワーク -RestKitの紹介 - Webサービスのクライアント実装補助フレームワーク -
RestKitの紹介 - Webサービスのクライアント実装補助フレームワーク -次朗 永島
 

Similar to droidgirls Recyclerview (18)

チュートリアルをリッチにしよう
チュートリアルをリッチにしようチュートリアルをリッチにしよう
チュートリアルをリッチにしよう
 
React+redux+saga 02
React+redux+saga 02React+redux+saga 02
React+redux+saga 02
 
SocialWeb Conference vol.5 OpenSocial Night #2
SocialWeb Conference vol.5 OpenSocial Night #2SocialWeb Conference vol.5 OpenSocial Night #2
SocialWeb Conference vol.5 OpenSocial Night #2
 
UICollectionViewLayoutでカバーフローを作りたい!
UICollectionViewLayoutでカバーフローを作りたい!UICollectionViewLayoutでカバーフローを作りたい!
UICollectionViewLayoutでカバーフローを作りたい!
 
Windows ストアアプリのgrid viewを入門してみた
Windows ストアアプリのgrid viewを入門してみたWindows ストアアプリのgrid viewを入門してみた
Windows ストアアプリのgrid viewを入門してみた
 
Android study part3
Android study part3Android study part3
Android study part3
 
Blocksの活用法
Blocksの活用法Blocksの活用法
Blocksの活用法
 
実践 NestJS
実践 NestJS実践 NestJS
実践 NestJS
 
はじめよう Backbone.js
はじめよう Backbone.jsはじめよう Backbone.js
はじめよう Backbone.js
 
React+redux+saga 01
React+redux+saga 01React+redux+saga 01
React+redux+saga 01
 
Featuring Project Silk & Liike: 楽しい "モダン" Web 開発のちょっとディープなお話
Featuring Project Silk & Liike: 楽しい "モダン" Web 開発のちょっとディープなお話Featuring Project Silk & Liike: 楽しい "モダン" Web 開発のちょっとディープなお話
Featuring Project Silk & Liike: 楽しい "モダン" Web 開発のちょっとディープなお話
 
Swiftyを試す
Swiftyを試すSwiftyを試す
Swiftyを試す
 
Android Architecture Componentsの新機能
Android Architecture Componentsの新機能Android Architecture Componentsの新機能
Android Architecture Componentsの新機能
 
Xamarin で ReactiveUI を使ってみた
Xamarin で ReactiveUI を使ってみたXamarin で ReactiveUI を使ってみた
Xamarin で ReactiveUI を使ってみた
 
アップルのテンプレートは有害と考えられる
アップルのテンプレートは有害と考えられるアップルのテンプレートは有害と考えられる
アップルのテンプレートは有害と考えられる
 
scala+liftで遊ぼう
scala+liftで遊ぼうscala+liftで遊ぼう
scala+liftで遊ぼう
 
Next2Dで始めるゲーム開発 - Game Development Starting with Next2D
Next2Dで始めるゲーム開発  - Game Development Starting with Next2DNext2Dで始めるゲーム開発  - Game Development Starting with Next2D
Next2Dで始めるゲーム開発 - Game Development Starting with Next2D
 
RestKitの紹介 - Webサービスのクライアント実装補助フレームワーク -
RestKitの紹介 - Webサービスのクライアント実装補助フレームワーク -RestKitの紹介 - Webサービスのクライアント実装補助フレームワーク -
RestKitの紹介 - Webサービスのクライアント実装補助フレームワーク -
 

More from Yuki Anzai

Watch face アプリを公開してみた
Watch face アプリを公開してみたWatch face アプリを公開してみた
Watch face アプリを公開してみたYuki Anzai
 
"あんざいゆき" x "秋葉ちひろ" はカンファレンスアプリをどう作るのか?
"あんざいゆき" x "秋葉ちひろ" はカンファレンスアプリをどう作るのか?"あんざいゆき" x "秋葉ちひろ" はカンファレンスアプリをどう作るのか?
"あんざいゆき" x "秋葉ちひろ" はカンファレンスアプリをどう作るのか?Yuki Anzai
 
Android Pattern Cookbook で見るトレンドの変遷
Android Pattern Cookbook で見るトレンドの変遷Android Pattern Cookbook で見るトレンドの変遷
Android Pattern Cookbook で見るトレンドの変遷Yuki Anzai
 
Sublime Text 2 で始める ReVIEW
Sublime Text 2 で始める ReVIEWSublime Text 2 で始める ReVIEW
Sublime Text 2 で始める ReVIEWYuki Anzai
 
ABC2013 Autumn あんざいゆき x 小太刀御禄 対談
ABC2013 Autumn あんざいゆき x 小太刀御禄 対談ABC2013 Autumn あんざいゆき x 小太刀御禄 対談
ABC2013 Autumn あんざいゆき x 小太刀御禄 対談Yuki Anzai
 
アプリのUIを改善するための7ステップ ∼Bump Recorder の UI を設計してみたよ編∼
アプリのUIを改善するための7ステップ ∼Bump Recorder の UI を設計してみたよ編∼ アプリのUIを改善するための7ステップ ∼Bump Recorder の UI を設計してみたよ編∼
アプリのUIを改善するための7ステップ ∼Bump Recorder の UI を設計してみたよ編∼ Yuki Anzai
 
Fragment を使ってみよう
Fragment を使ってみようFragment を使ってみよう
Fragment を使ってみようYuki Anzai
 
Android Layout Cookbook Seminor
Android Layout Cookbook SeminorAndroid Layout Cookbook Seminor
Android Layout Cookbook SeminorYuki Anzai
 
ボクの開発スタイル
ボクの開発スタイルボクの開発スタイル
ボクの開発スタイルYuki Anzai
 
Android Layout 3分クッキング
Android Layout 3分クッキングAndroid Layout 3分クッキング
Android Layout 3分クッキングYuki Anzai
 
Head First XML Layout on Android
Head First XML Layout on AndroidHead First XML Layout on Android
Head First XML Layout on AndroidYuki Anzai
 

More from Yuki Anzai (11)

Watch face アプリを公開してみた
Watch face アプリを公開してみたWatch face アプリを公開してみた
Watch face アプリを公開してみた
 
"あんざいゆき" x "秋葉ちひろ" はカンファレンスアプリをどう作るのか?
"あんざいゆき" x "秋葉ちひろ" はカンファレンスアプリをどう作るのか?"あんざいゆき" x "秋葉ちひろ" はカンファレンスアプリをどう作るのか?
"あんざいゆき" x "秋葉ちひろ" はカンファレンスアプリをどう作るのか?
 
Android Pattern Cookbook で見るトレンドの変遷
Android Pattern Cookbook で見るトレンドの変遷Android Pattern Cookbook で見るトレンドの変遷
Android Pattern Cookbook で見るトレンドの変遷
 
Sublime Text 2 で始める ReVIEW
Sublime Text 2 で始める ReVIEWSublime Text 2 で始める ReVIEW
Sublime Text 2 で始める ReVIEW
 
ABC2013 Autumn あんざいゆき x 小太刀御禄 対談
ABC2013 Autumn あんざいゆき x 小太刀御禄 対談ABC2013 Autumn あんざいゆき x 小太刀御禄 対談
ABC2013 Autumn あんざいゆき x 小太刀御禄 対談
 
アプリのUIを改善するための7ステップ ∼Bump Recorder の UI を設計してみたよ編∼
アプリのUIを改善するための7ステップ ∼Bump Recorder の UI を設計してみたよ編∼ アプリのUIを改善するための7ステップ ∼Bump Recorder の UI を設計してみたよ編∼
アプリのUIを改善するための7ステップ ∼Bump Recorder の UI を設計してみたよ編∼
 
Fragment を使ってみよう
Fragment を使ってみようFragment を使ってみよう
Fragment を使ってみよう
 
Android Layout Cookbook Seminor
Android Layout Cookbook SeminorAndroid Layout Cookbook Seminor
Android Layout Cookbook Seminor
 
ボクの開発スタイル
ボクの開発スタイルボクの開発スタイル
ボクの開発スタイル
 
Android Layout 3分クッキング
Android Layout 3分クッキングAndroid Layout 3分クッキング
Android Layout 3分クッキング
 
Head First XML Layout on Android
Head First XML Layout on AndroidHead First XML Layout on Android
Head First XML Layout on Android
 

Recently uploaded

業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)Hiroshi Tomioka
 
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NTT DATA Technology & Innovation
 
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案sugiuralab
 
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfAWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfFumieNakayama
 
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfクラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfFumieNakayama
 
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?akihisamiyanaga1
 
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)UEHARA, Tetsutaro
 
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...博三 太田
 
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineerYuki Kikuchi
 

Recently uploaded (9)

業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
 
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
 
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
 
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfAWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
 
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfクラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
 
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
 
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
 
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
 
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
 

droidgirls Recyclerview