Добавить viewModel в представление программно - PullRequest
0 голосов
/ 16 июня 2019

У меня есть RecycleView с StaggeredGridLayoutManager.Я добавляю представления программно в RecycleViewAdapter.Проблема заключается в том, что компоновка представлений использует привязку данных:

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:app="http://schemas.android.com/apk/res-auto">

  <data>

    <variable
      name="viewModel"
      type="com.myapp.myViewModel" />
  </data>

  <androidx.cardview.widget.CardView
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <LinearLayout
      android:layout_width="match_parent"
      android:layout_height="wrap_content"
      android:orientation="vertical">
....

Как я могу установить viewModel для представлений, когда я добавляю их в recycleView?

Это мой RecycleViewAdapter:

 class RecycleViewAdapter(context: Context, private val layouts: List<Int>) :
        RecyclerView.Adapter<RecycleViewAdapter.ViewHolder>() {
      override fun getItemCount(): Int {
        return layouts.size
      }

      private val mInflater: LayoutInflater = LayoutInflater.from(context)
      private var mClickListener: ItemClickListener? = null

      override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
        val view = mInflater.inflate(R.layout.recycleview_row, parent, false)

        return ViewHolder(view)
      }

      override fun onBindViewHolder(holder: ViewHolder, position: Int) {
        val layout = layouts[position]
        val view = mInflater.inflate(layout, null)
        holder.layout.addView(view)
      }


      inner class ViewHolder internal constructor(itemView: View) : RecyclerView.ViewHolder(itemView),
          View.OnClickListener {
        internal val layout: LinearLayout = itemView.findViewById(R.id.layout)

        init {
          itemView.setOnClickListener(this)
        }

        override fun onClick(view: View) {
          if (mClickListener != null) mClickListener!!.onItemClick(view, adapterPosition)
        }
      }

      internal fun getItem(id: Int): Int {
        return layouts[id]
      }

      internal fun setClickListener(itemClickListener: ItemClickListener) {
        this.mClickListener = itemClickListener
      }

      interface ItemClickListener {
        fun onItemClick(view: View, position: Int)
      }
    }

Мой recycleview_row:

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">

  <data>

    <variable
      name="viewModel"
      type="com.myApp.BaseViewModel" />

  </data>

  <LinearLayout
    android:id="@+id/layout"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal"
    android:padding="10dp">

  </LinearLayout>
</layout>

Я включаю макеты программно в LinearLayout с идентификатором layout, и каждыйviewModel расширяет BaseViewModel.

1 Ответ

0 голосов
/ 16 июня 2019

Так мы устанавливаем ViewModel в динамических представлениях.

  LayoutInflater lInflater = LayoutInflater.from(mContext);
      ItemListBinding itemBinding = ItemListBinding .inflate(lInflater, parent, false);
  itemBinding .setviewModel(viewModel);
  itemBinding.executePendingBindings();

Проверьте этот блог здесь

...