2017-10-11 40 views
0
<layout xmlns:android="http://schemas.android.com/apk/res/android"> 
    <data> 
     <import type="android.view.View" /> 
     <variable 
      name="notificationResponse" 
      type="myms.models.NotificationResponse"/> 
    </data> 
<FrameLayout 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

........... 
<TextView 
     android:id="@+id/tv_empty_view" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_marginLeft="@dimen/_12dp" 
     android:layout_marginRight="@dimen/_12dp" 
     android:minHeight="@dimen/_60dp" 
     android:gravity="center" 
     android:textSize="@dimen/_18sp" 
     android:textStyle="bold" 
     android:text="No Message" 
     android:background="@color/white" 
     android:visibility="@{notificationResponse.payloads.size() > 0 ? View.GONE : View.VISIBLE}"/> 

...... 
</FrameLayout> 
</layout> 

我想要實現的是默認的視圖應消失在我的代碼異步調用其中i實際結合的notificationResponse對象後,應決定是否要顯示或隱藏視圖。控制視圖知名度

+0

簡單的谷歌搜索返回[此](https://stackoverflow.com/questions/44077566/how-to-combine-architecture-components-with-data-binding-on-android) – Selvin

+0

HTTPS://計算器。 com/questions/34823611/android-databinding-how-to-use-bool-resource-to-trigger-visibility-of-layout – PrakhaRaM

+0

請閱讀完整的問題。 –

回答

2

你寫android:visibility="@{notificationResponse.payloads.size() > 0 ? View.GONE : View.VISIBLE}"代碼的解釋是

當你的列表的大小是有你想要隱藏TextView而在其他情況下,你要顯示它比一個數據。

不是當你打電話給你的API時,你的列表大小肯定會小於或等於0,所以它不可見。

解決方案:

傳遞一些變量,它指示API在後臺,當API調用完成她一直在叫,該變量設置爲false。

android:visibility="@{notificationResponse.payloads.size() > 0 || !loading ? View.GONE : View.VISIBLE}" 

這意味着,如果你的列表大小超過一個API調用完成後,TextView應該隱藏。

默認情況下,加載的值應該爲false,當您調用API時將該值更改爲true,並且再次調用API時將其設置爲false。

+0

感謝工作就像一個魅力。 –

+0

但是正確的語句是'android:visibility =「@ {notificationResponse.payloads.size()> 0 || loading?View.GONE:View.VISIBLE}」'和變量應該在數據標籤內部聲明,如'' –

+1

'變量應該在數據標籤內聲明是的,這是顯而易見的事情。 'android:visibility =「@ {notificationResponse.payloads.size()> 0 || loading?View.GONE:View.VISIBLE}」'謝謝,會更新回答:) –

0

編輯

第一(根據下面的註釋)的方法是這樣的:

public void setLoading(boolean loading) { 
    isLoading = loading; 
    notifyPropertyChanged(BR._all); 
} 

notifyPropertyChanged(BR.loading); 

ref

但是,有這樣做的一個簡單的方法這,我會這樣做: first chang E本線在你看來

android:visibility="@{notificationResponse.payloads.size() > 0 ? View.GONE : View.VISIBLE}"/> 

android:visibility="gone"/> 

然後在您的AsyncTask添加如下內容:

protected void onPostExecute(Boolean toBeShown) { 
    if(toBeShown){ 
     tvEmptyView.setVisibility(View.VISIBLE); 
    }else{ 
     tvEmptyView.setVisibility(View.GONE); 
    } 
} 
+1

什麼你不明白*通過數據綁定控制視圖可見性***?我敢肯定,作者知道如何手動執行此操作 – Selvin

+1

xD,https://stackoverflow.com/a/40859353/2724879這是我很久以前發現的答案,但正如我所說'我會做到這一點以下方式我只是給出了一個不同的方法 –

+0

,這更適合這個問題:) – Selvin

1

在片段/你可以創建活動場INT itemsCount = 0並在獲得響應後設置itemsCount = response.payloads.size()並在xml set itemCount中代替NotificationResponse。

其實你必須在綁定中設置你的新變量來對視圖產生影響。這意味着如果你想在不改變你的xml的情況下實現你的結果,只需設置新的List你的變量,並從響應中獲得響應集列表。

+0

謝謝,聽起來很有希望,我需要將我的活動或片段作爲變量傳遞給數據標籤嗎? –

+0

@eCDroid它是諷刺嗎?當然不。爲了什麼? –

+0

謝謝,但是這個變量與payloads.size()的效果相同,因爲它們最初都是0 –