- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我尝试使用数据绑定(bind)实现 Android 分页库。我无法使用公共(public)现有资源来实现它。是否可以将分页库与数据绑定(bind)和绑定(bind)适配器一起使用?
Github 上的项目: https://github.com/DoomMortal/paging
有人能调查一下吗?任何帮助将不胜感激。
我的适配器:
class OverviewAdapter(val onClickListener: OnClickListener) : PagedListAdapter<VideoProperty, OverviewAdapter.ViewHolder>(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<VideoProperty>() {
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)
}
}
View 模型:
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<MarsApiStatus>()
// The external immutable LiveData for the request status String
val status: LiveData<MarsApiStatus>
get() = _status
private val _properties = MutableLiveData<VideosOverview>()
val properties: LiveData<VideosOverview>
get() = _properties
private val _navigateToSelectedProperty = MutableLiveData<VideoProperty>()
val navigateToSelectedProperty: LiveData<VideoProperty>
get() = _navigateToSelectedProperty
private var viewModelJob = Job()
private val coroutineScope = CoroutineScope(viewModelJob + Dispatchers.Main)
//val itemPagedList: LiveData<PagedList<VideosOverview>>
var itemPagedList: LiveData<PagedList<VideosOverview>>
var liveDataSource: LiveData<PageKeyedDataSource<Int, VideosOverview>>? = 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<Long, VideosOverview>() {
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<Long>, callback: LoadInitialCallback<Long, VideosOverview>) {
//videos.retrofitService.getProperties(FIRST_PAGE)
coroutineScope.launch {
//val getPropertiesDeferred =
try{
val listResult = VideosOverviewApi.retrofitService.getProperties(1, FIRST_PAGE)
val lest : MutableList<VideosOverview>? = 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<Long>, callback: LoadCallback<Long, VideosOverview>) {
coroutineScope.launch {
//val getPropertiesDeferred =
try{
val listResult = VideosOverviewApi.retrofitService.getProperties(1, FIRST_PAGE)
val lest : MutableList<VideosOverview>? = 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<Long>, callback: LoadCallback<Long, VideosOverview>) {
coroutineScope.launch {
//val getPropertiesDeferred =
try{
val listResult = VideosOverviewApi.retrofitService.getProperties(1, FIRST_PAGE)
val lest : MutableList<VideosOverview>? = 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<Long, VideosOverview>() {
//val sourceLiveData = MutableLiveData<ItemVideosDataSource>()
private val itemLiveDataSource = MutableLiveData<PageKeyedDataSource<Int, VideosOverview>>()
override fun create(): DataSource<Long, VideosOverview> {
//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<PageKeyedDataSource<Int, VideosOverview>> {
return itemLiveDataSource
}
}
布局:
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recycler_overview"
android:layout_width="0dp"
android:layout_height="0dp"
android:clipToPadding="false"
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintHorizontal_bias="1.0"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.0"
app:listData="@{viewModel.itemPagedList}"
tools:listitem="@layout/overview_item" />
绑定(bind)适配器
@BindingAdapter("listData")
fun bindRecyclerView(recyclerView: RecyclerView, data: PagedList<VideoProperty>?){
//fun bindRecyclerView(recyclerView: RecyclerView, data: List<VideoProperty>?){
val adapter = recyclerView.adapter as OverviewAdapter
adapter.submitList(data)
}
最佳答案
以防万一另一种解决方案,我使用了这个例子并工作
https://github.com/sharmadhiraj/AndroidPagingLibraryStepByStepImplementationGuide
关于具有数据绑定(bind)的 Android 分页库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56877507/
我不知道该怎么做... function f1() { var x = 10; function f2(fx) { var x; x = 6;
早期绑定(bind)和后期绑定(bind)有什么区别? 最佳答案 简短的回答是,早期(或静态)绑定(bind)是指编译时绑定(bind),后期(或动态)绑定(bind)是指运行时绑定(bind)(例如
如何在 SwiftUI View 上使用 Binding(get: { }, set: { }) 自定义绑定(bind)与 @Binding 属性。我已成功使用此自定义绑定(bind)与 @State
我经常发现自己遇到问题,即控件的两个(相关)值被更新,并且两者都会触发昂贵的操作,或者控件可能会暂时处于不一致的状态。 例如,考虑一个数据绑定(bind),其中两个值 (x,y) 相互减去,最终结果用
我想通过我的 ViewModel 控制我的一个窗口的高度和宽度。 这看起来很简单。 但没有。它不起作用。 它检查 ViewModel 的 Width但不是 Height . 奇怪的是,如果我切换 W
UI5中一次性绑定(bind)和单向绑定(bind)有什么区别? 是否有任何用户特定的用例我会使用它们? 我无法从文档中获得太多信息。 最佳答案 单程 它的作用:单向数据流。模型数据的变化(例如通过
(define make (lambda (x) (lambda (y) (cons x (list y))))) (let ((x 7) (p (make 4))) (cons
尽管我或多或少地了解什么是语言绑定(bind),但我很难理解它们是如何工作的。 例如,谁能解释一下如何为 WinAPI 制作 Java 绑定(bind)? 最佳答案 如果您搜索 Foreign Fun
谁能解释为什么我可以重新绑定(bind)列表但不能+? (binding [list vector] (list 1 3)) (binding [list +] (list 1 3)) (bi
我真的很喜欢 Caliburn 和命名约定绑定(bind),我很惊讶 可见性与“CanNAME”约定用于保护 Action 的方式不同。 据我所知, BooleanToVisibilityConver
我了解动态绑定(bind)的实现方式以及静态绑定(bind)和动态绑定(bind)之间的区别,但我只是无法理解动态绑定(bind)的定义。基本上它是一种运行时绑定(bind)类型。 最佳答案 基本上,
http://jsfiddle.net/3NRsd/ var foo = $("div").bind("click", function() { $("div").animate({"hei
这个问题我快疯了...我有一个用户控件,它有一个用于插入操作的 FormView 和一个用于所有其他操作的 GridView。 在这两个控件中,我都有一个 DropDownList,如下所示: '
我有一个绑定(bind)到 ListBox 的地址的 ObservableCollection。然后在 ItemTemplate 中,我使用 {Binding .} 绑定(bind)到当前地址记录。这
如果我有以下简单的 js/knockout 代码: .js( View 模型): var image = ko.observable('http://placehold.it/300x150'); 看
我正在 aurelia 上开发一个自定义属性,让用户在输入文本区域时从列表中进行选择。例如,用法将是这样的: 正如您可能注意到的,auto-complete是属性。现在,当我想显示提示时,我想在自定
我正在使用 EventEmitter2作为我的应用程序内部的消息总线。现在我需要绑定(bind)和取消绑定(bind)一些事件处理程序。因为我也希望他们bind将它们添加到给定的上下文中,我最终得到以
我有以下函数调用: $(".selector").on("click", callback.bind(this, param1, param2)); 在我的回调函数中,我想使用绑定(bind)的 th
我目前正在试验新的编译绑定(bind),并且(再次)达到了我在拼图中遗漏了一个小问题:为什么我必须调用 Bindings.Update?直到现在,我还认为实现 INotifyPropertyChang
我正在阅读一本关于编写 JavaScript 框架的书,并找到了这段代码。但是我不明白它是如何工作的,尤其是 bind.bind 的用法?有人知道吗? var bind = Function.prot
我是一名优秀的程序员,十分优秀!