如何在ViewPager2中预加载下一页和页面?我的应用程序在每个 ViewPager2 选项卡屏幕中使用来自 api 的列表。在用户滑动到下一页之前加载下一页是很好的用户体验。在旧的 ViewPager 上它是自动完成的
只要我使用具有两个字段的数据模型,它就可以正常工作。
但是当我尝试使用 kotlin 时。Pair 无法构建并给出 nit 信息错误:
....\DataBinderMapperImpl.java:20: error: cannot find symbol
import .....databinding.ItemCurrencyBindingImpl;
symbol: class ItemCurrencyBindingImpl
location: package ......databinding
Run Code Online (Sandbox Code Playgroud)
xml代码:
<variable
name="currency"
type="kotlin.Pair"/>
</data>
<TextView
android:layout_width="@dimen/currency_dropdown_width"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:gravity="center|start"
android:padding="@dimen/currency_dropdown_padding"
android:text="@{currency.first}"
app:drawableEnd="@{currency.second}"
app:drawableSize="@{@dimen/currency_dropdown_image_size}"
tools:text="@string/pound"/></layout>
Run Code Online (Sandbox Code Playgroud) 嘿,我想创建 BaseFragment 类,通过泛型类型获取 viewModel:
abstract class BaseFragment<B : ViewDataBinding, VM : ViewModel> : DaggerFragment() {
val viewModel by viewModels<VM> { viewModelFactory }
...
}
// Native function
@MainThread
inline fun <reified VM : ViewModel> Fragment.viewModels(
noinline ownerProducer: () -> ViewModelStoreOwner = { this },
noinline factoryProducer: (() -> Factory)? = null
) = createViewModelLazy(VM::class, { ownerProducer().viewModelStore }, factoryProducer)
Run Code Online (Sandbox Code Playgroud)
但出现错误Cannot use 'VM' as reified type parameter. Use a class instead.
有可能实现我想做的事情吗?也许用其他方法?
有没有人知道为什么constraintlayout.widget.GroupTransitionManager 的动画可见性不起作用?这个小部件不是为这些东西制作的吗?
如果在将视图与组分离后隐藏或显示项目,它会起作用
<androidx.constraintlayout.widget.Group
android:id="@+id/cardHeadersGroup"
android:layout_width="0dp"
android:layout_height="0dp"
android:visibility="invisible"
app:constraint_referenced_ids="cardSystemHeader,cardSimpleHeader,cardCombinedHeader"
app:layout_constraintBottom_toBottomOf="@+id/cardCombinedHeader"
app:layout_constraintEnd_toEndOf="@+id/cardSystemHeader"
app:layout_constraintStart_toStartOf="@+id/cardSimpleHeader"
app:layout_constraintTop_toTopOf="parent"
tools:visibility="visible"/>
Run Code Online (Sandbox Code Playgroud)
val headersGroup = binding.cardHeadersGroup
val slideIn = Slide()
slideIn.slideEdge = Gravity.BOTTOM
slideIn.mode = Slide.MODE_IN
slideIn.addTarget(headersGroup)
TransitionManager.beginDelayedTransition(binding.root as ViewGroup, slideIn)
headersGroup.visibility = VISIBLE
Run Code Online (Sandbox Code Playgroud) 有没有办法将数据变量传递给包含的布局?
父布局
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
tools:showIn="@layout/fragment_settings">
<data>
<variable
name="viewModel"
type="......settings.SettingsFragmentViewModel" />
</data>
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/content"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:animateLayoutChanges="true"
android:overScrollMode="never"
android:padding="@dimen/spacing_default">
<include
android:id="@+id/main"
layout="@layout/layout_settings_main" />
</androidx.constraintlayout.widget.ConstraintLayout>
Run Code Online (Sandbox Code Playgroud)
并希望在包含的布局中包含 viewModel
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
tools:showIn="@layout/fragment_settings">
<data>
<variable
name="viewModel"
type="......settings.SettingsFragmentViewModel" />
</data>
<merge>
...........
Run Code Online (Sandbox Code Playgroud)
还是只有在这样设置时才可能:
binding = FragmentSettingsBinding.inflate(inflater, container, false).apply {
lifecycleOwner = this@SettingsFragment
viewModel = this@SettingsFragment.viewModel
main.viewModel = this@SettingsFragment.viewModel
}
Run Code Online (Sandbox Code Playgroud) 在build.gradle文件中:
dataBinding {
enabled = true
}
Run Code Online (Sandbox Code Playgroud)
enabled已弃用。找不到任何关于它的文档。任何人有任何想法如何解决它?