java - 如何将数据从 Activity 或 fragment 传递到 View 模型?

标签 java android android-studio mvvm android-mvvm

我正在创建一个项目,我在其中使用 themoviedb api 来获取数据。为此,我使用 MVVM 架构。从 MovieListFragment 中,我想将流行、top_rated 等类别传递给 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 类:-

public class MovieViewModel extends AndroidViewModel {
    private String category;
    private static final String API_KEY = "api_key";
    private MovieRepository repository;
    private MutableLiveData<MovieResults> listOfMovies;

    public MovieViewModel(@NonNull Application application) {
        super(application);
        Log.d("MovieViewModel", category); // but here i am getting null value
        listOfMovies = repository.getListOfMovies(category, API_KEY);
    }

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

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

我收到这样的错误:-

java.lang.NullPointerException: Attempt to invoke virtual method 'java.util.List com.mountblue.moviesapp.entity.MovieResults.getResults()' on a null object reference
        at com.mountblue.moviesapp.fragment.MovieListFragment$2.onChanged(MovieListFragment.java:79)
        at com.mountblue.moviesapp.fragment.MovieListFragment$2.onChanged(MovieListFragment.java:76)

最佳答案

由于 Category 在 setter 之前由 MovieViewModel 的构造函数读取,因此它始终为 null。

将类别作为方法参数怎么样?

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)
    }
}

为了更详细的实现,需要一个存储库类。

文件: https://developer.android.com/topic/libraries/architecture/viewmodel

关于java - 如何将数据从 Activity 或 fragment 传递到 View 模型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60902338/

相关文章:

java - 方法/构造函数声明的左括号后和右括号前的空格

具有基于表单的身份验证的 Java Applet 在 IE 上工作但在 Chrome 上失败

android - 在 Android 上正确使用 Sqlite(SQLiteOpenHelper、连接、主线程等...)

android - 嵌套操作栏选项卡(带 ViewPager)

android - Gradle:为什么加运算符会导致欺骗字符串连接?

java - Spring MVC + session 管理

java - 访问 SQL 数据库时避免列名冗余?

java - 读取 JSON 响应

android - Retrofit2 onFailure 未调用错误 401

java - 如何在另一个Android Project中使用生成的.so库?