#android #kotlin #android-recyclerview #android-databinding #android-mvvm
#Android #kotlin #android-recyclerview #android-привязка к данным #android-mvvm
Вопрос:
Я реализовал RecyclerView в своем приложении с помощью Kotlin, используя Refrofit, MVVM, привязку данных, сопрограммы. Проблема в том, что у меня есть несколько вложенных массивов, которые я хочу проанализировать с помощью ViewModel. Вот структура api:
Я хочу проанализировать массивы внутренних служб внутри массива categoryService. Расположение элементов xml выглядит следующим образом:
<data>
<variable
name="services"
type="com.techease.fitness.models.categoryServices.Service" />
</data>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_margin="@dimen/tenDP"
android:layout_height="wrap_content">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/round_card_view"
android:orientation="vertical"
android:padding="@dimen/tenDP"
app:layout_constraintTop_toTopOf="parent">
<ImageView
android:id="@ id/ivService"
android:layout_width="150dp"
android:layout_height="150dp"
android:scaleType="fitXY"
android:padding="@dimen/tenDP"
android:src="@drawable/test_image_24"
bind:avatar="@{services.attachment}" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="bottom"
android:hint="@string/user_name"
android:text="@{services.title}"
android:textStyle="bold" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="bottom"
android:hint="@string/user_name"
android:text="@{services.duration}" />
</LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
Вот моя существующая ViewModel, которая возвращает только последний элемент из categoryService [last] и отображает элементы служб.
private lateinit var job: Job
private val catServices = MutableLiveData<List<Service>>()
val discoverServices: MutableLiveData<List<Service>>
get() = catServices
fun discoverServices(context: Context) {
job = CoroutinesIO.ioThenMain(
{
repository.discoverServices(context)
}, {
for (i in 0 until it!!.data.categoryServices.size) {
for (services in 0 until it.data.categoryServices.get(i).services.size) {
catServices.value = it.data.categoryServices.get(i).services
}
}
}
)
}
у меня есть вложенные циклы for в ViewModel, которые правильно анализируют целевой массив, но отображают только массив службы последнего элемента. Вот реализация RecyclerView:
val apiRepository = ApiRepository()
factory = DiscoverViewModelFactory(apiRepository)
viewModel = ViewModelProvider(this, factory).get(DiscoverServiceViewModel::class.java)
binding.viewModel = viewModel
viewModel.discoverServices(this)
viewModel.discoverServices.observe(this, Observer { services ->
rvFeatured.also {
it.layoutManager = LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false)
it.setHasFixedSize(true)
if (services != null) {
it.adapter = DiscoverServicesAdapter(services, this)
}
}
})
И вот адаптер, который полностью привязан:
private val services: List<Service>,
private val listenerHomeServices: DiscoverServicesClickListener
) : RecyclerView.Adapter<DiscoverServicesAdapter.ServicesViewHolder>() {
override fun getItemCount() = services.size
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) =
ServicesViewHolder(
DataBindingUtil.inflate(
LayoutInflater.from(parent.context),
R.layout.custom_discover_layout,
parent,
false
)
)
override fun onBindViewHolder(holder: ServicesViewHolder, position: Int) {
holder.recyclerViewServicesBinding.services = services[position]
}
class ServicesViewHolder(
val recyclerViewServicesBinding: CustomDiscoverLayoutBinding
) : RecyclerView.ViewHolder(recyclerViewServicesBinding.root)}
Снова я хочу проанализировать вложенный массив сервисов, но в настоящее время RecyclerView отображает только последние элементы массива сервисов categoryService1. Надеюсь, это имеет смысл.
Комментарии:
1. ваш код, похоже, в порядке, проверьте, чтобы выйти из списка служб в адаптере recycler, чтобы проверить, передан ли правильный список или передается только последний элемент
2. в serviceCategory [1] у меня есть 5 сервисных элементов, которые отображаются в RecyclerView ….. Пропуская serviceCategory[0]
3. это означает, что у вас есть какая-то ошибка в логике цикла метода обнаружения
4. не в цикле, поскольку я отлаживал его шаг за шагом, в adapterNotify может быть какая-то ошибка