Как получить весь результат от MutableLiveData в Android? - PullRequest
0 голосов
/ 27 мая 2020

Я использую LiveData в своем приложении, и у меня есть модель и ViewModel. Вот моя модель и класс ViewModel:

public class HomeMenuModel {

  String id;
  String title;

  public String getId() {
    return id;
  }

  public void setId(String id) {
    this.id = id;
  }

  public String getTitle() {
    return title;
  }

  public void setTitle(String title) {
    this.title = title;
  }

}

public class DashboardViewModel {

  public MutableLiveData < HomeMenuModel > menuList = new MutableLiveData < > ();
  private List<String> idList = new ArrayList<>();
  private List<String> idLists = new ArrayList<>();
  private List<String> titleList = new ArrayList<>();

  public MutableLiveData < HomeMenuModel > setupMenu(Context mCtx) {

    idList.add("homeData");
    idList.add("homeVoiceAndSMS");
    idList.add("homeRoaming");
    idList.add("homeDigital");

    titleList.add(mCtx.getString(R.string.homeData));
    titleList.add(mCtx.getString(R.string.homeVoiceAndSMS));
    titleList.add(mCtx.getString(R.string.homeRoaming));
    titleList.add(mCtx.getString(R.string.homeDigital));

    HomeMenuModel homeMenuModel = new HomeMenuModel();
    for (int i = 0; i < idList.size(); i++) {
      homeMenuModel.setId(idList.get(i));
      homeMenuModel.setTitle(titleList.get(i));
    }

    menuList.setValue(homeMenuModel);
    return menuList;

  }

}

Я попытался добавить idList и titleList в setupMenu и вернуть menuList из функции. Я вызвал функцию setupMenu в своем фрагменте с помощью этого кода:

public class HomeFragment extends BaseFragment {

  static final String TAG = "FragmentHome";
  private FragmentHomeBinding mBinding;
  @Inject
  DashboardViewModel dashboardViewModel;
  private Context mCtx;

  @Override
  public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
    setHasOptionsMenu(true);
  }

  @Override
  public void onAttach(Context context) {
    super.onAttach(context);
    AndroidSupportInjection.inject(this);
  }

  @Override
  public View onCreateView(LayoutInflater inflater, ViewGroup container,
    Bundle savedInstanceState) {
    mBinding = DataBindingUtil.inflate(inflater, R.layout.fragment_home, container, false);
    View v = mBinding.getRoot();
    mCtx = mBinding.getRoot().getContext();
    initEvent();
    return v;
  }

  private void initEvent() {
    mBinding.setDashboardView(dashboardViewModel);
    dashboardViewModel.setupMenu(mCtx).observe(this, data - > {
      Log.e("menuList", data.getTitle());
    });
  }

  @Override
  public String getTagFragment() {
    return TAG;
  }

}

Я регистрирую список меню в HomeFragment, но, к сожалению, я получил только последний элемент идентификатора или заголовка, возвращенный из наблюдения.

Что что мне здесь не хватает?

Почему я получаю только последний элемент результата вместо 4 результатов, созданных в функции setupMenu? Как мне получить все 4 результата?

Любая помощь будет принята с благодарностью.

Спасибо.

1 Ответ

0 голосов
/ 27 мая 2020

Вы обновляете только последнюю информацию для homeMenuModel. чтобы получить весь предмет, вы должны создать MutableLiveData<ArrayList<HomeMenuModel>>. Попробуйте это

    private MutableLiveData<ArrayList<HomeMenuModel>> menuList = new MutableLiveData<ArrayList<HomeMenuModel>>()

    ArrayList<HomeMenuModel> list = new ArrayList<HomeMenuModel>()
    for (int i = 0; i < idList.size(); i++) {
      HomeMenuModel homeMenuModel = new HomeMenuModel();
      homeMenuModel.setId(idList.get(i));
      homeMenuModel.setTitle(titleList.get(i));
      list.add(homeMenuModel)
    }
    menuList.setValue(list);
...