gpt4 book ai didi

android - 在 ViewModel 中加载已在 SplashActvity 中检索到的数据

转载 作者:搜寻专家 更新时间:2023-11-01 08:19:54 24 4
gpt4 key购买 nike

我是 ViewModel 的新手,我知道这是一种与 fragment 通信的强大而简单的方式。

我的问题如下:如何在 mainActivity 的 ViewModel 中加载 SplashActivity 中检索到的数据?

我的应用程序架构如下:

  1. SplashActivity :通过改造检索数据并将其存储到列表中
  2. 主要 Activity :包含两个以不同方式显示数据的 fragment

这是一段代码,展示了我的实现。

SplashActivity

public class SplashActivity extends AppCompatActivity {

private final String TAG = "TAG.SplashActivity";
public static List<Toilet> toiletList = new ArrayList<>(); // HERE IS THE DATA I WANT TO
RETRIEVE IN THE MAIN ACTIVITY

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

/*Create handle for the RetrofitInstance interface*/
GetDataService service = ...;
// MY STUFF RETROFIT including
Intent intent = new Intent(getApplicationContext(), MainActivity.class);
intent.putExtra("toiletList", (Serializable) toiletList);
startActivity(intent);
finish();
}
}

主 Activity

public class MainActivity extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener {

private final String TAG = getClass().getName();
private List<Toilet> toiletList = new ArrayList<>();

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

Intent intent= getIntent();
Serializable s = intent.getSerializableExtra("toiletList");
// Check type and cast
if (s instanceof List<?>) {
for (Object o : (List<?>) s) {
if (o instanceof Toilet) {
toiletList.add((Toilet) o);
}
}
}

// SETTING UP FRAGMENTS
}
}

fragment 示例

public class MainFragment extends Fragment {

public static List<Toilet> toiletArrayList = new ArrayList<>();
private final String TAG = this.getClass().getName();

@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {

View view = inflater.inflate(R.layout.fragment_main, container, false);

// SETTING UP UI
return view;
}

@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
ToiletListViewModel model = ViewModelProviders.of(this).get(ToiletListViewModel.class);
model.getToiletList().observe(this, new Observer<List<Toilet>>() {
@Override
public void onChanged(@Nullable List<Toilet> toilets) {
// update UI
}
});
}
}

ToiletListViewModel

public class ToiletListViewModel extends ViewModel {

private final String TAG = getClass().getName();
private MutableLiveData<List<Toilet>> toiletList;

public LiveData<List<Toilet>> getToiletList() {
if (toiletList == null) {
toiletList = new MutableLiveData<>();
loadToilets();
}
return toiletList;
}

private void loadToilets() {
// asynchronously fetch toilets
// HERE IS MY PROBLEM : How to access the toiletList retrieved
in the SplashActivity ?
toiletList.setValue(SplashActivity.toiletList);
}

@Override
protected void onCleared() {
super.onCleared();
Log.d(TAG, "onCleared() called");
}
}

我希望这很清楚。如果您想了解更多信息,请随意询问!

最佳

最佳答案

您可以 share MainActivity 及其 Fragment 之间的 ToiletListViewModel

所以您需要为您的 ViewModel 提供 MainActivity 范围(这意味着您将 ViewModel 的生命周期绑定(bind)到您的 Activity)并调用 initToilets 然后子 fragment 可以轻松检索此 ViewModel 并观察其 LiveData

厕所 ListView 模型:

public class ToiletListViewModel extends ViewModel {

private MutableLiveData<List<Toilet>> toiletList = new MutableLiveData();

public LiveData<List<Toilet>> getToiletList() {
return toiletList;
}

private void initToilets(List<Toilet> toilets) {
toiletList.setValue(toilets);
}


}

主要 Activity :

public class MainActivity extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener {

private final String TAG = getClass().getName();
private List<Toilet> toiletList = new ArrayList<>();

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

Intent intent= getIntent();
Serializable s = intent.getSerializableExtra("toiletList");
// Check type and cast
if (s instanceof List<?>) {
for (Object o : (List<?>) s) {
if (o instanceof Toilet) {
toiletList.add((Toilet) o);
}
}
}
ToiletListViewModel vm = ViewModelProviders.of(this).get(ToiletListViewModel.class);
vm.initToilets(toiletList);
// SETTING UP FRAGMENTS
}
}

因此,当调用setValue 时,监听toiletList 实时数据的Fragments 将得到通知。

注意:

您可以创建一个共享的 ViewModel 而无需在 MainActivity 上提供它,而不是调用

ViewModelProviders.of(this).get(ToiletListViewModel.class);

在你的 fragment 中做

ViewModelProviders.of(getActivity()).get(ToiletListViewModel.class);

关于android - 在 ViewModel 中加载已在 SplashActvity 中检索到的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52678644/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com