【发布时间】: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 来获取和显示数据。 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);
}
在 Manifest 文件中,BookDetailActivity 将 MainActivity 作为其父 Activity。用户可以通过按左上角的返回按钮返回到 MainActivity。
BookViewModel
BookViewModel 扩展了 ViewModel 类。它具有三个LiveData 对象,分别用于图书、图书详情和状态。 Book LiveData 由 MainActivity 观察。它返回书籍列表。 BookDetailLiveData 由 BookDetailActivity 观察。它返回一个 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