• android 数据绑定(5) kotlin 的binding bug


    1.BR找不到,无法自动更新

    1.1 描述

      https://stackoverflow.com/questions/57983508/android-studio-kotlin-databinding-unresolved-reference-on-br

    • I have some code that is generating a "red squiggly" error in Android Studio:

      1 @get:Bindable
      2 var title: String = ""
      3     set(value) {
      4         field = value
      5         notifyPropertyChanged(BR.title)
      6     }

      It complains that "title" is an unresolved reference on BR.title. Building and running works fine though, and this is the only error I can see. I debug there and see that it's gotten the value for BR.title correctly.

      Still, I can't figure out how to make it go away. I verified that the generated BR class has the "title" field, but Android Studio refuses to recognize this. I've looked up people having this issue and have tried the following: (unsuccessfully)

      • Closing Android Studio, deleting the .gradle, .idea and build folders and restarting
      • Build -> Clean Project, Rebuild Project
      • File -> Invalidate Caches and restart
      • Disabling and enabling the Kotlin plugin
      • Closing and reopening the project

      I have also checked and I have apply plugin: 'kotlin-kapt' in build.gradle.

    1.2 解决方法

     1 apply plugin: 'com.android.application'
     2 
     3 apply plugin: 'kotlin-android'
     4 apply plugin: 'kotlin-kapt'
     5 apply plugin: 'kotlin-android-extensions'
     6 
     7 android {
     8 
     9     dataBinding {
    10         enabled = true
    11     }
    12 
    13 }
    14 
    15 dependencies {
    16 
    17     ...18 
    19     kapt 'com.android.databinding:compiler:3.2.0-alpha10'
    20 }
    • apply plugin: 'kotlin-kapt'
    • kapt 'com.android.databinding:compiler:3.2.0-alpha10'

    2. 闪烁bug

    item使用数据绑定时,当复用ViewHolder时,会有闪烁问题,或者排序问题,

    复现方法:

    1. 关闭RecyclerView item的动画,
    2. 多准备条数据,超过1屏,上下滚动,长按item进入编辑状态,选中item,就会出现。

    3.不自动更新

    3.1 问题描述

      kotlin与Java 混合时, kotlin修改java里的data ,不自动更新

    • 定义类
       1 public class Data extends BaseObservable {
       2 
       3     public int      icon    ;
       4     public String   key     ;
       5     public int      value   ;
       6     public String   test     = "";
       7 
       8     @Bindable public String getKey() { return key;}
       9     @Bindable public int getValue() { return value; }
      10     @Bindable public int getIcon() {
      11         return icon;
      12     }
      13     @Bindable public String getTest(){
      14         return test;
      15     }
      16 
      17     public void setKey(String key) {
      18         this.key = key;
      19         notifyPropertyChanged(BR.key);
      20     }
      21 
      22     public void setValue(int value) {
      23         this.value = value;
      24         notifyPropertyChanged(BR.value);
      25     }
      26     public void setIcon(int icon) {
      27         this.icon = icon;
      28         notifyPropertyChanged(BR.icon);
      29     }
      30     public void setTest(String ss){
      31         this.test = ss;
      32         notifyPropertyChanged(BR.test);
      33     }
      34 
      35     @Override
      36     public String toString() {
      37         return "key = " + key + " value = " + value;
      38     }
      39 }
    • 布局中
       1         <TextView
       2             android:id="@+id/data_key"
       3             android:layout_width="wrap_content"
       4             android:layout_height="wrap_content"
       5             android:layout_marginStart="32dp"
       6             android:layout_marginLeft="32dp"
       7             android:layout_marginTop="32dp"
       8             android:text='@{data.key}'
       9             app:layout_constraintStart_toStartOf="@+id/data_title"
      10             app:layout_constraintTop_toBottomOf="@+id/data_title" />
      11 
      12         <TextView
      13             android:id="@+id/data_value"
      14             android:layout_width="wrap_content"
      15             android:layout_height="wrap_content"
      16             android:layout_marginStart="16dp"
      17             android:layout_marginLeft="16dp"
      18             android:text='@{String.valueOf(data.value)}'
      19             app:layout_constraintStart_toEndOf="@+id/data_key"
      20             app:layout_constraintTop_toTopOf="@+id/data_key" />
    • 修改data值
      1     fun onDataThreadMainClicked(view: View){
      2         val random = (Math.random() * 1000).toInt()
      3         data.key = "新Main key$random"
      4         data.value = random
      5         binding.data = data
      6     }

      结果:界面不刷新 

    3.2 解决办法

    1      fun onDataThreadMainClicked(view: View){
    2         val random = (Math.random() * 1000).toInt()
    3         data.key = "新Main key$random"
    4         data.value = random
    5         binding.data = data
    6     }

    或者

    1     fun onDataThreadMainClicked(view: View){
    2         val random = (Math.random() * 1000).toInt()
    3         data.key = "新Main key$random"
    4         data.value = random
    5         binding.invalidateAll()
    6     }

    3.3 伴生对象的成员也不自动更新

    也要手动   binding.invalidateAll()

  • 相关阅读:
    hdu--2578--与女孩约会
    hdu--2588--欧拉函数||容斥原理
    hdu--2586--lca_tarjan<证明tarjan这个人很流弊>
    hdu--3743--归并排序<自顶向下&&自底向上>2种写法
    hdu--4911--归并排序||树状数组
    hdu--2639--01背包第K解<不同决策的不同解法>
    hdu--2642--二维BIT
    hdu--3833--4000ms才能过的O(N^2)算法
    hdu--3835--最简单的数学..
    hdu--3836--tarjan+缩点
  • 原文地址:https://www.cnblogs.com/mhbs/p/11874942.html
Copyright © 2020-2023  润新知