回到活动后,为什么ViewModel不提供数据?

时间:2019-07-17 17:22:04

标签: android android-activity viewmodel

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 来获取和显示数据。 ViewModel BookDetailActivity onCreate()方法中初始化。

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

清单文件中, BookDetailActivity 具有 MainActivity 作为其父活动。用户可以通过按左上角的“后退”按钮返回 MainActivity

BookViewModel

BookViewModel 扩展了 ViewModel 类。它具有三个 LiveData对象,用于书籍,书籍详细信息和状态 MainActivity 观察到 Book LiveData 。它返回书单。 BookDetailActivity 会观察图书详细信息LiveData 。它返回一个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");
    }
}

我已经尝试过-

->将视图模型的初始化从简历移到开始方法。

-> AndroidViewModel类的扩展ViewModel

1 个答案:

答案 0 :(得分:0)

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

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

或在 ViewModel类中创建静态方法,以借助 setVlaue()方法设置List中的数据。

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