Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/356.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/217.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 如何将数据从活动或片段传递到viewmodel?_Java_Android_Android Studio_Mvvm_Android Mvvm - Fatal编程技术网

Java 如何将数据从活动或片段传递到viewmodel?

Java 如何将数据从活动或片段传递到viewmodel?,java,android,android-studio,mvvm,android-mvvm,Java,Android,Android Studio,Mvvm,Android Mvvm,我正在创建一个项目,其中我使用MovieDB api获取数据。为此,我使用MVVM体系结构。从MovieListFragment中,我想将诸如热门、顶级等类别传递给MovieViewModel,以便相应地过滤电影,但在那里我得到了空值 以下是MovieListFragment类:- public class MovieListFragment extends Fragment { private MovieViewModel movieViewModel; private st

我正在创建一个项目,其中我使用MovieDB api获取数据。为此,我使用MVVM体系结构。从MovieListFragment中,我想将诸如热门、顶级等类别传递给MovieViewModel,以便相应地过滤电影,但在那里我得到了空值

以下是MovieListFragment类:-

public class MovieListFragment extends Fragment {

    private MovieViewModel movieViewModel;
    private static final String BASE_URL = "https://api.themoviedb.org";
    private static final String API_KEY = "API_KEY";
    private String category;

    private GridView gridView;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.fragment_movie_list, container, false);
        gridView = rootView.findViewById(R.id.images_grid_view);

        movieViewModel = ViewModelProviders.of(this).get(MovieViewModel.class);
        movieViewModel.setCategory(category);  // from here i am passing value
        movieViewModel.getMoviesRepository().observe(getActivity(), new Observer<MovieResults>() {  // error line no :- 76
                @Override
                public void onChanged(MovieResults movieResults) {
                    final List<MovieResults.ResultsBean> listOfMovies = movieResults.getResults();  // error line no :- 79

                    MovieListAdapter mAdapter = new MovieListAdapter(getContext(), listOfMovies);
                    gridView.setAdapter(mAdapter);
                    gridView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                        @Override
                        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                            mCallback.onImageSelected(position, listOfMovies);
                        }
                    });
                }
            });
        return rootView;
    }

    public void setCategory(String category) {
        this.category = category;
    }
}

如果在
movieViewModel.setCategory(category)行中获得字符串
category
null
,表示
MovieListFragment
category
字段为空

尝试检查是否调用了
片段上的
setCategory(String category)
方法


如果不是这样,请详细说明错误。例如,它发生在哪一行等。

由于类别是由MovieViewModel的构造函数在setter之前读取的,因此它始终为空

作为方法参数的category呢

public class MovieViewModel extends AndroidViewModel {

    private static final String API_KEY = "api_key";
    private MovieRepository repository;
    private MutableLiveData<MovieResults> listOfMovies = new MutableLiveData<MovieResults>();

    public MovieViewModel(@NonNull Application application) {
        super(application);
    }

    public MutableLiveData<MovieResults> getMoviesRepository(category) {
        loadData(category);
        return listOfMovies;
    }

    private void loadData(category) {
        // Do an asynchronous operation to fetch MovieResults.
        repository.getListOfMovies(category, API_KEY);

        ...
        // Receive asynchronous result in callback

        // Post the result after getting the asynchronous result.
        listOfMovies.postValue(response)
    }
}
公共类MovieViewModel扩展了AndroidViewModel{
私有静态最终字符串API_KEY=“API_KEY”;
私人电影收藏库;
私有MutableLiveData listOfMovies=新的MutableLiveData();
公共MoviewModel(@NonNull应用程序){
超级(应用);
}
公共可变LiveData getMoviesRepository(类别){
负荷数据(类别);
归还车辆名单;
}
专用void加载数据(类别){
//执行异步操作以获取MovieResults。
getListOfMovies(类别,API_键);
...
//在回调中接收异步结果
//在获得异步结果后发布结果。
listOfMovies.postValue(响应)
}
}
要获得更详细的实现,需要一个repository类

文件:

必须创建viewmodel工厂才能将数据从活动或片段传递到viewmodel。您可以在MovieListFragment类中的。

中引用此内容:

首先删除这一行:
moviewmodel.setCategory(category)

并在此处传递“category:
moviewmodel.getMoviesRepository(category)
类似下面的代码:

movieViewModel.getMoviesRepository(category).observe(getActivity(), new Observer<MovieResults>() {  // error line no :- 76
            @Override
            public void onChanged(MovieResults movieResults) {
                final List<MovieResults.ResultsBean> listOfMovies = movieResults.getResults();  // error line no :- 79

                MovieListAdapter mAdapter = new MovieListAdapter(getContext(), listOfMovies);
                gridView.setAdapter(mAdapter);
                gridView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                    @Override
                    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                        mCallback.onImageSelected(position, listOfMovies);
                    }
                });
            }
        });

我不知道为什么它在你的情况下不起作用,但你的问题就是我问题的答案。它在我的项目中运行良好。thanksHow
repository
已创建?repository类与模型类类似,但它使用DAO接口将数据获取和设置到脱机房间数据库,还可以从联机服务器获取和设置数据。我找不到一个好的简单的java示例,但可以在GitHub中看到这个简单的项目。他们使用远程和本地存储库谢谢您的详细回答!是的,我知道它可以是一个房间数据库。我的意思是,它是如何创建的(比如
repository=new…
)?因为我们不直接在
MovieViewModel
中传递
repository
(我不知道它是如何创建的)。这不是代码的问题,而是作者和所有回复者的问题。
public class MovieViewModel extends AndroidViewModel {

    private static final String API_KEY = "api_key";
    private MovieRepository repository;
    private MutableLiveData<MovieResults> listOfMovies = new MutableLiveData<MovieResults>();

    public MovieViewModel(@NonNull Application application) {
        super(application);
    }

    public MutableLiveData<MovieResults> getMoviesRepository(category) {
        loadData(category);
        return listOfMovies;
    }

    private void loadData(category) {
        // Do an asynchronous operation to fetch MovieResults.
        repository.getListOfMovies(category, API_KEY);

        ...
        // Receive asynchronous result in callback

        // Post the result after getting the asynchronous result.
        listOfMovies.postValue(response)
    }
}
movieViewModel.getMoviesRepository(category).observe(getActivity(), new Observer<MovieResults>() {  // error line no :- 76
            @Override
            public void onChanged(MovieResults movieResults) {
                final List<MovieResults.ResultsBean> listOfMovies = movieResults.getResults();  // error line no :- 79

                MovieListAdapter mAdapter = new MovieListAdapter(getContext(), listOfMovies);
                gridView.setAdapter(mAdapter);
                gridView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                    @Override
                    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                        mCallback.onImageSelected(position, listOfMovies);
                    }
                });
            }
        });
public class MovieViewModel extends AndroidViewModel {
    
    private static final String API_KEY = "api_key";
    private MovieRepository repository;
    private MutableLiveData<MovieResults> listOfMovies;

    public MovieViewModel(@NonNull Application application) {
        super(application);
        
    }

    public MutableLiveData<MovieResults> getMoviesRepository(String category) {
        Log.d("MovieViewModel", category); // but here i am getting null value
        listOfMovies = repository.getListOfMovies(category, API_KEY);
        return listOfMovies;
    }

}