public class Test extends RecyclerView.Adapter { @Override public ViewHolder onCreateViewHolder(final ViewGroup parent, final int viewType) { } @Override public void onBindViewHolder(final ViewHolder holder, final int position) { } @Override public int getItemCount() { return 0; } public void setItems(@NonNull final ArrayList items) { } }
public interface ItemModel { } public class Test extends RecyclerView.Adapter { @NonNull private final ArrayList<ItemModel> mItems = new ArrayList<>(); .... @Override public int getItemCount() { return mItems.size(); } public void setItems(@NonNull final ArrayList<ItemModel> items) { mItems.clear(); mItems.addAll(items); } }
public abstract class ViewRenderer <M extends ItemModel, VH extends RecyclerView.ViewHolder> { public abstract void bindView(@NonNull M model, @NonNull VH holder); @NonNull public abstract VH createViewHolder(@Nullable ViewGroup parent); }
public class RendererRecyclerViewAdapter extends RecyclerView.Adapter { ... private ViewRenderer mRenderer; @Override public RecyclerView.ViewHolder onCreateViewHolder(final ViewGroup parent, final int viewType) { return mRenderer.createViewHolder(parent); } @Override public void onBindViewHolder(final RecyclerView.ViewHolder holder, final int position) { mRenderer.bindView(item, holder); } public void registerRenderer(@NonNull final ViewRenderer renderer) { mRenderer = renderer; } ... }
public interface ItemModel { int getType(); } public class RendererRecyclerViewAdapter extends RecyclerView.Adapter { ... @Override public int getItemViewType(final int position) { final ItemModel item = getItem(position); return item.getType(); } private ItemModel getItem(final int position) { return mItems.get(position); } ... }
public class RendererRecyclerViewAdapter extends RecyclerView.Adapter { ... @NonNull private final SparseArray<ViewRenderer> mRenderers = new SparseArray<>(); @Override public RecyclerView.ViewHolder onCreateViewHolder(final ViewGroup parent, final int viewType) { final ViewRenderer renderer = mRenderers.get(viewType); if (renderer != null) { return renderer.createViewHolder(parent); } throw new RuntimeException("Not supported Item View Type: " + viewType); } public void registerRenderer(@NonNull final ViewRenderer renderer) { final int type = renderer.getType(); if (mRenderers.get(type) == null) { mRenderers.put(type, renderer); } else { throw new RuntimeException("ViewRenderer already exist with this type: " + type); } } @SuppressWarnings("unchecked") @Override public void onBindViewHolder(final RecyclerView.ViewHolder holder, final int position) { final ItemModel item = getItem(position); final ViewRenderer renderer = mRenderers.get(item.getType()); if (renderer != null) { renderer.bindView(item, holder); } else { throw new RuntimeException("Not supported View Holder: " + holder); } } ... }
public class SomeModel implements ItemModel { public static final int TYPE = 0; @NonNull private final String mTitle; public SomeModel(@NonNull final String title) { mTitle = title; } @Override public int getType() { return TYPE; } @NonNull public String getTitle() { return mTitle; } ... }
public class SomeViewHolder extends RecyclerView.ViewHolder { public final TextView mTitle; public SomeViewHolder(final View itemView) { super(itemView); mTitle = (TextView) itemView.findViewById(R.id.title); ... } }
public class SomeViewRenderer extends ViewRenderer<SomeModel, SomeViewHolder> { public SomeViewRenderer(final int type, final Context context) { super(type, context); } @Override public void bindView(@NonNull final SomeModel model, @NonNull final SomeViewHolder holder) { ... } @NonNull @Override public SomeViewHolder createViewHolder(@Nullable final ViewGroup parent) { return new SomeViewHolder(LayoutInflater.from(getContext()).inflate(R.layout.some_item, parent, false)); } }
public class SomeActivity extends AppCompatActivity { private RendererRecyclerViewAdapter mRecyclerViewAdapter; private RecyclerView mRecyclerView; @Override protected void onCreate(final Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); mRecyclerViewAdapter = new RendererRecyclerViewAdapter(); mRecyclerViewAdapter.registerRenderer(new SomeViewRenderer(SomeModel.TYPE, this)); // mRecyclerViewAdapter.registerRenderer(...); mRecyclerView = (RecyclerView) findViewById(R.id.recycler_view); mRecyclerView.setLayoutManager(new LinearLayoutManager(this)); mRecyclerView.setAdapter(mRecyclerViewAdapter); mRecyclerViewAdapter.setItems(getItems()); mRecyclerViewAdapter.notifyDataSetChanged(); } ... }
Source: https://habr.com/ru/post/323862/
All Articles