Я хочу реализовать новостную ленту, в которой могут быть cardView элементы с различной разметкой. Все новости идут с сервера и предварительно не известно, какую позицию в коллекции будет занимать элемент. Можно ли это как-то сделать по String идентификатору, в котором пишется стиль новости?
Если нет, то как вообще это сделать в моем случае?
Вот пока что нагулил, что можно сделать так, но это по позиции.
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();
}
}
И вот соответственно добавление элементов в коллекцию:
//В переменную 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";
}
}
Тип элемента определяется по позиции, да.
@Override
public int getItemViewType(int position)
{
ModelItem item = itemsList.get(position);
switch (item.getType()){
case "simple": return 0;
default: return 1;
}
}
ЗЫ. У вас опечатка в onCreateViewHolder
:
switch (getItemViewType(viewType))
надо
switch (viewType)
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Какие существуют виды рекламных бордов и как выбрать подходящий?
Создать jar файл своего графического приложения под Swing удаётсяОднако, есть один нюанс
необходимо из ResultSetWrappingSqlRowSet получить clob значение из oracleПодскажите как это сделать? спасибо