Мой совет - использовать разные типы представлений. Вот статья об этом
Прежде всего, вам нужно придумать абстракцию источника данных для вашего адаптера.Обычно у нас есть простой массив или список в качестве источника данных, но в вашем случае у вас есть не один, а три типа.Таким образом, вы можете создать интерфейс или использовать коллекцию для хранения всех ваших данных в адаптере, так, как вы хотите, чтобы это было на ваше усмотрение.После этого вам нужно создать разные константы для каждого типа ваших моделей.В вашем примере у вас есть три модели: пользователь, продукт и заказ.Поэтому я бы рекомендовал создать три константы для каждого из этих типов.Эти константы должны быть помещены в ваш класс адаптера как статические поля.
private static final int USER_VIEW_TYPE = 1;
private static final int PRODUCT_VIEW_TYPE = 2;
private static final int ORDER_VIEW_TYPE = 3;
Затем вы должны переопределить метод getItemViewType(int position)
в вашем адаптере.Там вы должны указать адаптеру, какой тип имеет конкретный элемент.Например, вы решили сохранить все свои данные как List<Object>
(но не делайте этого в производственном коде, я использую тип Object
здесь только для примера.).Таким образом, в этом случае ваш метод будет выглядеть следующим образом:
@Override public int getItemViewType(int position) {
if (data[position] instanceof User) {
return USER_VIEW_TYPE;
} else if (data[position] instanceof PRODUCT_VIEW_TYPE) {
return PRODUCT_VIEW_TYPE;
} else return ORDER_VIEW_TYPE;
}
После этого вам нужно создать различные ViewHolders для ваших типов, чтобы у вас были UserViewHolder
, ProductViewHolder
и OrderViewHolder
,И, чтобы наконец их дифференцировать, вы должны использовать параметр viewType
в методе onCreateViewHolder
.Логика довольно проста: вы должны проверить значение этого параметра и раздувать различные макеты в зависимости от результата.Например:
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
LayoutInflater layoutInflater = LayoutInflater.from(parent.getContext());
if (viewType == USER_VIEW_TYPE) {
return new UserViewHolder(layoutInflater.inflate(R.layout.item_user_type, parent));
} else if (viewType == PRODUCT_VIEW_TYPE) {
return new ProductViewHolder(layoutInflater.inflate(R.layout.item_product_type, parent));
} else return new OrderViewHolder(layoutInflater.inflate(R.layout.item_order_type, parent));
}