【问题标题】:Binding an Int-List to a view (which is already in a bound outer recycler view)将 Int-List 绑定到视图(已在绑定的外部回收器视图中)
【发布时间】:2019-07-03 11:21:58
【问题描述】:

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

我有点被 C# 中的 MVVM 绑定宠坏了,想用尽可能少的代码在 UI 中显示数据。

这里是已经有效的缩短代码:

主视图模型

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

   // some rest methods that loads the data
}

数据类

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)。 但我不知道如何将这些内部列表绑定到回收站视图。

【问题讨论】:

    标签: android kotlin mvvm android-recyclerview binding


    【解决方案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)
            }
        }
    }
    

    然后创建一个布局(simple_item),其中包含一个名为 data 的整数变量

    <?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>
    

    【讨论】:

      猜你喜欢
      • 2013-11-26
      • 2016-06-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-21
      相关资源
      最近更新 更多