【问题标题】:Two-Way Databinding not updating UI双向数据绑定不更新 UI
【发布时间】:2018-03-14 17:13:59
【问题描述】:

我试图了解为什么设置值不会自动刷新 UI。如果我调用 binding.setItem,UI 会刷新。

我知道绑定对象包含更新的值,但是在设置 item.name 和 item.checked 后 UI 没有被刷新。

我做错了什么?我是否需要每次都调用 setItem 来刷新 UI?我认为这是不必要的,因为 UI 会在设置值后自动更新。

Item.java:

public class Item  {
    public String name;
    public Boolean checked;
}

MainActivity.java:

public class MainActivity extends AppCompatActivity {

    public Item item;
    ActivityMainBinding binding;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        item = new Item();
        item.checked = true;
        item.name = "a";

        binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
        binding.setItem(item);
    }

    public void button_onClick(View v) {
        item.checked = !item.checked;
        item.name = item.name  + "a";
        ///binding.setItem(item); --> ??? this updates UI, do I need to call this to refresh UI everytime???
    }
}

activity_main.xml:

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

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

        <TextView
            android:id="@+id/tv_title"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@={item.name}"
            android:textSize="20sp" />


        <Switch
            android:id="@+id/switch_test"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:checked="@={item.checked}" />

        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="change"
            android:onClick="button_onClick"/>

    </LinearLayout>
</layout>

build.gradle:

android {
...
    dataBinding{
        enabled=true
    }

}

【问题讨论】:

    标签: android android-databinding


    【解决方案1】:

    根据开发者指南:

    任何普通的旧 Java 对象 (POJO) 都可以用于数据绑定,但修改 POJO 不会导致 UI 更新。

    您可以按照开发人员指南的“可观察对象”部分来允许修改您的对象以更新您的 UI。

    https://developer.android.com/topic/libraries/data-binding/index.html#data_objects

    【讨论】:

      【解决方案2】:

      如前所述,使用 ObservableFields

      public ObservableField<Boolean> checked = new ObservableField<>();
      
      public ObservableField<String> name = new ObservableField<>();
      

      并在 MainActivity 中进行更改

          item = new Item();
          item.checked.set(true);
          item.name.set("a");
      
          binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
          binding.setItem(item);
      }
      
      public void button_onClick(View v) {
      
          item.checked.set(!(item.checked.get()));
          item.name.set(item.name.get()  + "a");
      
      }
      

      顺便说一句,您可以查看有关数据绑定https://medium.com/google-developers/android-data-binding-2-way-your-way-ccac20f6313 和此https://medium.com/@fabioCollini/android-data-binding-f9f9d3afc761 的博客文章系列

      【讨论】:

        【解决方案3】:

        为了更新 UI,字段需要是可观察的。只是我的更改的更新:

        import android.databinding.BaseObservable;
        import android.databinding.Bindable;
        
        public class Item extends BaseObservable {
            private String name;
            private Boolean checked;
            @Bindable
            public String getName() {
                return this.name;
            }
            @Bindable
            public Boolean getChecked() {
                return this.checked;
            }
            public void setName(String name) {
                this.name = name;
                notifyPropertyChanged(BR.name);
            }
            public void setChecked(Boolean checked) {
                this.checked = checked;
                notifyPropertyChanged(BR.checked);
            }
        }
        

        【讨论】:

          猜你喜欢
          • 2016-03-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-12-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多