2017-07-17 2 views
0

L'application s'exécute mais le TextView ne reçoit pas la mise à jour ici est le code approprié.Liaison de données Android sur classe interne ne pas mettre à jour 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"> 
..... 

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

Voici mon modèle 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; 
    } 
} 

Et enfin voici mon activité

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); 
} 

Veuillez suggérer une solution. J'essaye ceci depuis un certain temps maintenant. P.S: J'utilise aussi un couteau à beurre.

+0

Comment voulez-vous dire "' TextView' ne se met pas à jour "? Veuillez expliquer ce que vous essayez d'accomplir. – arcticwhite

+0

J'ai posté un code de référence complet et une explication. J'ai lié mon textview avec le modèle et je règle le texte sur le modèle via l'instance de liaison mais aucun effet. –

+0

Appelez 'profilePayload.setFirstName' après' binding.setProfilePayload'. ButterKnife est à mon humble avis pas nécessaire si vous utilisez la liaison de données. – artkoenig

Répondre

2

Le problème réside dans la façon dont vous mélangez des dispositions de liaison de données avec des mises en page régulières.

Si vous souhaitez inclure une mise en page de liaison de données à partir d'une mise en page standard, vous devez rechercher la vue racine de la mise en page et appeler le bind(). Peut-être quelque chose comme ceci: Cependant, il est préférable

@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); 
} 

pour faire de votre mise en page de l'activité d'une mise en page de liaison de données et vous ne devrez pas faire ce travail supplémentaire:

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

Et puis votre code de liaison est beaucoup plus simple et moins sujette aux erreurs:

@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); 
} 

sur une note différente, je pense que les données Android de liaison et Butterknife ont un chevauchement important dans la fonctionnalité et je recommande de choisir un o r l'autre, mais pas les deux.

+0

Merci George, cela a fonctionné et aussi montrer la manière la plus simple. Pouvez-vous s'il vous plaît élaborer un chevauchement dans la fonctionnalité. Est-ce que l'erreur est sujette si j'utilise les deux? –

+0

Je souhaite que cette étape 'View bindingRoot = findViewById (R.id.toolbar); LayoutHeaderBinding binding = LayoutHeaderBinding.bind (bindingRoot); 'a été ajouté dans la section des exemples de pages de liaison de données officielles" includes " –

+0

Maintenant, je veux réaliser quelque chose comme ceci' android: text = "hi, @ {profilePayload.firstName} @ { profilePayload.lastName} "' est-ce possible? –