将Int-List绑定到recylcerview(已在绑定的外部回收者视图中)

时间:2019-07-03 11:21:58

标签: android kotlin mvvm android-recyclerview binding

我来自C#世界,正在Kotlin / Android环境中迈出第一步。

我对C#中的MVVM绑定有点满意,并希望以尽可能少的代码在UI中显示数据。

以下缩短的代码已经有效:

MainViewmodel

class MainViewModel: BaseViewModel() {
   var examples = MutableLiveData<List<ExampleData>>(emptyList())

   // some rest methods that loads the data
}

DataClass

data class ExampleData(var name: String, var date: String, var ids:List<Int>) 

片段

class MainFragment : Fragment {
   // viewmodel and binding vals

   override fun onCreateView(
    inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
       binding = DataBindingUtil.inflate<FragmentMainBinding>(inflater, R.layout.fragment_main, container, false)
       binding.setVariable(BR.viewmodel, viewModel)
       binding.lifecycleOwner = viewLifecycleOwner

       viewModel.reloadExampleData()

       return binding.root
   }       

    override fun onActivityCreated(savedInstanceState: Bundle?) {
        super.onActivityCreated(savedInstanceState)

        val exampleDataAdapter = GenericListAdapter<ExampleData>(BR.examples, R.layout.example_item)
        recycler_view_examples.layoutManager = LinearLayoutManager(this.context)
        recycler_view_examples.adapter = exampleDataAdapter 
    }
}

片段布局

<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools">

<data>
    <variable
            name="viewmodel"
            type="com.test.viewmodel.MainViewModel"/>
</data>
   <androidx.constraintlayout.widget.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".view.MainFragment">

    <TextView
            android:id="@+id/textview_header"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent"
            android:text="Examples"/>

    <androidx.recyclerview.widget.RecyclerView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginBottom="50dp"
            android:id="@+id/recycler_view_ziehungen"
            data="@{viewmodel.examples}"
            android:layout_margin="8dp"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/textview_header"
    />

    </androidx.constraintlayout.widget.ConstraintLayout>

</layout>

example_item布局

<?xml version="1.0" encoding="utf-8"?>

<layout xmlns:tools="http://schemas.android.com/tools">
<data>
    <variable
            name="exampleData"
            type="com.text.model.ExampleData">
    </variable>
</data>
<androidx.cardview.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
                                   android:layout_width="match_parent"
                                   android:layout_height="wrap_content"
                                   android:layout_marginEnd="8dp"
                                   android:layout_marginStart="8dp"
                                   android:layout_marginTop="8dp">

    <RelativeLayout android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:padding="8dp">

        <TextView android:layout_width="wrap_content"
                  android:layout_height="wrap_content"
                  android:id="@+id/text_view_name"
                  android:text="@{exampleData.name}"
                  android:maxLines="1"
                  android:layout_alignParentStart="true"
                  />

        <TextView android:layout_width="wrap_content"
                  android:layout_height="wrap_content"
                  android:id="@+id/text_view_date"
                  android:text="@{exampleData.datum}"
                  android:maxLines="1"
                  android:layout_alignParentEnd="true"
                  />

    <!-- here is my problem -->
        <androidx.recyclerview.widget.RecyclerView android:id="@+id/list_view_ids"
                                                   android:layout_width="wrap_content"
                                                   android:layout_height="wrap_content"

                                                   android:layout_alignParentStart="true"
                                                   android:orientation="horizontal"
                                                   android:layout_below="@+id/text_view_tag">

        </androidx.recyclerview.widget.RecyclerView>



    </RelativeLayout>
   </androidx.cardview.widget.CardView>
 </layout>

该代码显示一个列表,其中包含示例列表的所有条目。

现在我的问题

我试图在每个example_item中显示int-List(ExampleData.ids)。 但是我不知道如何将这些内部列表绑定到回收者视图。

1 个答案:

答案 0 :(得分:1)

这是解决此问题的方法。

首先编写一个通用的BindingAdapter将项目列表(条目)和布局绑定到LinearLayout。

@BindingAdapter("entries", "layout")
fun <T> setEntries(viewGroup: ViewGroup, entries: List<T>?, layout: Int) {
    viewGroup.removeAllViews()
    if (entries != null) {
        val inflater: LayoutInflater =
            viewGroup.context.getSystemService(Context.LAYOUT_INFLATER_SERVICE) as     LayoutInflater
        for (i in 0 until entries.size) {
            var entry: T = entries[i]
            var binding: ViewDataBinding = DataBindingUtil.inflate(inflater, layout, viewGroup, true)
            binding.setVariable(BR.data, entry)
        }
    }
}

然后创建一个具有名为data的整数变量的布局(simple_item)

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

        <TextView android:layout_width="wrap_content"
                  android:layout_height="wrap_content"
                    android:text="@{String.valueOf(data)}"/>
</layout>

然后可以将整数列表和布局绑定到LinearLayout。

<LinearLayout app:entries="@{viewmodel.examples}"
                          app:layout="@{@layout/simple_item}"
                          android:layout_width="wrap_content"
                          android:orientation="horizontal">
            </LinearLayout>