Добавление различных элементов в RecyclerView

262
02 июня 2017, 11:42

Я хочу реализовать новостную ленту, в которой могут быть 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";
                }
            }
Answer 1

Тип элемента определяется по позиции, да.

@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)
READ ALSO
Вывод jar файла

Вывод jar файла

Создать jar файл своего графического приложения под Swing удаётсяОднако, есть один нюанс

348
Почему не мапится сервлет?

Почему не мапится сервлет?

У меня сервлет AddUserServlet:

310
что за ORM &ldquo;io.requery&rdquo;?

что за ORM “io.requery”?

ЗдравствуйтеДостался проект, в котором как я полагаю используется ORM:

309
Java ResultSetWrappingSqlRowSet и Clob

Java ResultSetWrappingSqlRowSet и Clob

необходимо из ResultSetWrappingSqlRowSet получить clob значение из oracleПодскажите как это сделать? спасибо

230