Я использую библиотеку подкачки Android, но вместо того, чтобы получать данные по частям, я получаю полный список за один раз - PullRequest
0 голосов
/ 02 мая 2018

Класс ViewModel, внутри которого мы загружаем pagedlist, используя источник данных.

    public class RecipeListViewModel extends ViewModel {

    public LiveData<PagedList<RecipeListPojo>> mutableLiveData;

    public void init(RecipeFrom recipeFrom, RecipeDao recipeDao) {
    mutableLiveData = new 
    LivePagedListBuilder(recipeDao.getRecipeList(),10).build();
   }
   }

Это мой дао, в котором мы выбираем данные в виде фабрики источников данных.

   @Dao
   public interface RecipeDao {
   @Query("select * from recipe")
   public DataSource.Factory<Integer, RecipeListPojo> getRecipeList();
   }

Внутри моего RecipeListPojo я создал DiffCallBack.

   public static DiffUtil.ItemCallback<RecipeListPojo> diffCallback=new 
   DiffUtil.ItemCallback<RecipeListPojo>() {
   @Override
   public boolean areItemsTheSame(RecipeListPojo oldItem, RecipeListPojo 
   newItem) {
   return oldItem.getId()==newItem.getId();
   }

   @Override
   public boolean areContentsTheSame(RecipeListPojo oldItem, RecipeListPojo 
   newItem) {
   return oldItem.equals(newItem);
   }
   };

Внутри своей деятельности я получаю список с помощью наблюдателя и настраиваю свой адаптер.

  arrayListObserver=new Observer<PagedList<RecipeListPojo>>() {
  @Override
  public void onChanged(@Nullable PagedList<RecipeListPojo> recipePojos) {

  if(recipePojos!=null)
  {
  recipeAdapter.submitList(recipePojos);
  recyclerView.setAdapter(recipeAdapter);
  progressBar.setVisibility(GONE);
  }
  }
  };
  recipeFrom=new RecipeFrom.RecipeFromBuilder(fromActivity).build();
  recipeDao=GlobalApplication.recipeRoomDatabase.getRecipeDao();
  recipeListViewModel.init(recipeFrom,recipeDao);
  recipeListViewModel.mutableLiveData.observe(this,arrayListObserver);

Вот так выглядит мой адаптер.

  public class RecipeListAdapter extends 
  PagedListAdapter<RecipeListPojo,RecipeListAdapter.RecipeListHolder> {

  private LayoutInflater inflater;
  private Context context;

  public RecipeListAdapter()
  {
  super(RecipeListPojo.diffCallback);
  }

  @Override
  public RecipeListHolder onCreateViewHolder(ViewGroup parent, int viewType) 
  {

  context=parent.getContext();
  inflater=LayoutInflater.from(context);
  View rootView = inflater.inflate(R.layout.one_item_recipe_list, null, 
  false);
  return new RecipeListHolder(rootView);
  }

  @Override
  public int getItemCount() {
  return super.getItemCount();
  }
  }

Библиотека используется-

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

Ответы [ 2 ]

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

EDIT2:

показывает общее количество нет. элементов в моем списке, а не размера страниц (10), которые я определил при создании постраничного списка

Использование setEnablePlaceholders(false)


Предыдущий ответ:

Подумав об этом сам и прочитав комментарии и ответы, я обнаружил, что это связано с установленным вами конфигом. В частности, PageSize.

Если вы установите его на 1 и прокрутите его очень быстро, вы увидите заполнители, то есть все данные еще не загружены.

Из документации :

setPageSize

Определяет количество элементов, загружаемых одновременно из источника данных.

Должно быть в несколько раз больше видимых элементов на экране.

Настройка размера вашей страницы зависит от того, как загружаются ваши данные и использовал. Меньшие размеры страниц улучшают использование памяти, задержку и избегают Сб. Большие страницы обычно повышают пропускную способность точка (избегайте загрузки более 2 МБ из SQLite одновременно, так как несет дополнительные расходы).

Если вы загружаете данные для очень больших карт в стиле социальных сетей, которые занимают большую часть экрана, и ваша база данных не является узким местом, 10-20 может иметь смысл. Если вы отображаете десятки элементов в мозаичной сетке, которые могут представлять предметы во время прокрутки гораздо быстрее, рассмотрим ближе к 100.

P.S. Старайтесь не использовать setInitialLoadSizeHint, если он вам действительно не нужен, потому что он будет работать в потоке пользовательского интерфейса, даже если вы указали fetchExecutor в фоновом потоке.

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

Согласно моим исследованиям, Я наконец обнаружил, что он возвращает список размера = всего нет. элементов, но только размер pagedList * 3 будет инициализирован, а остальные элементы будут нулевыми, и они будут обновлены во время прокруткиView Recycler с помощью PagedListAdapter.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...