Библиотека подкачки Android с привязкой данныхAndroid

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Библиотека подкачки Android с привязкой данных

Сообщение Anonymous »

Я попробовал реализовать библиотеку подкачки Android с привязкой данных.
Я не могу реализовать ее с помощью существующих общедоступных источников.
Можно ли использовать библиотеку подкачки с привязкой данных и адаптером привязки?

Проект на Github:
https://github.com/DoomMortal/paging

Может ли кто-нибудь изучить это? ?
Будем благодарны за любую помощь.

Мой адаптер:

class OverviewAdapter(val onClickListener: OnClickListener) : PagedListAdapter(DiffCallback) {

class ViewHolder private constructor(private var binding: OverviewItemBinding) : RecyclerView.ViewHolder(binding.root) {

fun bind(clickListener: OnClickListener, videoProperty: VideoProperty){
binding.property = videoProperty
binding.clickListener = clickListener
binding.executePendingBindings()
}

companion object {
fun from(parent: ViewGroup): ViewHolder {
val layoutInflater = LayoutInflater.from(parent.context)
val binding = OverviewItemBinding.inflate(layoutInflater, parent, false)

return ViewHolder(binding)
}
}

}

companion object DiffCallback : DiffUtil.ItemCallback() {
override fun areItemsTheSame(oldItem: VideoProperty, newItem: VideoProperty): Boolean {
return oldItem === newItem
}

override fun areContentsTheSame(oldItem: VideoProperty, newItem: VideoProperty): Boolean {
return oldItem.videoTableId == newItem.videoTableId
}
}

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
return ViewHolder.from(parent)
}

override fun onBindViewHolder(holder: ViewHolder, position: Int) {

when (holder) {
is ViewHolder -> {
val nightItem = getItem(position) as VideoProperty
holder.bind(onClickListener, nightItem)
}
}

}

class OnClickListener(val clicklistener: (videoProperty: VideoProperty) -> Unit) {
fun onClick(videoProperty: VideoProperty) = clicklistener(videoProperty)
}

}


ViewModel:

enum class MarsApiStatus { LOADING, ERROR, DONE }

class OverviewViewModel : ViewModel() {

private val TAG = "OverviewViewModel"

private var executor: Executor? = null

// The internal MutableLiveData String that stores the status of the most recent request
private val _status = MutableLiveData()

// The external immutable LiveData for the request status String
val status: LiveData
get() = _status

private val _properties = MutableLiveData()

val properties: LiveData
get() = _properties

private val _navigateToSelectedProperty = MutableLiveData()
val navigateToSelectedProperty: LiveData
get() = _navigateToSelectedProperty

private var viewModelJob = Job()
private val coroutineScope = CoroutineScope(viewModelJob + Dispatchers.Main)

//val itemPagedList: LiveData
>

var itemPagedList: LiveData
var liveDataSource: LiveData? = null

/**
* Call getMarsRealEstateProperties() on init so we can display status immediately.
*/
init {
//getMarsRealEstateProperties(VideosOverviewApiFilter.SHOW_POOP)

executor = Executors.newFixedThreadPool(5)

val feedDataFactory = ItemDataSourceFactory()

val pagedListConfig = PagedList.Config.Builder()
.setEnablePlaceholders(false)
.setPageSize(ItemVideosDataSource.PAGE_SIZE)
.build()

/*_properties.value = LivePagedListBuilder(feedDataFactory, pagedListConfig)
.build()*/

liveDataSource = feedDataFactory.getItemLiveDataSource()
itemPagedList = LivePagedListBuilder(feedDataFactory, pagedListConfig).build()

}

/**
* Sets the value of the status LiveData to the VideosOverview API status.
*/
private fun getMarsRealEstateProperties(filter: VideosOverviewApiFilter, page: Long) {

coroutineScope.launch {
//val getPropertiesDeferred =
try{
_status.value = MarsApiStatus.LOADING
val listResult = VideosOverviewApi.retrofitService.getProperties(filter.value, page)

Log.d("CONTENT: ", filter.value.toString())
Log.d("CONTENT: ", page.toString())
Log.d("CONTENT: ", listResult.items[0].toString())

_status.value = MarsApiStatus.DONE
if (listResult.items.size > 0) {
_properties.value = listResult
}
} catch (e: Throwable){
Log.d(TAG, e.toString())
_status.value = MarsApiStatus.ERROR
//_properties.value = ArrayList() OLD
}

}

}

override fun onCleared() {
super.onCleared()
viewModelJob.cancel()
}

fun displayPropertyDetails(marsProperty: VideoProperty) {
_navigateToSelectedProperty.value = marsProperty
}

fun displayPropertyDetailsComplete() {
_navigateToSelectedProperty.value = null
}

fun updateFilter(filter: VideosOverviewApiFilter, page: Long){
getMarsRealEstateProperties(filter, page)
}
}


Источник данных:

class ItemVideosDataSource : PageKeyedDataSource() {

companion object {
val FIRST_PAGE: Long = 1
val PAGE_SIZE: Int = 50
}

private val TAG = "ItemVideosDataSource"

private var viewModelJob = Job()
private val coroutineScope = CoroutineScope(viewModelJob + Dispatchers.Main)

override fun loadInitial(params: LoadInitialParams, callback: LoadInitialCallback) {
//videos.retrofitService.getProperties(FIRST_PAGE)

coroutineScope.launch {
//val getPropertiesDeferred =

try{
val listResult = VideosOverviewApi.retrofitService.getProperties(1, FIRST_PAGE)

val lest : MutableList? = null
lest!!.add(listResult)

if (listResult.items.size > 0) {
callback.onResult(lest, null, FIRST_PAGE + 1)
//_properties.value = listResult
}
} catch (e: Throwable){
Log.d(TAG, e.toString())
}

}

}

override fun loadBefore(params: LoadParams, callback: LoadCallback) {

coroutineScope.launch {
//val getPropertiesDeferred =

try{
val listResult = VideosOverviewApi.retrofitService.getProperties(1, FIRST_PAGE)

val lest : MutableList? = null
lest!!.add(listResult)

if (listResult.items.size > 0) {

val key: Long? = if(params.key > 1) params.key - 1 else null

callback.onResult(lest, key)
//_properties.value = listResult
}
} catch (e: Throwable){
Log.d(TAG, e.toString())
}

}
}

override fun loadAfter(params: LoadParams, callback: LoadCallback) {

coroutineScope.launch {
//val getPropertiesDeferred =

try{
val listResult = VideosOverviewApi.retrofitService.getProperties(1, FIRST_PAGE)

val lest : MutableList? = null
lest!!.add(listResult)

if (listResult.items.size > 0) {

val key: Long? = if(params.key > 1) params.key + 1 else null

callback.onResult(lest, key)
//_properties.value = listResult
}
} catch (e: Throwable){
Log.d(TAG, e.toString())
}

}

}

}


Фабричный метод:

class ItemDataSourceFactory : DataSource.Factory() {

//val sourceLiveData = MutableLiveData()
private val itemLiveDataSource = MutableLiveData
>()

override fun create(): DataSource {

//getting our data source object
val itemDataSource = ItemVideosDataSource()

//posting the datasource to get the values
//itemLiveDataSource.postValue(itemDataSource)

//returning the datasource
return itemDataSource

}

fun getItemLiveDataSource(): MutableLiveData {
return itemLiveDataSource
}

}


Макет:




Адаптер для привязки

@BindingAdapter("listData")
fun bindRecyclerView(recyclerView: RecyclerView, data: PagedList?){
//fun bindRecyclerView(recyclerView: RecyclerView, data: List?){
val adapter = recyclerView.adapter as OverviewAdapter
adapter.submitList(data)
}


Подробнее здесь: https://stackoverflow.com/questions/568 ... atabinding
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»