プログラムのRecyclerView最大限に活用
RecyclerViewはすでによく知られている、と私たちは使用しません。しかし、プロセスの使用では、RecyclerViewは、いくつかの開発者が使用したくありません
ViewHolder
どのようにあなたのViewHolderを使うのか?
//定义
class ViewHolder {
TextView title;
TextView body;
ImageView icon;
}
//adapter中使用
public void onBindViewHolder(ViewHolder vh, int pos)
{
Item item = items.get(pos);
title.setText(item.getTitle());
body.setText(item.getBody());
imageLoader.loadImage(icon, item.IconUrl());
}
私は、私は、コードを参照してください、とにかく、あなたはそう書かれていないかわからない、99%がラインから外れそうですと。
このようなアプローチでは、我々は、アイテムのデータを取得、ViewHolderに取得する必要がありますし、それらをバインドします。しかし、両方とも実際には何の関係もありません。
シェーンは、書き込みの最善の方法ですか?これは、私が言ったことはないですYigitはそう言って、私に依存しないでください。
//定义
class ViewHolder {
...
public bindTo(Item item, ImageLoader imageLoader) {
title.setText(item.getTitle());
body.setText(item.getBody());
imageLoader.loadImage(icon, item.IconUrl());
}
}
//adatper中调用
public void onBindViewHolder(ViewHolder vh, int position) {
vh.bindTo(items.get(position), mImageLoader);
}
そのようなアプローチでは、我々はViewHolderビューで定義され、及び結合方法を生成bindTo()これら2つのパラメータとしては、この方法により、我々は、我々はこのViewHolderを表示することを知っているとクラスImageLoaderアイテムの必要性を、 ViewHolderとどのように関連付けるデータにはViewHolderを処理します。
そして、あなたのViewHolderもちょうどプレゼンターとして、他のアプリケーションどこで使用されそう。あなたの内部ViewHolderは非常に良いパッケージを持っていました。
ビュータイプ
我々は複数のエントリを表示する場合、一般的に我々はViewTypesに使用されます。しかし、どのようにより良いコードにそれを書くことができますか?
それをどのように行うのですか?
@Override
public int getItemViewType(int position) {
User user = mItems.get(position);
if (user.isPremium()) {
return TYPE_PREMIUM;
}
return TYPE_BASIC;
}
種類に応じて、その後、別のレイアウト、世代ViewHolderを描きます。
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view;
switch (viewType) {
case TYPE_PREMIUM:
view = mLayoutInflater.inflate(R.layout.premium, parent,false);
break;
case TYPE_BASIC:
view = mLayoutInflater.inflate(R.layout.basic, parent,false);
break;
}
return new UserViewHolder(view);
}
2種類のみならば、それはOKですが、それには多くの種類がありますか?私たちは、onCreateViewHolderタイプとgetItemViewTypeにおける行動の種類良い対応を必要とします。一つは、カオラック上で、慎重ではありません。
実際には、我々は少しツルツルを再生することができます。
@Override
public int getItemViewType(int position) {
User user = mItems.get(position);
if (user.isPremium()) {
return R.layout.premium;
}
return R.layout.basic;
}
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view;
view = mLayoutInflater.inflate(viewType, parent,false);
return new UserViewHolder(view);
}
私たちは、私たちが知っている、IDレイアウトファイルリターンIDであるシステムで生成されたレイアウトファイルをすることができ、かつユニークです。あなたがそれを行うならば、我々はonCreateViewHolderに、我々は、プロセスの複雑なロジックを繰り返す必要がないことを参照してください。
OnClickListener
我々は、一般的にクリックコールバック・イベント処理によって自分自身を定義する我々はすべて知っている、でRecyclerView、削除setOnItemClicker方法として。
public void onBindViewHolder(ViewHolder vh,final int position) {
vh.likeButton.setOnClickListener = new OnClickListener() {
items[position].liked = true;
notifyItemChanged(position);
}
}
このコードセグメントは、私たちは、多くの場合、コードを書いていると推定されていますが、実際には問題があります。
1.私たちはそれぞれviewholderデータバインディングを呼び出すと、私たちはOnClickListenerを再構築しています()。
ListViewコントロール2.ので、我々はpostionを使用は問題ありませんが、Recyclerviewで、postionは最終型ではない、それは可能性が高い疾患です。
GoogleはViewHolderが発生したときに、より我々はクリックイベントをバインドお勧めします。コードは以下の通りであります:
public onCreateViewHolder(...) {
final ViewHolder vh = ....;
myViewHolder.itemView.setOnClickListener({
int pos = vh.getAdapterPosition();
if (pos != NO_POSITION) {
items[position].liked = true;
notifyItemChanged(position);
}
});
}
}
これは、getAdapterPosition()このメソッドは、Googleがほとんどを実装した方法で位置ViewHolderアダプタで取得することです。
ので、この方法も、ポイントのノートに、NO_POSITIONがある(-1)の判断は、RecyclerViewが非同期である私たちは、すべてのアイテムを入れる場合、我々は再びときエントリをクリックすると、その後、削除、およびRecyclerviewが再描画されていません取得postionになります-1。
最初のレコード非常に多くのバー。Recyclerviewのいくつかの正式勧告の文言とレコードの後にゆっくりと導入について。