Google Android - это несложно

Добро пожаловать на форум сайта startandroid.ru
Текущее время: 21 май 2019, 04:12

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 4 ] 
Автор Сообщение
 Заголовок сообщения: Урок 14. Paging Library. Основы
СообщениеДобавлено: 20 мар 2018, 02:08 
Администратор
Аватар пользователя

Зарегистрирован: 07 янв 2012, 11:32
Сообщений: 1400
Благодарил (а): 0 раз.
Поблагодарили: 75 раз.

В этом уроке начнем знакомство с Paging Library. Рассмотрим общую схему работы связки PagedList и DataSource. 




Click here to read this article!

_________________
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение


Последний раз редактировалось damager82 25 июн 2018, 12:51, всего редактировалось 18 раз(а).

Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Урок 14. Paging Library. Основы
СообщениеДобавлено: 20 июл 2018, 21:59 

Зарегистрирован: 29 мар 2013, 10:15
Сообщений: 15
Благодарил (а): 0 раз.
Поблагодарили: 1 раз.
Некоторые уточнения, ссылка

Цитата:
API changes to clarify the role of executors in builders:

Renamed setBackgroundThreadExecutor() to setFetchExecutor() (in PagedList.Builder and LivePagedListBuilder)

Renamed setMainThreadExecutor() to setNotifyExecutor() (in PagedList.Builder).

Fixed PagedList.mCallbacks member to be private.


Поэтому код для pageList немного изменился

Код: [ Загрузить ] [ Скрыть ]
  1.   PagedList<Client> pagedList = new PagedList.Builder<>(dataSource, config) 
  2.                 .setFetchExecutor(Executors.newSingleThreadExecutor()) 
  3.                 .setNotifyExecutor(new MainThreadExecutor()) 
  4.                 .build(); 


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Урок 14. Paging Library. Основы
СообщениеДобавлено: 10 мар 2019, 19:32 

Зарегистрирован: 23 янв 2019, 09:08
Сообщений: 2
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Почему может не вызываться получение следующей порции данных?

Сделал, вроде, все по примеру. Начальные 30 записей появляются, а вот следующие нет.

Активити
Код: [ Загрузить ] [ Скрыть ]
  1. public class MainActivity extends AppCompatActivity { 
  2.  
  3.     final private InfoAdapter adapter = new InfoAdapter(new InfoDiffer()); 
  4.  
  5.     final private PagedList.Config config = new PagedList.Config.Builder() 
  6.             .setEnablePlaceholders(false) 
  7.             .setPageSize(10) 
  8.             .build(); 
  9.  
  10.     private final InfoStorage storage = new InfoStorage(); 
  11.     private InfoDataSource dataSource = new InfoDataSource(storage); 
  12.     private PagedList<Info> pageList = new PagedList.Builder<>(dataSource, config) 
  13.             .setFetchExecutor(Executors.newSingleThreadExecutor()) 
  14.             .setNotifyExecutor(new MainThreadExecutor()) 
  15.             .build(); 
  16.  
  17.     @Override 
  18.     protected void onCreate(@Nullable Bundle savedInstanceState) { 
  19.         super.onCreate(savedInstanceState); 
  20.         setContentView(R.layout.activity_main); 
  21.  
  22.         final RecyclerView rvMain = findViewById(R.id.rv_main); 
  23.         rvMain.setLayoutManager(new LinearLayoutManager(this)); 
  24.  
  25.         adapter.submitList(pageList); 
  26.         rvMain.setAdapter(adapter); 
  27.     } 
  28.  
  29.     class MainThreadExecutor implements Executor { 
  30.         private final Handler handler = new Handler(Looper.getMainLooper()); 
  31.  
  32.         @Override 
  33.         public void execute(@NonNull Runnable command) { 
  34.             handler.post(command); 
  35.         } 
  36.     } 


Все что касается данных:
Код: [ Загрузить ] [ Скрыть ]
  1. data class Info(val id: Int, val name: String) { 
  2.     override fun toString() = "$id - $name" 
  3.  
  4. class InfoDiffer: DiffUtil.ItemCallback<Info>() { 
  5.  
  6.     override fun areItemsTheSame(oldItem: Info?, newItem: Info?): Boolean = oldItem?.id == newItem?.id 
  7.  
  8.     override fun areContentsTheSame(oldItem: Info?, newItem: Info?) = oldItem == newItem 
  9.  
  10.  
  11. class InfoDataSource(private val storage: InfoStorage): PositionalDataSource<Info>() { 
  12.  
  13.     override fun loadInitial(params: LoadInitialParams, callback: LoadInitialCallback<Info>) { 
  14.         Log.d("INSPECT", "loadInitial, requestedStartPosition = ${params.requestedStartPosition}, requestedLoadSize = ${params.requestedLoadSize}") 
  15.         val result = storage.getData(params.requestedStartPosition, params.requestedLoadSize) 
  16.         callback.onResult(result, params.requestedStartPosition) 
  17.     } 
  18.  
  19.     override fun loadRange(params: LoadRangeParams, callback: LoadRangeCallback<Info>) { 
  20.         Log.d("INSPECT", "loadRange, startPosition = ${params.startPosition}, loadSize = ${params.loadSize}") 
  21.         val result = storage.getData(params.startPosition, params.loadSize) 
  22.         callback.onResult(result) 
  23.     } 
  24.  
  25. class InfoStorage { 
  26.     fun getData(startPosition: Int, loadSize: Int): MutableList<Info> { 
  27.         val endPos = minOf(startPosition + loadSize - 1, 100) 
  28.         return (startPosition..endPos).map { Info(it + 1, "Info num ${it + 1}") } as MutableList<Info> 
  29.     } 


Адаптер и вьюхолдер:
Код: [ Загрузить ] [ Скрыть ]
  1. class InfoAdapter(itemDiffer: DiffUtil.ItemCallback<Info>) : PagedListAdapter<Info, InfoVH>(itemDiffer) { 
  2.     override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): InfoVH { 
  3.         val view = LayoutInflater.from(parent.context).inflate(R.layout.item, parent, false) 
  4.         return InfoVH(view) 
  5.     } 
  6.  
  7.     override fun onBindViewHolder(holder: InfoVH, position: Int) { 
  8.         currentList?.get(position)?.also { holder.bind(it) } 
  9.     } 
  10.  
  11.  
  12. class InfoVH(itemView: View) : RecyclerView.ViewHolder(itemView) { 
  13.     fun bind(item: Info) { 
  14.         (itemView as TextView).text = item.toString() 
  15.     } 


проблема решена:

Для того чтобы все работало обязательно надо вызывать метод getItem(position) вместо других способов получения значения по индексу, например currentList?.get(position)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Урок 14. Paging Library. Основы
СообщениеДобавлено: 19 мар 2019, 14:32 

Зарегистрирован: 19 мар 2019, 14:28
Сообщений: 1
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
А где-то можно посмотреть полный код урока?


Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 4 ] 

Часовой пояс: UTC + 3 часа


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
cron
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB