首页 > 解决方案 > 如何从 Android 中的 MutableLiveData 获取所有结果?

问题描述

我在我的应用程序中使用 LiveData,并且我有一个模型和一个 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。我在 Fragment 中调用了 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 中记录 menuList,但不幸的是,我只得到了从观察返回的 id 或标题的最后一项。

我在这里想念什么?

为什么我只得到最后一项结果而不是在 setupMenu 函数中创建的 4 个结果?如何获得所有 4 个结果?

任何帮助都感激不尽。

谢谢你。

标签: androidmvvmandroid-livedata

解决方案


您只更新最后的信息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);

推荐阅读