android v 7互換パッケージRecyclerViewの使用(二)
11871 ワード
前回android v 7互換パッケージRecyclerViewの使用(一)RecyclerViewの最も基本的な使い方を述べましたが、今からもっと詳しい内容を掘り起こします.RecyclerViewのAPIで、こんな言葉がありました
A flexible view for providing a limited window into a large data set.
つまり、限られたサイズのウィンドウに大量のデータが表示されている場合、RecyclerViewはこのような状況を解決する柔軟なViewです.
以上の説明から、RecyclerViewの使用シーンがわかります.同じタイプのデータが大量に画面に表示されている場合、すべてのデータが画面全体に完全に表示されない可能性があります.この場合、RecyclerViewは適切な選択です.ユーザが画面を上下にスクロールすると、itemのリサイクルも同時に行われ、新しいitemが可視範囲に入ると、必然的に古いitemが可視範囲から移動し、この移動されたitemもリサイクルされる.では、itemを再利用するのにどのような役割があるのでしょうか.実は、CPUリソースとメモリを節約するため、彼はとても役に立つ方法です.
私たちがListViewを使うのに長い時間がかかったと言うかもしれませんが、RecyclerViewは私たちの以前の方法と何か特別なところがありましたか.昔、listviewを使っていたとき、リサイクルや他のものにはある程度の結合性があり、今ではRecyclerViewではより柔軟な方法を提供しています.
Googleが現在使用しているこの方法は、RecyclerViewが見ているものを気にしないし、要素が正しい場所に表示されているかどうかも気にしないし、各要素がどのように区切られているかも気にしない.RecyclerViewがやっていることはリサイクルだけです.そのため、RecyclerViewと呼ばれています.
以下に、RecyclerViewに関連する最も重要なクラスをいくつか示します.
Adapter:アダプタ、バインドデータセットViewHolder:現在のデータに基づいてビューを保存するLayoutManager:レイアウトマネージャ.itemがどのように配置するかを決定するItemDecoration:無理にitem装飾器と理解し、item ItemAnimator:アニメーションを美化することができ、1つのitemが追加されたり、削除されたり、再配置されたりすると、アニメーション効果があります.
ViewHolder
Androidの公式は、ある程度効率を大幅に向上させ、インタフェースのスムーズ性を高めることができるため、ViewHolderモードの使用を長い間推奨しています.RecyclerViewのアダプタは内部クラスであり、それを継承することでサブクラスを拡張します.
RecyclerView.Adapter
アダプタは、基礎データセットと単一itemレイアウトとのつながりを確立する2つの主要な機能を完了します.アダプタはAndroidの重要な部分の一つです.ListView、AutoCompleteTextView、Spinnerなど、多くの場所でアダプタが使用されています.
Googleは従来のAdapterの代わりにRecyclerViewの内部クラスAdapterを使用しているので、RecyclerViewではSimpleCursorAdapter、ArrayAdapterのようなアダプタは見られません.
残念なことにグーグルはRecyclerViewを提供していません.Adapterのデフォルト実装クラスは抽象クラスなので、3つの方法を実装する必要があります.
public VH onCreateViewHolder(ViewGroup parent, int viewType) public void onBindViewHolder(VH holder, int position) public int getItemCount()
VHはViewHolderから継承された汎用型であり、サブクラスに特定のタイプを指定する必要があります.基本的なアダプタの書き方は以下の通りです.
RecyclerView.LayoutManager
レイアウトマネージャはRecyclerViewの最も興味深い場所であり、すべてのサブitemのレイアウトを担当しています.最新のv 7互換ライブラリでは、LinearLayoutManager(リニアレイアウト)、GridLayoutManager(aグリッドレイアウト)、StaggeredGridLayoutManager(ストリーミングレイアウト)の3つの実装クラスがあります.デフォルトでは、レイアウトマネージャを設定しない場合は、リニアレイアウトを使用します.このクラスを継承することで、独自のレイアウトマネージャを実装し、itemの内容をどのように配置するかを自分で決めることができますが、上記の3つの実装クラスのコードを見てみると、これがどんなに容易ではないかがわかります.コードが長いですね...本当に!レイアウトマネージャの具体的な使用方法については、リニアレイアウトマネージャの簡単な使用について説明します.コードは次のとおりです.
RecyclerView.ItemDecoration
一応itemアクセサリーと呼んで、ItemDecorationを使ってitemにオフセット量を増やしたり、item分割線を増やしたり、ハイライトしたりすることができます.私たちは多くのItemDecorationを追加することができます.RecyclerViewはすべてのItemDecorationを順次巡回し、描画方法を呼び出して装飾を完了します.3つの抽象的な方法があります
public void onDraw(Canvas c, RecyclerView parent) public void onDrawOver(Canvas c, RecyclerView parent) public void getItemOffsets(Rect outRect, int itemPosition, RecyclerView parent)
onDrawで描いたコンテンツはitemのコンテンツによって遮られる可能性がありますが、onDrawOverで描いたコンテンツはitemの上に描かれます.オフセット量を使用してitemを簡単に分割できますが、分割線を表示したい場合はonDrawOverメソッドを使用して分割線を明示的に描画する必要があります.
レイアウトマネージャは、測定フェーズでgetItemOffsetメソッドを呼び出します.RectタイプのパラメータとoutRectパラメータは少し変に見えますが、なぜ戻り値を使わないのでしょうか.グーグルがこのようにした以上、意味があるに違いありません.これにより、すべてのitemが1つのRectオブジェクトを多重化することができるので、リソースを節約できます.これは必ずしも最良ではありませんが、確かに効率的にリソースを節約することができます.
注意すべき点は、onDraw()/onDrawOver()メソッドはitemごとに呼び出されず、すべてのitemの装飾内容を描くために呼び出されるだけです.したがって,この方法ではすべてのitemを巡回して描画しなければならない.
前の記事では、DividerItemDecorationのソースコードを簡単に提供しました.もちろん、ItemDecorationを継承することで、より豊富なコンテンツを実現することができます.
RecyclerView.ItemAnimator
ItemAnimatorクラスは主にアニメーション効果を処理し、以下の3つの場合、このアニメーションがトリガーされます.データセット にitemが追加される itemがデータセットから 削除されるインタフェースにおける位置が 移動する.
幸いなことに、v 7互換パッケージにはDefaultItemAnimatorというデフォルトの実装クラスが用意されています.設定しないと、デフォルトはクラスに適応します.
アニメーションを有効にするには、androidがデータの変更を知らなければならないことは明らかです.以前のアダプタでは、androidデータセットが変更されたことをnotifyDataSetChangedメソッドを呼び出して通知する必要がありました.しかし、この方法は適用されなくなりました.この方法では、すべての可視itemが再描画されますが、アニメーションはトリガーされません.アニメーションをトリガーするには、次のような方法を呼び出さなければなりません.
public final void notifyItemInserted(int position) public final void notifyItemRemoved(int position)
Listeners
Listener、RecyclerViewにはOnItemClickListenerとOnItemLongClickListenerがありませんが、OnItemTouchListenerを使用してジェスチャーを合わせてこれらのイベントを識別することができます.これは、同じ効果を実現するためにより多くのコードを作成する必要があることを意味します.
以上述べたように
レイアウトファイルで使用するコードは次のとおりです.
toolsアトリビュートは現在のレイアウトをレンダリングし、ビジュアル化エディタに切り替えると効果が表示されます.もちろん書かなくてもいいですが、効果は表示されません.
特定のプロパティは使用されていませんが、実際にはRecyclerViewのプロパティは親のViewGroupから来ています.RecyclerViewでは、generateLayoutParamsというAttributeSetを使用していますが、内部ではあまり属性を操作していません.
Activityで使うのも簡単です
以下のステップにまとめる RecyclerView参照 を取得レイアウトマネージャを作成し、RecyclerViewに を追加アダプタを作成し、RecyclerViewに を追加必要なら ItemAnimatorを作成し、必要であれば は、0から複数のListenerを作成し、RecyclerViewの に追加します.
基本的なソースコードは前の文章と同じで、ソースコードは住所をダウンロードしますhttp://download.csdn.net/detail/sbsujjbcy/8489667
この文章は参考にしたhttp://www.grokkingandroid.com/first-glance-androids-recyclerview/
A flexible view for providing a limited window into a large data set.
つまり、限られたサイズのウィンドウに大量のデータが表示されている場合、RecyclerViewはこのような状況を解決する柔軟なViewです.
以上の説明から、RecyclerViewの使用シーンがわかります.同じタイプのデータが大量に画面に表示されている場合、すべてのデータが画面全体に完全に表示されない可能性があります.この場合、RecyclerViewは適切な選択です.ユーザが画面を上下にスクロールすると、itemのリサイクルも同時に行われ、新しいitemが可視範囲に入ると、必然的に古いitemが可視範囲から移動し、この移動されたitemもリサイクルされる.では、itemを再利用するのにどのような役割があるのでしょうか.実は、CPUリソースとメモリを節約するため、彼はとても役に立つ方法です.
私たちがListViewを使うのに長い時間がかかったと言うかもしれませんが、RecyclerViewは私たちの以前の方法と何か特別なところがありましたか.昔、listviewを使っていたとき、リサイクルや他のものにはある程度の結合性があり、今ではRecyclerViewではより柔軟な方法を提供しています.
Googleが現在使用しているこの方法は、RecyclerViewが見ているものを気にしないし、要素が正しい場所に表示されているかどうかも気にしないし、各要素がどのように区切られているかも気にしない.RecyclerViewがやっていることはリサイクルだけです.そのため、RecyclerViewと呼ばれています.
以下に、RecyclerViewに関連する最も重要なクラスをいくつか示します.
Adapter:アダプタ、バインドデータセットViewHolder:現在のデータに基づいてビューを保存するLayoutManager:レイアウトマネージャ.itemがどのように配置するかを決定するItemDecoration:無理にitem装飾器と理解し、item ItemAnimator:アニメーションを美化することができ、1つのitemが追加されたり、削除されたり、再配置されたりすると、アニメーション効果があります.
ViewHolder
Androidの公式は、ある程度効率を大幅に向上させ、インタフェースのスムーズ性を高めることができるため、ViewHolderモードの使用を長い間推奨しています.RecyclerViewのアダプタは内部クラスであり、それを継承することでサブクラスを拡張します.
public final static class ListItemViewHolder extends RecyclerView.ViewHolder {
TextView title;//item
TextView description;//item
//
public ListItemViewHolder(View itemView) {
super(itemView);
//
title= (TextView) itemView.findViewById(R.id.title);
description= (TextView) itemView.findViewById(R.id.description);
}
}
RecyclerView.Adapter
アダプタは、基礎データセットと単一itemレイアウトとのつながりを確立する2つの主要な機能を完了します.アダプタはAndroidの重要な部分の一つです.ListView、AutoCompleteTextView、Spinnerなど、多くの場所でアダプタが使用されています.
Googleは従来のAdapterの代わりにRecyclerViewの内部クラスAdapterを使用しているので、RecyclerViewではSimpleCursorAdapter、ArrayAdapterのようなアダプタは見られません.
残念なことにグーグルはRecyclerViewを提供していません.Adapterのデフォルト実装クラスは抽象クラスなので、3つの方法を実装する必要があります.
public VH onCreateViewHolder(ViewGroup parent, int viewType) public void onBindViewHolder(VH holder, int position) public int getItemCount()
VHはViewHolderから継承された汎用型であり、サブクラスに特定のタイプを指定する必要があります.基本的なアダプタの書き方は以下の通りです.
public class RecyclerViewAdapter extends RecyclerView.Adapter <RecyclerViewAdapter.ItemViewHolder> {
private List<DemoModel> items;
RecyclerViewAdapter(List<DemoModel> modelData) {
if (modelData == null) {
throw new IllegalArgumentException(
"modelData must not be null");
}
this.items = modelData;
}
@Override
public ItemViewHolder onCreateViewHolder(
ViewGroup viewGroup, int viewType) {
View itemView = LayoutInflater.
from(viewGroup.getContext()).
inflate(R.layout.item,viewGroup,false);
return new ItemViewHolder(itemView);
}
@Override
public void onBindViewHolder(
ItemViewHolder viewHolder, int position) {
DemoModel model = items.get(position);
viewHolder.title.setText(model.getTitle());
viewHolder.description.setText(model.getDescription());
}
@Override
public int getItemCount() {
return items.size();
}
public final static class ItemViewHolder extends RecyclerView.ViewHolder {
// ... shown above in the ViewHolder section
}
}
RecyclerView.LayoutManager
レイアウトマネージャはRecyclerViewの最も興味深い場所であり、すべてのサブitemのレイアウトを担当しています.最新のv 7互換ライブラリでは、LinearLayoutManager(リニアレイアウト)、GridLayoutManager(aグリッドレイアウト)、StaggeredGridLayoutManager(ストリーミングレイアウト)の3つの実装クラスがあります.デフォルトでは、レイアウトマネージャを設定しない場合は、リニアレイアウトを使用します.このクラスを継承することで、独自のレイアウトマネージャを実装し、itemの内容をどのように配置するかを自分で決めることができますが、上記の3つの実装クラスのコードを見てみると、これがどんなに容易ではないかがわかります.コードが長いですね...本当に!レイアウトマネージャの具体的な使用方法については、リニアレイアウトマネージャの簡単な使用について説明します.コードは次のとおりです.
//
LinearLayoutManager layoutManager = new LinearLayoutManager(context);
//
layoutManager.setOrientation(LinearLayoutManager.VERTICAL);
//
layoutManager.scrollToPosition(currPos);
//
recyclerView.setLayoutManager(layoutManager);
RecyclerView.ItemDecoration
一応itemアクセサリーと呼んで、ItemDecorationを使ってitemにオフセット量を増やしたり、item分割線を増やしたり、ハイライトしたりすることができます.私たちは多くのItemDecorationを追加することができます.RecyclerViewはすべてのItemDecorationを順次巡回し、描画方法を呼び出して装飾を完了します.3つの抽象的な方法があります
public void onDraw(Canvas c, RecyclerView parent) public void onDrawOver(Canvas c, RecyclerView parent) public void getItemOffsets(Rect outRect, int itemPosition, RecyclerView parent)
onDrawで描いたコンテンツはitemのコンテンツによって遮られる可能性がありますが、onDrawOverで描いたコンテンツはitemの上に描かれます.オフセット量を使用してitemを簡単に分割できますが、分割線を表示したい場合はonDrawOverメソッドを使用して分割線を明示的に描画する必要があります.
レイアウトマネージャは、測定フェーズでgetItemOffsetメソッドを呼び出します.RectタイプのパラメータとoutRectパラメータは少し変に見えますが、なぜ戻り値を使わないのでしょうか.グーグルがこのようにした以上、意味があるに違いありません.これにより、すべてのitemが1つのRectオブジェクトを多重化することができるので、リソースを節約できます.これは必ずしも最良ではありませんが、確かに効率的にリソースを節約することができます.
注意すべき点は、onDraw()/onDrawOver()メソッドはitemごとに呼び出されず、すべてのitemの装飾内容を描くために呼び出されるだけです.したがって,この方法ではすべてのitemを巡回して描画しなければならない.
前の記事では、DividerItemDecorationのソースコードを簡単に提供しました.もちろん、ItemDecorationを継承することで、より豊富なコンテンツを実現することができます.
RecyclerView.ItemAnimator
ItemAnimatorクラスは主にアニメーション効果を処理し、以下の3つの場合、このアニメーションがトリガーされます.
幸いなことに、v 7互換パッケージにはDefaultItemAnimatorというデフォルトの実装クラスが用意されています.設定しないと、デフォルトはクラスに適応します.
アニメーションを有効にするには、androidがデータの変更を知らなければならないことは明らかです.以前のアダプタでは、androidデータセットが変更されたことをnotifyDataSetChangedメソッドを呼び出して通知する必要がありました.しかし、この方法は適用されなくなりました.この方法では、すべての可視itemが再描画されますが、アニメーションはトリガーされません.アニメーションをトリガーするには、次のような方法を呼び出さなければなりません.
public final void notifyItemInserted(int position) public final void notifyItemRemoved(int position)
Listeners
Listener、RecyclerViewにはOnItemClickListenerとOnItemLongClickListenerがありませんが、OnItemTouchListenerを使用してジェスチャーを合わせてこれらのイベントを識別することができます.これは、同じ効果を実現するためにより多くのコードを作成する必要があることを意味します.
以上述べたように
レイアウトファイルで使用するコードは次のとおりです.
<android.support.v7.widget.RecyclerView android:id="@+id/recyclerView" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity" tools:listitem="@layout/item_demo_01" />
toolsアトリビュートは現在のレイアウトをレンダリングし、ビジュアル化エディタに切り替えると効果が表示されます.もちろん書かなくてもいいですが、効果は表示されません.
特定のプロパティは使用されていませんが、実際にはRecyclerViewのプロパティは親のViewGroupから来ています.RecyclerViewでは、generateLayoutParamsというAttributeSetを使用していますが、内部ではあまり属性を操作していません.
@Override
public ViewGroup.LayoutParams generateLayoutParams(AttributeSet attrs) {
if (mLayout == null) {
throw new IllegalStateException("RecyclerView has no LayoutManager");
}
return mLayout.generateLayoutParams(getContext(), attrs);
}
Activityで使うのも簡単です
//
recyclerView = (RecyclerView) findViewById(R.id.recyclerView);
// ,
LinearLayoutManager layoutManager = new LinearLayoutManager(this);
layoutManager.setOrientation(LinearLayoutManager.VERTICAL);
layoutManager.scrollToPosition(0);
recyclerView.setLayoutManager(layoutManager);
// item , 。。
recyclerView.setHasFixedSize(true);
//
List<DemoModel> items = new ArratList<DemoModel>();
//......
adapter = new RecyclerViewDemoAdapter(items);
recyclerView.setAdapter(adapter);
// ,
RecyclerView.ItemDecoration itemDecoration =
new DividerItemDecoration(this, DividerItemDecoration.VERTICAL_LIST);
// add set,
recyclerView.addItemDecoration(itemDecoration);
// , ;
// ,
recyclerView.setItemAnimator(new DefaultItemAnimator());
// ,
//recyclerView.addOnItemTouchListener(this);
以下のステップにまとめる
基本的なソースコードは前の文章と同じで、ソースコードは住所をダウンロードしますhttp://download.csdn.net/detail/sbsujjbcy/8489667
この文章は参考にしたhttp://www.grokkingandroid.com/first-glance-androids-recyclerview/