Skip to content

Instantly share code, notes, and snippets.

@demixdn
Created January 30, 2017 11:36
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save demixdn/e277987c99f80061ef2f8eb959372c45 to your computer and use it in GitHub Desktop.
Save demixdn/e277987c99f80061ef2f8eb959372c45 to your computer and use it in GitHub Desktop.
Clean Recycler Adapter (also see https://github.com/sockeqwe/AdapterDelegates)
public class AdArbitraryCell implements ArbitraryCellSelector.Cell {
@Override
public boolean is(Object item) {
return item instanceof AdVo;
}
@Override
public int type() {
return R.layout.cell_ad;
}
@Override
public RecyclerView.ViewHolder holder(ViewGroup parent) {
LayoutInflater inflater = LayoutInflater.from(parent.getContext());
View view = inflater.inflate(R.layout.cell_ad, parent, false);
return new AdViewHolder(view);
}
@Override
public void bind(RecyclerView.ViewHolder holder, Object item) {
try {
AdViewHolder adViewHolder = (AdViewHolder) holder;
AdVo ad = (AdVo) item;
adViewHolder.bind(ad);
} catch (ClassCastException e) {
L.printStackTrace(e);
}
}
protected class AdViewHolder extends ArbitraryCellHolder<AdVo> {
@BindView(R.id.ad_text_view)
protected TextView adTextView;
public AdViewHolder(View itemView) {
super(itemView);
}
@Override
public void bind(AdVo item) {
adTextView.setText(item.getTitle());
itemView.setOnClickListener(view -> adPublishSubject.onNext(item));
}
}
}
public abstract class ArbitraryCellAdapter
extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
protected ArbitraryCellSelector arbitraryCellSelector = new ArbitraryCellSelector();
protected List itemList = new ArrayList();
@Override
public final int getItemViewType(int position) {
return arbitraryCellSelector.getCell(itemList.get(position)).type();
}
@Override
public final RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
return arbitraryCellSelector.getCell(viewType).holder(parent);
}
@Override
public final void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
Object item = itemList.get(position);
arbitraryCellSelector.getCell(item).bind(holder, item);
}
@Override
public final int getItemCount() {
return itemList.size();
}
}
public abstract class ArbitraryCellHolder<T> extends RecyclerView.ViewHolder {
public ArbitraryCellHolder(View itemView) {
super(itemView);
ButterKnife.bind(this, itemView);
}
public abstract void bind(T item);
}
public final class ArbitraryCellSelector {
private List<Cell> cellList = new ArrayList<>();
public void addCell(Cell cell) {
cellList.add(cell);
}
public void removeCell(Cell cell) {
cellList.remove(cell);
}
public Cell getCell(Object item) {
for (Cell cell : cellList) {
if (cell.is(item)) {
return cell;
}
}
throw new NoSuchRecyclerRowException();
}
public Cell getCell(int viewType) {
for (Cell cell : cellList) {
if (cell.type() == viewType) {
return cell;
}
}
throw new NoSuchRecyclerRowException();
}
public interface Cell {
boolean is(Object item);
int type();
RecyclerView.ViewHolder holder(ViewGroup parent);
void bind(RecyclerView.ViewHolder holder, Object item);
}
}
public class UsersArbitraryCellAdapter extends ArbitraryCellAdapter {
public UsersArbitraryCellAdapter() {
this.arbitraryCellSelector.addCell(new ProgressArbitraryCell());
this.arbitraryCellSelector.addCell(new AdArbitraryCell());
this.arbitraryCellSelector.addCell(new UserArbitraryCell());
}
public void setUsers(List<UserVo> userList) {
// Set users, ads, progress...
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment