使用RecyclerView进行数据绑定,其中每个项目都是CheckBox

时间:2017-05-02 13:37:13

标签: android android-recyclerview android-databinding

我有RecyclerView,每个项目代表CheckBox和EditText 当点击CheckBox时,EditText的文本应该通过, 我有observableBoolean,它是article.complete 我在@BindingAdapter("itemComplete") public static void bindItemComplete(EditText itemInput, boolean complete){ itemInput.setPaintFlags(complete ? (itemInput.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG) : 0); }

中使用过它

除非我滚动RecyclerView,然后点击CheckBox,否则其他项目的文本将通过

点击
public class Article{
    public final ObservableBoolean complete = new ObservableBoolean();
}

Article.java

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

    <import type="android.view.View" />

    <variable
        name="viewModel"
        type="se.ica.handla.articles.ArticleListViewModel" />

    <variable
        name="article"
        type="se.ica.handla.models.articles.Article" />

</data>

<android.support.constraint.ConstraintLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical">
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:orientation="vertical">

<EditText
android:id="@+id/editText"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginBottom="8dp"
app:itemComplete="@{article.complete}"
/>
<CheckBox
android:id="@+id/checkBox"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:checked="@={article.complete}" />
</android.support.constraint.ConstraintLayout>
</layout>

xml文件:

{{1}}

1 个答案:

答案 0 :(得分:0)

正如我的评论所述,我建议您使用双向数据绑定

您可以完全删除此BindingAdapter

 @BindingAdapter(value = {"checkBoxChangeListener", "article"}, requireAll = false)
 public static void bindCheckBox(CheckBox view, final ObservableBoolean checked, Article article) {     
      if (view.getTag(R.id.binded) == null) {     
          //Here you are setting the attributes to your *view* and 
          //decouple it from your article. It does not reference it, 
          //the properties (isChecked) isnow on the view.               
          //So when your view gets recycled when you scroll, 
          //it still has the property you set the last time - 
          //and not from your current article, which is displayed now in the view. 

          view.setTag(R.id.binded, true);
          view.setOnCheckedChangeListener((buttonView, isChecked) -> checked.set(isChecked));}
      }
 }

正如您已经发现的那样,您的xml现在看起来应该是这样的,使用双向数据绑定:

<EditText
android:id="@+id/editText"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginBottom="8dp"
app:itemComplete="@{article.complete}"
/>

<CheckBox
android:id="@+id/checkBox"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:checked="@={article.complete}" //@={} for Two-Way Databinding
/>