Вариативность действий в RecyclerView

178
25 марта 2018, 21:07

Хотел бы немного посоветоваться со знающими людьми. Можно ли используя Adapter делать проверку на то, есть ли данные в массиве. И в зависимости от этого уже делать другое действие или создавать другой ViewHolder(что мне более нужно сейчас).

@Override
public void onBindViewHolder(Adapter.VH p1, int p2)
{
    if(data[p2]!=null){
    String Text = data[p2];
    p1.Txt.setText(Text);
    }else{
        MA.Empty();//MainActivity
    }
}

Данный способ не работает, как его можно изменить чтобы работал?

P.S.Если необходимо, то дополню вопрос.

Answer 1

Здравствуйте!

Создайте свои константы, которые будут соответствовать разным типам.

private final static String VIEW_TYPE_TEXT = "text";
private final static String VIEW_TYPE_IMAGE = "image"; 

После чего в вашем Adapter(е) переопределите метод getItemViewType(int position) - этот метод будет брать элемент из вашего списка по позиции, проверять к какому типу он относится и возвращаться int значение.

@Override
        public int getItemViewType(int position) {
            switch (dataTypes.get(position)){
                case VIEW_TYPE_TEXT:
                    return 0;
                case VIEW_TYPE_IMAGE:
                    return 1;
            }
        }

Дальше все просто. В методе onCreateViewHolderесть параметр viewTypeсмотрите чему он равен и создаете ваш ViewHolder. Здесь на самом деле лучше использовать константы для типов item.

@NonNull
        @Override
        public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
            View v;
            switch (viewType){
                case 0:
                {
                    view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_data_text, parent, false);
                    return new DataViewHolder(view);
                }
                case 1:
                {
                    view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_data_image, parent, false);
                    return new DataViewHolder(view);
                }
            }
            return null;
        }

В методе onBindViewHolder вам нужно будет привести ваш ViewHolder к нужному типу и передать нужные вам данные из вашей коллекции.

Код целиком:

public class TestAdapter extends RecyclerView.Adapter
{
    private final static String VIEW_TYPE_TEXT = "text";
    private final static String VIEW_TYPE_IMAGE = "image";
    private List<String> dataTypes;
    public TestAdapter(List<String> dataTypes){
        this.dataTypes = dataTypes;
    }
    @NonNull
    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View v;
        switch (viewType){
            case 0:
            {
                view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_data_text, parent, false);
                return new DataViewHolder(view);
            }
            case 1:
            {
                view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_data_image, parent, false);
                return new DataViewHolder(view);
            }
        }
        return null;
    }
    @Override
    public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
        switch (holder.getItemViewType()){
            case 0:{
                String data = dataTypes.get(position);
                TextViewHolder textViewHolder = (TextViewHolder) holder;
                textViewHolder.bind(data);
            }
            case 1:{
                String data = dataTypes.get(position);
                ImageViewHolder imageViewHolder = (ImageViewHolder) holder;
                imageViewHolder.bind(data);
            }
        }
    }
    @Override
    public int getItemCount() {
        return dataTypes.size();
    }
    @Override
    public int getItemViewType(int position) {
        switch (dataTypes.get(position)){
            case VIEW_TYPE_TEXT:
                return 0;
            case VIEW_TYPE_IMAGE:
                return 1;
        }
    }
}

Надеюсь вам это поможет, если будут вопросы - спрашивайте.

p.s. обновлен в соотвествии с замечанием @pavloff.

READ ALSO
Interstitial реклама

Interstitial реклама

Добрый день, прошу помочь с кодом, решил добавить впервые межстраничный баннер в приложение, но не знаю как сделать заполнение его например...

159
Как забирать из содержимого (из ответа сервера) другой заголовок?

Как забирать из содержимого (из ответа сервера) другой заголовок?

Пытаюсь парсить адреса картинок с помощью кода:

189
Объекты и ссылки

Объекты и ссылки

Здравствуйте, можете подсказать что происходит со ссылками и объектами в этой программе(задача из Head First Java)?

177
Configuration и xml

Configuration и xml

Помогите, не могу разобратьсяЯ начал изучать Spring (IoC Concept), разобрал как можно конфигурировать бины через xml и отдельно через аннотации, но не пойму...

203