I want to implement a news feed in which there can be cardView elements with different markup. All news comes from the server and it is not previously known what position the item will occupy in the collection. Can this be done somehow by String identifier, in which the style of the news is written?
If not, how can I do this in my case?
So far, I’ve got some stuff that can be done like this, but this is by position.
private class RecyclerViewHolderSimple extends RecyclerView.ViewHolder { ... RecyclerViewHolderSimple(View itemView) { super(itemView); ... } void bind(ModelItem modelItem) { ... } } private class RecyclerViewHolderSmall extends RecyclerView.ViewHolder { ... RecyclerViewHolderSmall(View itemView) { super(itemView); ... } void bind(ModelItem modelItem) { ... } } private class RecyclerAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> { private ArrayList<ModelItem> items = new ArrayList<>(); void addAll(List<ModelItem> fakeItems) { int pos = getItemCount(); this.items.addAll(fakeItems); notifyItemRangeInserted(pos, this.items.size()); } @Override public int getItemViewType(int position) { if (position == 0) { return 0; } else { return 1; } } @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { RecyclerView.ViewHolder vh=null; View itemLayoutView; switch (getItemViewType(viewType)) { case 0: itemLayoutView = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_card_news, parent, false); vh = new RecyclerViewHolderSimple(itemLayoutView); break; case 1: itemLayoutView = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_card_small_news, parent, false); vh = new RecyclerViewHolderSmall(itemLayoutView); break; } return vh; } @Override public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { switch (this.getItemViewType(position)) { case 0: RecyclerViewHolderSimple simple = (RecyclerViewHolderSimple) holder; simple.bind(items.get(position)); break; case 1: RecyclerViewHolderSmall small = (RecyclerViewHolderSmall) holder; small.bind(items.get(position)); break; } } @Override public int getItemCount() { return items.size(); } } And accordingly, adding items to the collection:
//В переменную news данные идут с Get запроса через retrofit 2.0 String arrayNews[] = new String[news.size()] //Вот здесь я хотел хранить типы новостей, чтобы потом сравнивать и вставлять нужную разметку, но нет, кек for (int i = news.size() - 1; i >= 0; i--) { if (news.get(i).getType().equals("simple")) { itemsList.add(new ModelItem(news.get(i).getAuthor(), news.get(i).getUrlToImage(), news.get(i).getTitle(), news.get(i).getContent(), i, Integer.valueOf(news.get(i).getLikes()))); arrayNews[news.size()-i]="simple"; } else { itemsList.add(new ModelItem(news.get(i).getTitle())); arrayNews[news.size()-i]="small"; } }