GOOGLE ADS

воскресенье, 1 мая 2022 г.

Преобразование RecyclerView в ViewPager/PagerAdapter

Предыстория — новый для Android, но довольно изящный с перемещением макетов, пониманием Java, Kotlin и XML. Однако эта задача кажется выше моей головы.

Проблема. Я хочу преобразовать следующий файл Java (RecyclerView) в файл Kotlin (ViewPager), поскольку у меня уже есть подключенный ViewPager с таким же поведением прокрутки, как хотелось бы. У меня сложилось впечатление, что это 10-минутная работа для опытного разработчика. Если это так, интересно, могу ли я обратиться за помощью к сообществу? Хотя бы понять, с чего начать. Кажется, я не могу найти руководство о том, как преобразовать RecyclerView в PagerAdapter или ViewPager.

По сути, существующий ViewPager, который я использую, имеет статические данные (5 элементов), а этот может иметь десятки элементов, поэтому он должен быть динамическим с отдельным источником данных (элементы CardItem).

RecyclerViewAdapter — текущий (Java)

package com.APPNAME.fragments.cards;
import android.databinding.DataBindingUtil;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import java.util.ArrayList;
import com.APPNAME.R;
import com.APPNAME.databinding.FragmentCardsRecentlyViewedBinding;
import com.APPNAME.model.cardItem.CardItem;
public class RecentlyViewedAdapter extends RecyclerView.Adapter<RecentlyViewedAdapter.RecentlyViewedViewHolder> {
public OnCardClicked listener;
private ArrayList<CardItem> items = new ArrayList<>();
public void addItems(ArrayList<CardItem> list) {
items = list;
notifyDataSetChanged();
}
@Override
public RecentlyViewedViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
FragmentCardsRecentlyViewedBinding binding = DataBindingUtil.inflate(LayoutInflater.from(parent.getContext()), R.layout.fragment_cards_recently_viewed, parent, false);
return new RecentlyViewedViewHolder(binding);
}
@Override
public void onBindViewHolder(RecentlyViewedViewHolder holder, int position) {
holder.binding.setViewModel(new RecentlyViewedViewModel(items.get(position)));
}
@Override
public int getItemCount() {
return items.size();
}
interface OnCardClicked {
void onCardClicked(View view, CardItem cardItem);
}
class RecentlyViewedViewHolder extends RecyclerView.ViewHolder {
FragmentCardsRecentlyViewedBinding binding;
public RecentlyViewedViewHolder(FragmentCardsRecentlyViewedBinding itemView) {
super(itemView.getRoot());
binding = itemView;
binding.cardView.setOnClickListener(v -> {
if (listener!= null) {
listener.onCardClicked(v, items.get(getAdapterPosition()));
}
});
}
}
}

ViewPagerAdapter — Будущее (Котлин)

package com.APPNAME.fragments.cards
import android.support.annotation.DrawableRes
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import java.util.*
import kotlinx.android.synthetic.main.fragment_cards_recently_viewed.view.*
import com.APPNAME.R
import com.APPNAME.activities.BaseActivity
import com.APPNAME.activities.cards.NewCardActivity
import com.APPNAME.model.cardItem.CardItem
import com.APPNAME.views.wrapContentViewPager.ObjectAtPositionPagerAdapter
class RecentlyViewedItemAdapter constructor(private val activity: BaseActivity): ObjectAtPositionPagerAdapter() {
private var items = ArrayList<CardItem>()
override fun instantiateItemObject(container: ViewGroup, position: Int): Any {
return getImageView(container, R.drawable.placeholder_card_image) { NewCardActivity.start(activity, it) }
}
private fun getImageView(container: ViewGroup, @DrawableRes imageResourceId: Int, onClick: (imageResourceId: Int) -> Unit = {}): View {
val layoutInflater = LayoutInflater.from(container.context)
val layout = layoutInflater.inflate(R.layout.fragment_cards_recently_viewed, container, false)
val image = layout.recentlyViewedImage
image.setImageResource(imageResourceId)
image.setOnClickListener { onClick(imageResourceId) }
container.addView(layout)
return layout
}
override fun isViewFromObject(view: View, anObject: Any) = (view == anObject)
override fun getCount() = 5 //Placeholder
override fun destroyItemObject(container: ViewGroup, position: Int, view: Any) {
container.removeView(view as View)
}
}


Решение проблемы

Если у вас относительно большое количество элементов и вам нужно повторно использовать представления, то RecyclerView — правильный вариант для вас. Это будет определенно проще, чем создание пользовательского адаптера пейджера представления с фиксированным количеством элементов и шаблоном держателя представления. Стандартный/общий PageAdapter ничего не перерабатывает — он добавлен, чтобы убедиться, что все ваши представления инициированы и готовы к пролистыванию. Однако вы можете использовать https://developer.android.com/reference/android/support/v4/app/FragmentStatePagerAdapter.html, который будет уничтожать/воссоздавать фрагменты, когда они больше не используются или не используются повторно.

Комментариев нет:

Отправить комментарий

Laravel Datatable addColumn returns ID of one record only

Я пытаюсь использовать Yajra Datatable для интеграции DataTable на свой веб-сайт. Я смог отобразить таблицу, но столкнулся с проблемой. В по...