android - 使用片段管理器时的数据绑定
问题描述
我最近开始学习 Android 中的数据绑定,我了解了基础知识,但是当我尝试进行一些更复杂的数据绑定时,例如使用 viewpager 适配器(使用片段管理器)进行视图寻呼机的数据绑定时,我并不完全了解如何使用视图的片段管理器(在我的情况下这是一个片段,我使用子片段管理器)。我发现了一些不完整的示例和解决方案,但似乎没有任何效果。
这是我到目前为止的代码:
首页片段
class HomeFragment : Fragment() { lateinit var binding : FragmentHomeBinding lateinit var viewModel : HomeViewModel lateinit var viewPager : ViewPager lateinit var tabs : TabLayout override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { binding = DataBindingUtil.inflate(inflater, R.layout.fragment_home, container, false) val view = binding.root viewModel = ViewModelProviders.of(this).get(HomeViewModel::class.java) setupViews(view) return view } fun setupViews(view : View){ tabs = view.findViewById(R.id.tabs) viewPager = view.findViewById(R.id.pager) val childFragmentManager = childFragmentManager viewPager.addOnPageChangeListener(TabLayout.TabLayoutOnPageChangeListener(tabs)) tabs.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener { override fun onTabSelected(tab: TabLayout.Tab) { viewPager.currentItem = tab.position } override fun onTabUnselected(tab: TabLayout.Tab) { } override fun onTabReselected(tab: TabLayout.Tab) { } }) }
}
home_fragment.xml
<data> <variable name="fm" type="androidx.fragment.app.FragmentManager" /> <variable name="viewModel" type=".HomeViewModel" /> <variable name="adapter" type=".HomeViewPagerAdapter" /> </data> <androidx.constraintlayout.widget.ConstraintLayout android:layout_width="match_parent" android:layout_height="match_parent"> <com.google.android.material.tabs.TabLayout android:id="@+id/tabs" android:layout_width="match_parent" android:layout_height="wrap_content" app:tabMaxWidth="0dp" app:setupWithViewPager="@{pager}" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" > <com.google.android.material.tabs.TabItem android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/upcoming_tab"/> <com.google.android.material.tabs.TabItem android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/synced_items_tab"/> </com.google.android.material.tabs.TabLayout> <androidx.viewpager.widget.ViewPager android:id="@+id/pager" android:layout_width="match_parent" android:layout_height="0dp" app:adapter="@{adapter(fm)}" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/tabs" /> </androidx.constraintlayout.widget.ConstraintLayout>
主页查看模型
类 HomeViewModel:ViewModel(){
@BindingAdapter("adapter") fun setAdapter(pager: ViewPager, fm: FragmentManager) { pager.adapter = HomeViewPagerAdapter(pager.context,fm) }
}
解决方案
我将尝试提供另一种方式来归档您正在查找的内容,同时给出一些简短的解释。我希望最终你能从中受益。
在你<data>
离开的时候只有 theViewModel
和 theAdapter
<data>
<variable
name="viewModel"
type=".HomeViewModel" />
<variable
name="adapter"
type=".HomeViewPagerAdapter" />
</data>
<variable .../>
需要设置这些值。您可以使用binding
变量来执行此操作,例如:
# inside onCreate
binding.viewModel = viewModel
binding.adapter = HomeViewPager(context, fm)
ViewModel 不应该负责创建适配器,甚至更不了解上下文或片段管理器等 Android 组件,尽量使其依赖项与 Fragment/Activity 的细节保持最低限度。如果这是它目前正在做的唯一事情,您可以安全地摆脱它。
现在,@BindingAdapter
我建议你把它放在里面,反对并用@JvmStatic
. 你可以把它写在一个单独的类中,然后把你所有@BindingAdapters
的都放在里面:
object BindingAdapters {
@JvmStatic
@BindingAdapter("adapter")
fun ViewPager.bindAdapter(adapter: HomeViewPagerAdapter) {
this.adapter = adapter
}
}
这样您ViewPager
的 ' 适配器将被自动设置。
但是,我认为这不值得。您已经ViewPager
在片段中引用了 ,您可以在adapter
那里设置。
推荐阅读
- eclipse-cdt - Eclipse CDT - 提供每个文件构建设置的哪个扩展点?
- c++ - CMake:如何使 add_custom_command 默认输出最新?
- paypal - 有什么方法可以代表客户添加跟踪信息?
- php - 将实时网站运行到本地主机 - magento 1.9.1.3
- c# - 将子属性失败添加到子项
- php - Microsoft Azure for MySQL 无法使用 PHP 连接到数据库
- python - 如何通过执行python脚本从exe中检索返回值
- ansible - Ansible 剧本 json_query
- javascript - 如何在firebase中验证密码?(不是用户凭据)
- css - 如何使用 @use 在 main.scss 中导入 .scss 模块