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
答案 0 :(得分:0)
使用以下构造函数在LiveData的帮助下在ViewModel中设置数据
public BookViewModel(){
repository = new BookRepository();
bookList = repository.getBookList();
status = repository.getStatus();
bookDetail = repository.getBookDetail();
}
或在 ViewModel类中创建静态方法,以借助 setVlaue()方法设置List中的数据。
还请提供您在ViewModel中设置数据所在的类。