2017-07-17 21 views
0

應用程序運行但TextView不會更新這裏是相關的代碼。Android數據綁定內部類不更新TextView

activity_picker_dashboard.xml

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

    <!-- Top header --> 

    <include layout="@layout/layout_header" /> This layout has databinding 

    <!-- DrawerLayout --> 

    <android.support.v4.widget.DrawerLayout 
     android:id="@+id/drawer_layout" 
     android:layout_width="0dp" 
     android:layout_height="0dp" 
     android:background="@color/gray" 
     app:layout_constraintBottom_toBottomOf="parent" 
     app:layout_constraintLeft_toLeftOf="parent" 
     app:layout_constraintRight_toRightOf="parent" 
     app:layout_constraintTop_toBottomOf="@+id/toolbar"> 
..... 

這裏是layout_header.xml

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

<Toolbar 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    android:id="@+id/toolbar" 
    android:padding="8dp" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:background="@color/white"> 

<android.support.constraint.ConstraintLayout 
    android:id="@+id/header" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 

    app:layout_constraintEnd_toEndOf="parent" 
    app:layout_constraintStart_toStartOf="parent" 
    app:layout_constraintTop_toTopOf="parent"> 

    <ImageView 
     android:layout_width="180dp" 
     android:layout_height="60dp" 
     android:adjustViewBounds="true" 
     app:layout_constraintLeft_toLeftOf="parent" 
     app:layout_constraintTop_toTopOf="parent" 
     app:layout_constraintBottom_toBottomOf="parent" 
     android:src="@drawable/logo_color"/> 

    <TextView 
     android:id="@+id/username" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_marginEnd="8dp" 
     android:text="@{profilePayload.firstName}" Here it is 
     android:textColor="@color/red" 
     android:textSize="18sp" 
     app:layout_constraintBottom_toTopOf="@+id/role" 
     app:layout_constraintRight_toRightOf="parent" 
     app:layout_constraintTop_toTopOf="parent" 
     app:layout_constraintVertical_chainStyle="packed" /> 

............... 
</Toolbar> 
</layout> 

這裏是我的模型ProfileResponse.java

public class ProfileResponse 
{ 
    public Payload getPayLoad() { 
     return payLoad; 
    } 

    @SerializedName("Payload") 
    private Payload payLoad; 

    public static class Payload 
    { 
     public String getProfileId() { 
      return profileId; 
     } 

     public String getUserId() { 
      return userId; 
     } 

     public String getFirstName() { 
      return firstName; 
     } 

     public String getLastName() { 
      return lastName; 
     } 

     @SerializedName("ProfileId") 
     private String profileId; 

     @SerializedName("UserId") 
     private String userId; 

     public void setFirstName(String firstName) { 
      this.firstName = firstName; 
     } 

     public void setLastName(String lastName) { 
      this.lastName = lastName; 
     } 

     @SerializedName("FirstName") 

     private String firstName; 

     @SerializedName("LastName") 
     private String lastName; 
    } 
} 

最後,這裏是我的活動

public class PickerDashboardActivity extends Activity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     setContentView(R.layout.activity_picker_dashboard); 

     LayoutHeaderBinding binding = LayoutHeaderBinding.inflate(getLayoutInflater()); 

     ProfileResponse.Payload profilePayload = new ProfileResponse.Payload(); 
     profilePayload.setFirstName("Test"); 

     binding.setProfilePayload(profilePayload); 

     ButterKnife.bind(this); 
} 

請提出解決方案。我現在一直在嘗試這一點。 P.S:我也在用黃油刀。

+0

你是什麼意思「'TextView'沒有得到更新」? 請解釋你想要完成什麼。 – arcticwhite

+0

我已經發布完整的參考碼和說明。我用模型綁定了我的textview,並通過綁定實例在模型上設置文本,但沒有效果。 –

+0

在'binding.setProfilePayload'後面調用'profilePayload.setFirstName'。如果使用數據綁定,ButterKnife是恕我直言,不需要。 – artkoenig

回答

2

問題在於如何將數據綁定佈局與常規佈局混合。

如果要從常規佈局中包含數據綁定佈局,則需要查找佈局的根視圖並在其上調用bind()。也許是這樣的:

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    setContentView(R.layout.activity_picker_dashboard); 
    View bindingRoot = findViewById(R.id.toolbar); 

    LayoutHeaderBinding binding = LayoutHeaderBinding.bind(bindingRoot); 

    ProfileResponse.Payload profilePayload = new ProfileResponse.Payload(); 
    profilePayload.setFirstName("Test"); 

    binding.setProfilePayload(profilePayload); 
} 

然而,最好是讓你的Activity的佈局數據綁定的佈局,你不必做額外的工作:

<?xml version="1.0" encoding="utf-8"?> 
<layout xmlns:android="http://schemas.android.com/apk/res/android"> 
    <data> 
     <variable 
      name="profilePayload" 
      type="myms.models.ProfileResponse.Payload"/> 
    </data> 
    <android.support.constraint.ConstraintLayout 
     android:layout_width="match_parent" 
     android:layout_height="match_parent"> 

     <!-- Top header --> 

     <include layout="@layout/layout_header" app:profilePayload="@{profilePayload}" /> 

     <!-- DrawerLayout --> 
    </android.support.constraint.ConstraintLayout> 
</layout> 

然後你的綁定代碼要簡單得多,且不易出錯:

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    ActivityPickerDashboardBinding binding = 
     DataBindingUtil.setContentView(this, R.layout.activity_picker_dashboard); 

    ProfileResponse.Payload profilePayload = new ProfileResponse.Payload(); 
    profilePayload.setFirstName("Test"); 

    binding.setProfilePayload(profilePayload); 
} 

在不同的音符,我認爲在功能上Android的數據綁定和butterknife有顯著的重疊,我會建議選擇一個O另一個,但不是兩個。

+0

謝謝喬治,它的工作,也顯示了更簡單的方式。你能否詳細說明功能上的重疊?如果我同時使用它,是否容易出錯? –

+0

我希望這一步'View bindingRoot = findViewById(R.id.toolbar); LayoutHeaderBinding binding = LayoutHeaderBinding.bind(bindingRoot);'在數據綁定官方頁面示例部分添加了「包含」 –

+0

現在我想實現像這樣的'android:text =「嗨,@ {profilePayload.firstName} @ { profilePayload.lastName}「'有可能嗎? –