Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/222.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用导航控制器从以前的实例检索数据_Java_Android_Android Recyclerview_Viewmodel - Fatal编程技术网

Java 使用导航控制器从以前的实例检索数据

Java 使用导航控制器从以前的实例检索数据,java,android,android-recyclerview,viewmodel,Java,Android,Android Recyclerview,Viewmodel,我对Android开发还不太熟悉,我使用“导航”库 从我的第一个片段开始(这是一个从API获取数据的recyclerview),如果我导航到另一个片段,导航控制器将销毁第一个片段并创建第二个片段并显示它。如果我想返回到第一个片段(使用左箭头或后退按钮),它将销毁第二个片段并从头创建第一个片段,使其重新加载所有数据并使用bandwith 我已经阅读了许多解决方案,但它们都很挑剔: 使用mvvm 编写自己的导航控制器 使用mvp 我想知道在不再次调用API的情况下检索数据的更好方法是什么 我的第

我对Android开发还不太熟悉,我使用“导航”库

从我的第一个片段开始(这是一个从API获取数据的recyclerview),如果我导航到另一个片段,导航控制器将销毁第一个片段并创建第二个片段并显示它。如果我想返回到第一个片段(使用左箭头或后退按钮),它将销毁第二个片段并从头创建第一个片段,使其重新加载所有数据并使用bandwith

我已经阅读了许多解决方案,但它们都很挑剔:

  • 使用mvvm
  • 编写自己的导航控制器
  • 使用mvp
我想知道在不再次调用API的情况下检索数据的更好方法是什么

我的第一个片段:

public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        AnnoncesViewModel annoncesViewModel = new ViewModelProvider(this).get(AnnoncesViewModel.class);
        root = inflater.inflate(R.layout.fragment_annonces, container, false);
        ctx = root.getContext();

        recyclerView = root.findViewById(R.id.listeannonce_rv);

        annoncesViewModel.getAnnonces().observe(this, data-> {
            recyclerViewAdapter = new ListeAnnoncesAdapter(data, ctx, AnnoncesFragment.this);
            recyclerView.setLayoutManager(new LinearLayoutManager(root.getContext()));
            recyclerView.setAdapter(recyclerViewAdapter);
        });

        return root;
    }
viewmodel:

public class AnnoncesViewModel extends ViewModel {

    MutableLiveData<ArrayList<Annonce>> annonces;
    ArrayList<Annonce> AnnonceArrayList;

    public AnnoncesViewModel() {
        annonces = new MutableLiveData<>();
        AnnonceArrayList = new ArrayList<>();
        annonces.setValue(AnnonceArrayList);
    }

    public MutableLiveData<ArrayList<Annonce>> getAnnonces() {
        return annonces;
    }
}

但这并没有改变任何事情

目前,当我按下一个按钮时,数据被检索


谢谢你的帮助

ViewModel方法是正确的选择。问题是,当您导航到新片段时,AnnonceViewModel也会被破坏,因为您正在将片段上下文传递给ViewModelProvider。要在导航到其他片段后保留ViewModel,请将活动上下文传递给提供程序,如:

ViewModelProviders.of(requireActivity()).get(AnnoncesViewModel::class.java)
这将在您再次启动片段时保持ViewModel“活动”,而不是在每次创建片段时创建新的AnnonceViewModel

navController.navigate(R.id.nav_frag2);
ViewModelProviders.of(requireActivity()).get(AnnoncesViewModel::class.java)