【问题标题】:Why ViewModel is not providing data when I return to activity?为什么当我返回活动时 ViewModel 不提供数据?
【发布时间】:2019-07-17 17:22:04
【问题描述】:

MainActivity 使用 ViewModel 显示书籍列表。当我从 DetailActivity 回到 MainActivity 时。 MainActivity 不再有该列表。

为什么当我返回 MainActivity 时 ViewModel 不提供列表?

如何保留 MainActivity 的列表?

MainActivity 显示书籍列表。当用户触摸列表项时。它使用以下方法启动 BookDetailActivity

private void startDetailActivity(String id){

        Intent detailActivity = new Intent(this,BookDetailActivity.class);
        detailActivity.putExtra("id",id);
        startActivity(detailActivity);

    }

它使用 ViewModel 来获取和显示图书列表。 ViewModel 由该方法初始化。

    @Override
    protected void onResume(){
        super.onResume();

        bookViewModel = ViewModelProviders.of(this).get(BookViewModel.class);

        //book list live data observer
        bookViewModel.getBookList().observe(this, new Observer<ArrayList<Book>>() {
            @Override
            public void onChanged(@Nullable ArrayList<Book> books) {
                Log.i("Adapter",""+books.size());
                adapter.clear();
                adapter.setData(books);
                adapter.notifyDataSetChanged();
                progressBar.setVisibility(View.GONE);
            }
        });


        //status live data observer
        bookViewModel.getStatus().observe(this, new Observer<Boolean>() {
            @Override
            public void onChanged(@Nullable Boolean aBoolean) {
                showErrorMessage();
            }
        });

    }

BookDetailActivity

此活动从数据中加载书籍详细信息。它还使用相同的 ViewModel 来获取和显示数据。 ViewModelBookDetailActivityonCreate() 方法 中初始化。

 @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_book_detail);

        getSupportActionBar().setDisplayHomeAsUpEnabled(true);

        Intent data = getIntent();

        String id = data.getStringExtra("id");

        viewModel = ViewModelProviders.of(this).get(BookViewModel.class);

        //book detail observer
        viewModel.getBookDetail().observe(this, new Observer<BookDetail>() {
            @Override
            public void onChanged(@Nullable BookDetail bookDetail) {
                setDetail(bookDetail);
            }
        });//end of observer

        viewModel.getBookDetail(id);
    }

Manifest 文件中,BookDetailActivityMainActivity 作为其父 Activity。用户可以通过按左上角的返回按钮返回到 MainActivity

BookViewModel

BookViewModel 扩展了 ViewModel 类。它具有三个LiveData 对象,分别用于图书、图书详情和状态Book LiveDataMainActivity 观察。它返回书籍列表。 BookDetailLiveDataBookDetailActivity 观察。它返回一个 BookDetail 对象。两个活动都观察网络请求状态的状态。

package com.google.firebase.udacity.findabook.viewmodel;

import android.app.Application;
import android.arch.lifecycle.AndroidViewModel;
import android.arch.lifecycle.LiveData;
import android.arch.lifecycle.ViewModel;
import android.util.Log;

import com.google.firebase.udacity.findabook.model.BookDetail;
import com.google.firebase.udacity.findabook.repository.BookRepository;
import com.google.firebase.udacity.findabook.model.Book;

import java.util.ArrayList;

public class BookViewModel extends ViewModel {
    private LiveData<ArrayList<Book>> bookList;
    private LiveData<Boolean> status;
    private LiveData<BookDetail> bookDetail;
    private BookRepository repository;

    public BookViewModel(){
        repository = new BookRepository();
        bookList = repository.getBookList();
        status = repository.getStatus();
        bookDetail = repository.getBookDetail();
    }

    public LiveData<ArrayList<Book>> getBookList(){ return bookList;}

    public LiveData<Boolean> getStatus(){return status;}

    public LiveData<BookDetail> getBookDetail(){return bookDetail;}

    public void searchByBookName(String bookName){
        repository.makeRequestBasedOnBookName(bookName);
    }

    public void getBookDetail(String id){
        repository.getBookDetail(id);
    }

    @Override
    protected void onCleared() {
        super.onCleared();
        Log.i("Book view model","Cleared");
    }
}

我试过了--

-> 将视图模型的初始化从 resume 移动到 start 方法。

-> AndroidViewModel 类的扩展视图模型

【问题讨论】:

  • 你能发布你的视图模型类吗

标签: android android-activity viewmodel


【解决方案1】:

使用下面的构造函数在 LiveData 的帮助下设置 ViewModel 中的数据

public BookViewModel(){
        repository = new BookRepository();
        bookList = repository.getBookList();
        status = repository.getStatus();
        bookDetail = repository.getBookDetail();
    }

或者在ViewModel类中制作静态方法,借助setVlaue()方法设置List中的数据。

还请提供您在 ViewModel 中设置数据的类。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-11-01
    • 1970-01-01
    • 2021-09-20
    • 2021-12-18
    • 1970-01-01
    • 1970-01-01
    • 2020-09-13
    • 1970-01-01
    相关资源
    最近更新 更多