Свой фрагмент в RecyclerView
Всем привет! В моем фрагменте находится RecyclerView в котором находиться лента новостей. Как мне сунуть в RecyclerView свой баннер со скидкой к примеру на каждое третье место? Есть какой-то простой способ? Спасибо!
Ответы (1 шт):
Вы можете создавать RecyclerAdapter с множественными ViewHolder-ами.
Для начала вам нужно определить для каждого
ViewHolder-асоздать отдельнуюXMLразметку.После чего внутри адаптера вы можете переопределить метод
getItemViewType(). Этот метод служит для определения того какойViewHolderнужно подставить для конкретного айтема. Вот пример:@Override public int getItemViewType(int position) { if (items.get(position) instanceOf Banner) { return TYPE_BANNER; } else { return TYPE_NORMAL; } }Где TYPE это просто переменная типа:
private static int TYPE_BANNER = 1; private static int TYPE_NORMAL = 2;Далее вы создаете для каждого айтема свой
ViewHolder, внутри которого вы прописываете логику биндинга вашей разметки.class BannerViewHolder extends RecyclerView.ViewHolder { // Здесь вы как обычно прописываете то как будут биндится ваши View } class NormallViewHolder extends RecyclerView.ViewHolder { // Здесь вы как обычно прописываете то как будут биндится ваши View }Далее внутри метода
onCreateViewHolder()вы определяете какой макет раздуть:@NonNull @Override public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int viewType) { View view; if (viewType == TYPE_BANNER) { // for banner layout view = LayoutInflater.from(context).inflate(R.layout.item_banner, viewGroup, false); return new BannerViewHolder(view); } else { // for normal layout view = LayoutInflater.from(context).inflate(R.layout.item_normal, viewGroup, false); return new NormalViewHolder(view); }}
И аналогично в методе
onBindViewHolder():@Override public void onBindViewHolder(@NonNull RecyclerView.ViewHolder viewHolder, int position) { if (getItemViewType(position) == TYPE_BANNER) { ((BannerViewHolder) viewHolder).bind(items.get(position)); } else { ((NormalViewHolder) viewHolder).bind(items.get(position)); } }Ну и последнее, что вам нужно сделать это подготовить список ваших данных. Для этого можно создать интерфейс - маркер и каждой моделькой (для рекламы и обычную) его имплементировать. Вот пример:
interface ListItem {} class Banner implements ListItem { String bannerUrl; // геттеры/сеттеры и другие методы } class Normal implements ListItem { String title; int count; // геттеры/сеттеры и другие методы }Создаете
List<ListItem>и в него в нужном порядке кладете ваши элементы (тут как раз и можете задать на каждый 3ий рекламу. И этот список передаете в ваш адаптер.
Как написал @Alex_Skvortsov вы можете использовать и делегаты. Этот подход лучше в перспективе, но и требует больше подготовки