現在、私はRecycleViewのカスタムマルチビュータイプを扱っています。 この問題の解決策はたくさんありましたが、私は自分のやり方を分かち合います。RecycleViewのマルチビュータイプの実装方法は?
異なるのは、ビュータイプを定義するためにenum
です。
詳細は私の答えをご覧ください。 (ちょうど共有したい)
現在、私はRecycleViewのカスタムマルチビュータイプを扱っています。 この問題の解決策はたくさんありましたが、私は自分のやり方を分かち合います。RecycleViewのマルチビュータイプの実装方法は?
異なるのは、ビュータイプを定義するためにenum
です。
詳細は私の答えをご覧ください。 (ちょうど共有したい)
私はこの記事を読んでお勧めします
UPDATE:ここ
Writing Better Adapterは道RecyclewViewのためのIカスタムマルチビュータイプがあります。
最初にコードを示し、次に説明します。
アダプタのデータが&がWrapper
クラスから延びジェネリックです:あなたは、アダプタを参照することができ
@SuppressWarnings("unchecked")
public class BaseAdapter extends RecyclerView.Adapter<BaseAdapter.ViewHolder> {
private final List<Wrapper<?>> items;
public BaseAdapter() {
this.items = new ArrayList<>();
}
@Override
public int getItemViewType(int position) {
return items.get(position).viewType;
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
return ViewType.values()[viewType].onCreateViewHolder(parent);
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
holder.onBind(items.get(position));
}
@Override
public int getItemCount() {
return items.size();
}
public void simulateAddItems() {
items.add(new Wrapper<>(ViewType.USER.viewTYpe(), new User()));
items.add(new Wrapper<>(ViewType.USER.viewTYpe(), new User()));
items.add(new Wrapper<>(ViewType.USER.viewTYpe(), new User()));
items.add(new Wrapper<>(ViewType.BOTTOM.viewTYpe(), new BottomData()));
notifyDataSetChanged();
}
public enum ViewType {
USER {
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent) {
return new UserViewHolder(itemView);
}
},
BOTTOM {
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent) {
return new BottomViewHolder(itemView);
}
};
public abstract ViewHolder onCreateViewHolder(ViewGroup parent);
public int viewTYpe() {
return ordinal();
}
}
static class Wrapper<T> {
final int viewType;
final T data;
public Wrapper(int viewType, T data) {
this.viewType = viewType;
this.data = data;
}
}
public static class ViewHolder<T> extends RecyclerView.ViewHolder {
private T item;
public ViewHolder(View itemView) {
super(itemView);
}
public void onBind(T item) {
}
}
public static class UserViewHolder extends ViewHolder<User> {
public UserViewHolder(View itemView) {
super(itemView);
}
@Override
public void onBind(User item) {
super.onBind(item);
}
}
public static class BottomViewHolder extends ViewHolder<BottomData> {
public BottomViewHolder(View itemView) {
super(itemView);
}
@Override
public void onBind(BottomData item) {
super.onBind(item);
}
}
static class User {
// user fields & method
}
static class BottomData {
// bottom data fields & method
}
}
は、何か特別なものを持っています。単純にPOJOクラスのWrapper
クラスには、2つのフィールドviewType
& item
のデータが含まれています。 viewType
はgetItemViewType(int position)
を通過し、item
は各ビューホルダーのデータです。
ViewHolder
とT
は、ビューホルダーの種類のデータです。 2つのカスタムビューホルダーUserViewHolder
とBottomViewHolder
がViewHolder
からこのデータに拡張されています。 (したがって、それぞれのビューホルダーのonBind
には、使用したい正確なデータがあります - >キャストする必要はありません。
enum ViewType
には、すべてのビュータイプのアダプターが含まれています。また、ビュータイプでは、メソッドViewHolder onCreateViewHolder(ViewGroup parent)
があるので、viewHolderをViewType
から簡単に作成することができます。 ViewTypeを基準にHolderを見るのは、私たちの目にとっては簡単だと思います。
はまた、我々はそれが単に列挙型のordinal()
を返すviewType()
方法があります。 java docs
の参考として、その方法は使用できません。しかし、この場合、(それがユニークなので)使用するには十分だと思います。
だから、この方法でアダプタのonCreateViewHolder
私たちすることができますシンプルなコール: return ViewType.values()[viewType].onCreateViewHolder(parent);
とonBindViewHolder
に我々はholder.onBind(items.get(position));
を呼び出します。
最後に、アダプターにアイテムを追加する方法をデモ用にsimulateAddItems
としました。
ここでは、RecycleViewのカスタム表示タイプを操作中のいくつかの経験があります。役に立つと嬉しいです&他の人を助けてください。
[Recyclerviewと異なる種類の行インフレーションの処理]の可能な複製(https://stackoverflow.com/questions/25914003/recyclerview-and-handling-different-type-ofrow-inflation) –