2017-09-17 10 views
1

は基本的に私のViewModelはMutableLiveDataとして以下のPOJO成り立つ:アラビリストのサイズがデータバインディングによって変化するのを観察する方法はありますか?

public class SubredditAddition { 

    private final ArrayList<Keyword> mKeywords = new ArrayList<>(); 

} 

をそして私はmKeyword.size() > 0

現在、私は私の見解に次の行があれば表示が消えたい:

android:visibility="@{viewModel.subredditAddition.keywords.size() == 0 ? View.GONE : View.VISIBLE}" 

しかし、mKeywords配列のサイズを変更しても、ビューの可視性には影響しません。ビューをArrayListのサイズにリアルタイムで反応させるにはどうすればよいですか?

更新:

public class SubredditAddition { 

    private final ObservableArrayList<Keyword> mKeywords = new ObservableArrayList<>(); 

} 

私のViewModel MutableLiveDataでSubredditAdditionを保持し、次のようになります:

public class SubredditSelectionViewModel extends AndroidViewModel { 

    private MutableLiveData<SubredditAddition> mSubredditAddition = new MutableLiveData<>(); 

    public SubredditSelectionViewModel(Application application) { 
     super(application); 

     mSubredditAddition.setValue(new SubredditAddition()); 
    } 
} 

そして、私の断片そうは次のように

マイSubredditAdditionクラスは今、ObservableArraylistを使用していますキーワードを更新するには、次のコードを使用してください:

public class SubredditSelectionFragment extends Fragment { 

    private void saveTag(Keyword newKeyword) { 
     SubredditSelectionViewModel viewModel = 
       ViewModelProviders.of(this).get(SubredditSelectionViewModel.class); 

     ObservableArrayList<Keyword> keywords = viewModel.getSubredditAddition().getKeywords(); 

     keywords.add(newKeyword); 
    } 
} 

私のXMLビューは次のようになります。私は私の断片でsaveKeyword()メソッドを介してキーワードを追加すると

<RelativeLayout .... 
      android:visibility="@{viewModel.subredditAddition.keywords.size() == 0 ? View.VISIBLE : View.GONE}"> 

はしかし、私のUIはまだ更新されません。これをどうすれば解決できますか?

答えて

3

はい。 ArrayList自体はObservableではありません。あなたがアイテムを追加/削除したときにレジストリに変更をプッシュするか、代わりにObservableArrayListを使用してください。

それはあなたがゲッターとセッターを提供しない場合、それpublicくださいget()set()

public class SubredditAddition { 
    public final ObservableList<Keyword> mKeywords = new ObservableArrayList<>(); 
} 

を使用してyou'rができArrayListのように振る舞うと。

上記の解決策が機能する場合でも、リスト内の項目は更新されますがリスト自体は更新されないため、推奨されません。

より良い解決策は、ObservableIntまたはObservableBooleanを作成し、List setterが呼び出されたときにこれを更新することです。

例:あなたのレイアウトで

ObservableInt listVisibility = new ObservableInt(View.GONE); 

public void setListData(List<Keyword> data) { 
    // update your list 
    listVisibility.set(data.size() > 0 ? View.VISIBLE : View.GONE); 
} 

し、最終的に:

android:visibility="@{viewModel.listVisibility}" 
+0

しかし私は、何の更新がUIにまだなかった、これを試してみました。 SubredditAdditionはBaseObservableなどを拡張する必要がありますか? – BeardMagician

+0

ObservableList変更されたビュー(set()が呼び出された)をビューに通知します。公開されており、ゲッター/セッターがないことを確認してください。注意:あなたのリストの項目を追加または削除する場合にのみ通知します。あなたもキーワードの変更を聞きたいですか?はいの場合は、解決策の回答を更新してください –

+0

アイテムが追加または削除されたときに通知します。今すぐlist.add()を実行します。代わりにlist.set()を使うはずですか? – BeardMagician

関連する問題