Created
January 30, 2017 11:36
-
-
Save demixdn/e277987c99f80061ef2f8eb959372c45 to your computer and use it in GitHub Desktop.
Clean Recycler Adapter (also see https://github.com/sockeqwe/AdapterDelegates)
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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)); | |
} | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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(); | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
public abstract class ArbitraryCellHolder<T> extends RecyclerView.ViewHolder { | |
public ArbitraryCellHolder(View itemView) { | |
super(itemView); | |
ButterKnife.bind(this, itemView); | |
} | |
public abstract void bind(T item); | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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); | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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