2016-03-25 1 views
5

Non riesco a capire ... Come impostare alcune proprietà di visualizzazione solo se il campo variabile non è nullo?
Per esempioAssociazione dati: imposta proprietà se non è nulla

<?xml version="1.0" encoding="utf-8"?> 
<layout xmlns:android="http://schemas.android.com/apk/res/android"> 

    <data> 
     <variable 
      name="item" 
      type="com.test.app.Item" /> 
    </data> 

    <RelativeLayout 
     android:layout_width="match_parent" 
     android:layout_height="60dp" 
     android:orientation="horizontal"> 

     <ImageView 
      android:id="@+id/icon" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_alignParentLeft="true" 
      android:layout_alignParentStart="true" 
      android:layout_centerVertical="true" 
      android:layout_margin="16dp" 
      android:src="@{item.getDrawable()}"/> 

     <LinearLayout 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:layout_centerVertical="true" 
      android:layout_marginEnd="16dp" 
      android:layout_marginLeft="72dp" 
      android:layout_marginRight="16dp" 
      android:layout_marginStart="72dp" 
      android:layout_toLeftOf="@id/action" 
      android:layout_toStartOf="@id/action" 
      android:orientation="vertical"> 

      <TextView 
       android:id="@+id/text1" 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content" 
       android:singleLine="true" 
       android:textColor="@color/black_87" 
       android:textSize="16sp" 
       android:text="@{item.getTitle()}"/> 

      <TextView 
       android:id="@+id/text2" 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content" 
       android:autoLink="web|email" 
       android:linksClickable="false" 
       android:singleLine="true" 
       android:textColor="@color/black_54" 
       android:textSize="14sp" 
       android:text="@{item.getSubtitle()}"/> 


     </LinearLayout> 

    </RelativeLayout> 
</layout> 

qualche campo della voce può essere nullo e non voglio chiamare i metodi di vista del layout inutilmente. E non otterrò NullPointerException. Come posso impostare la proprietà solo se non è nulla?
P.S. Scusa per l'inglese.

risposta

24

L'associazione di dati pozzi consente di evitare NullPointerException in generale verificandone l'assegnazione e assegna il valore predefinito (null, ad esempio) anche se nel proprio esempio lo è item.

Ma un esempio di base per i controlli nulli per le proprietà dell'elemento:

android:text='@{item.title != null ? user.title : ""}' 

Oppure utilizzare il "Null coalescenza operatore". L'operatore null coalescente (??) sceglie l'operando di sinistra se non è nullo o il diritto se è nullo.

android:text='@{item.title ?? ""}' 

noti che title o getTitle non importa.

+0

Lo so. Come ho capito è impossibile non chiamare il metodo in Visualizza se il valore è nullo ?. –

+1

Mi dispiace, non sono sicuro di cosa stai chiedendo qui. Stai cercando di mantenere il valore precedente se il nuovo valore era nullo? Non sono sicuro che questo sia un buon modo per ottenerlo attraverso l'associazione dei dati. Il nuovo bind di dati bidirezionale potrebbe essere usato immagino impostando il valore di qualche oggetto (possibilmente altro) ogni volta che non è nullo. Ma dubito che questo sia un buon modo di affrontarlo. –

+1

Un modo sarebbe quello di dividere la variabile utilizzata, invece, avere uno per ogni proprietà. Di tipo String invece di Item. –