我尝试使用这个实现ViewModel。但观察者从未被调用。
基本上,这个应用程序在SAMPLE_URL上发出网络请求,将JSON转换为列表,并通过BookView显示列表。这个应用程序在没有ViewModel的情况下工作得很好。使用ViewModel,应用程序会运行,但Observer从未被调用,也没有显示任何数据。
我在这里做错了什么?
BookActivity类:
public BookAdapter bookAdapter;
ListView bookView;
public final static String SAMPLE_URL = "https://www.googleapis.com/books/v1/volumes?q=search+terms";
public ArrayList<Book> books = new ArrayList<>();
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activitymain);
bookView = findViewById(R.id.list);
bookAdapter = new BookAdapter(BookActivity.this,books);
BookViewModel bookViewModel = new ViewModelProvider(this).get(BookViewModel.class);
bookViewModel.getBooks().observe(this, books -> {
Log.d("INSIDE", "observe");
bookAdapter = new BookAdapter(this,books);
bookView.setAdapter(bookAdapter);
bookAdapter.notifyDataSetChanged();
});
}
BookViewModel类:
public class BookViewModel extends ViewModel {
public MutableLiveData<List<Book>> books;
public LiveData<List<Book>> getBooks(){
if (books == null) {
books = new MutableLiveData<>();
loadBooks();
}
return books;
}
private void loadBooks() {
thread.start();
}
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
URL url = QueryUtility.createURL(BookActivity.SAMPLE_URL);
try{
assert url != null;
String JSONResponse = QueryUtility.ReadFromStream(QueryUtility.MakeHTTPRequest(url));
books = new MutableLiveData<>(QueryUtility.extractBooksFromJSON(JSONResponse));
}
catch (IOException | JSONException ioException){
ioException.printStackTrace();
}
}
});
}
线程为books
创建了一个新的MutableLiveData实例。您可能观察到的原始懒散加载实例从未更新。您应该更新现有实例的值。
books.postValue(QueryUtility.extractBooksFromJSON(JSONResponse));
我有一个片段和一个相应的viewmodel类。我在Fragment方法上从DB获取包装为LiveData的联系人列表。它工作得很好,我使用PagedListAdapter显示联系人列表,如下所示: 我在我的片段中添加了一个观察者,如下所示: 有一个按钮在我的片段,它把我带到另一个屏幕,在那个屏幕上我添加更多的联系人到表。但当我从那个屏幕回到我的片段时,观察者并没有被调用。这意味着返回时不会调用方法
此外,为什么Viewmodel不能观察到它自己的LiveData的变化?
我有一个单独的类来处理数据提取(特别是Firebase),我通常从它返回LiveData对象并异步更新它们。现在我希望将返回的数据存储在ViewModel中,但问题是为了获得所述值,我需要观察从数据提取类返回的LiveData对象。observe方法需要一个LifecycleOwner对象作为第一个参数,但我的ViewModel中显然没有这个对象,而且我知道我不应该在ViewModel中保留对ac
我正在从ViewModel中的Dialog片段更新LiveData值,但无法获取片段中的值。 视图模型: BaseViewModel: 对话框片段: 我从DialogFragment的xml文件中调用viewmodel的resendOTP(contactId:String)方法: 现在,每当我尝试从片段中调用resendOTP响应LiveData时,它都不会被调用: 所以我在这里做错了什么。 编辑
试图让LiveData与Room一起工作: 因为我观察到tdao.getall(),所以我希望在我的活动中,当同步完成时,它会刷新日历。现在,您必须重新加载该活动,以获取在执行同步后放入数据库的数据。我对Room和LiveData很陌生。有什么想法吗?希望我没有拿出太多的代码,这是从一个相当大的应用程序到目前为止。