gpt4 book ai didi

android - LiveData 无法通知它的观察者 PagedList 对象的变化

转载 作者:太空宇宙 更新时间:2023-11-03 10:58:51 25 4
gpt4 key购买 nike

我写了这个简单的例子来测试paging library并使用 LiveData 观察 PagedList 的变化,但它仅在 LiveData<PagedList<Integer>> 时通知观察者一次对象被创建。我在我的 Activity 中使用按钮加载更多数据,并且 pagedList 对象已正确加载,但未观察到更改。这是我的 Activity 代码:

import android.arch.lifecycle.Observer;
import android.arch.lifecycle.ViewModelProviders;
import android.arch.paging.PagedList;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;

public class MainActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final MainViewModel mainViewModel = ViewModelProviders.of(this).get(MainViewModel.class);

Button b = findViewById(R.id.button);
b.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
PagedList<Integer> s = mainViewModel.getIntegers().getValue();
s.loadAround(s.size());
}
});
mainViewModel.setUpPaging(1);
mainViewModel.getIntegers().observe(this, new Observer<PagedList<Integer>>() {
@Override
public void onChanged(@Nullable PagedList<Integer> integers) {
//logging some text
Log.i("MyLog","new list Observed");

}
});


}
}

这是我的 ViewModel 类:

import android.arch.lifecycle.LiveData;
import android.arch.lifecycle.ViewModel;
import android.arch.paging.LivePagedListBuilder;
import android.arch.paging.PagedList;

public class MainViewModel extends ViewModel {

LiveData<PagedList<Integer>> integers;

public LiveData<PagedList<Integer>> getIntegers() {
return integers;
}
public void setUpPaging(Integer startFrom){

integers = new LivePagedListBuilder<Integer,Integer>(IntegersDataSource.randomNumbersStartingFrom(startFrom),
new PagedList.Config.Builder()
.setPageSize(5)
.setEnablePlaceholders(false)
.build()).build();
}

}

这是我的数据源,为了简单起见,它只生成随机整数:

import android.arch.paging.DataSource;
import android.arch.paging.PageKeyedDataSource;
import android.support.annotation.NonNull;

import java.util.ArrayList;
import java.util.List;
import java.util.Random;

public class IntegersDataSource extends PageKeyedDataSource<Integer,Integer> {
private Integer initialInt;
private final Integer BOUND = 300;

public IntegersDataSource(Integer initialInt) {
this.initialInt = initialInt;
}

@Override
public void loadInitial(@NonNull LoadInitialParams<Integer> params, @NonNull LoadInitialCallback<Integer, Integer> callback) {
Random r = new Random();
Integer i = r.nextInt(BOUND - 1) + 1;
List<Integer> l = new ArrayList<>();
l.add(i);
callback.onResult(l,initialInt-1, initialInt+1);

}

@Override
public void loadBefore(@NonNull LoadParams<Integer> params, @NonNull LoadCallback<Integer, Integer> callback) {

Random r = new Random();
Integer i = r.nextInt(BOUND - 1) + 1;
List<Integer> l = new ArrayList<>();
l.add(i);
callback.onResult(l, params.key-1);

}

@Override
public void loadAfter(@NonNull LoadParams<Integer> params, @NonNull LoadCallback<Integer, Integer> callback) {
Random r = new Random();
Integer i = r.nextInt(BOUND - 1) + 1;
List<Integer> l = new ArrayList<>();
l.add(i);
callback.onResult(l, params.key+1);
}
private static class RandomsFactory extends DataSource.Factory{
Integer srartFrom;
public RandomsFactory(Integer startFrom) {
this.srartFrom = startFrom;
}

@Override
public DataSource create() {
return new IntegersDataSource(srartFrom);
}
}

public static DataSource.Factory<Integer, Integer> randomNumbersStartingFrom(Integer startFrom) {
return new RandomsFactory(startFrom);
}
}

这是在我的构建 gradle 中:

implementation "android.arch.paging:runtime:1.0.0-rc1"

我多次按下按钮,但只观察到一次(创建时间)。

最佳答案

PagedListAdapter 不反射(reflect)已更改的项目本身。换句话说,PagedList 是不可变的。当发生更新时,您应该在当前数据源上调用 invalidate()。将通过 LivePagedListBuilder 创建一个新的 PagedList/DataSource 对,当当前 DataSource 失效时,它将通过 LiveData 传递给观察者。

试试这段代码。

b.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
PagedList<Integer> s = mainViewModel.getIntegers().getValue();
s.getDataSource().invalidate();
}
});

请查看此演示应用。

关于android - LiveData 无法通知它的观察者 PagedList 对象的变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50019707/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com