1

Хотел бы немного посоветоваться со знающими людьми. Можно ли используя 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.Если необходимо, то дополню вопрос.

Fabudi
  • 57

1 Answers1

0

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

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

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.

  • пример никак не объясняет, как это должно работать. Это ответ объясняет, как это работает – pavlofff Mar 24 '18 at 01:04
  • @pavloff так получше? – Timur Mukhortov Mar 24 '18 at 09:04
  • Конечно спасибо вам большое, однако я интересовался немного другой темой. Можно ли делать проверку есть ли данные в массиве на определенном месте data[p2], и уже в зависимости от этого делать что-то – Fabudi Mar 24 '18 at 09:10
  • Что вы имеете ввиду под "определенном месте". У вас есть 10 чисел, если одно из них подходит по какому либо условию вы даете ему отличный от остальных тип и делаете с ним что хотите.. Можете брать позицию проверять что позиция равна 3 присвоить отличный от остальных тип и делать с ним что хотите. – Timur Mukhortov Mar 24 '18 at 09:15
  • Я имею ввиду то, что, допустим, в массиве под индексом 12 ничего нет, а при этом приложение вылетает (если пытается создать продолжение RV). Я же хочу делать проверку на наличие данных в данной позиции и уже в зависимости от этого делать какое-либо другое действие. – Fabudi Mar 24 '18 at 10:03