LiveData не может уведомить своего наблюдателя об изменениях в объекте PagedList - PullRequest
0 голосов
/ 25 апреля 2018

Я написал этот простой пример для проверки библиотеки подкачки и наблюдения изменений в PagedList с использованием LiveData, но он уведомляет наблюдателя только один раз, когда создается объект LiveData<PagedList<Integer>>.Я загружаю больше данных, используя кнопку в своей деятельности, и объект pagedList загружается правильно, но изменений не наблюдается.вот код моей деятельности:

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

}

и вот мой DataSource, который для простоты генерирует только случайные целые числа:

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

и это в моем сборочном билде:

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

Я продолжаю нажимать кнопку несколько раз, но только один раз это наблюдается (для времени создания).

1 Ответ

0 голосов
/ 05 мая 2018

PagedListAdapter не отражает сам измененный элемент.Другими словами, PagedList является неизменным.Вы должны вызывать invalidate() на текущем источнике данных, когда происходит обновление.Новая пара PagedList / DataSource будет создана через LivePagedListBuilder и будет передана через LiveData наблюдателям, когда текущий DataSource будет признан недействительным.

Попробуйте этот код.

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

Пожалуйста, проверьте это демонстрационное приложение.

...