RecyclerView отображает последние элементы вложенного массива из родительского массива, Kotlin

#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 может быть какая-то ошибка