提问人:Urvish Patel 提问时间:9/3/2023 最后编辑:Urvish Patel 更新时间:9/3/2023 访问量:34
如何使用回收器视图作为(选项卡布局)以使用用户信息更新片段布局
How to use the recycler view as a (tab layout) to update fragment layout with user info
问:
我的目标是,当用户单击该人时,将文本颜色更改为蓝色,它将显示个人信息,并且对所有用户都是一样的。所以我正在尝试将回收器视图与单个片段一起使用。
当用户单击**按钮增量**时,它将更新回收商视图中的人数。
当用户在恭敬的人之间切换时,我想在不创建新片段的情况下显示该人的信息。
我尝试使用选项卡布局和查看页面,但所有用户的布局都是相同的,所以我认为应该有更好的方法来解决这个问题。
我应该将 viewmodle 传递到我的适配器并观察按钮点击次数吗?
这个问题有 3 个主要问题。
- 我是否应该传递视图模型来更新回收器视图数据?
- 当不同的人被点击时,我应该创建新的片段并再次应用数据,还是应该使用单视图模型来显示人员数据?
- 当用户单击“增量”按钮时如何手动单击,以及如何将数据传回以更新回收器视图中的增量计数。
[图像以达到此结果
答:
是的,一个简单的开始方法是将 1 个 viewModel 传递到适配器和片段中。
让我们从简单开始,让它只用 3 个人的数据工作。在视图模型中,您应该具有:
val person1 = mutableLiveData<Person>()
val person2 = mutableLiveData<Person>()
val person3 = mutableLiveData<Person>()
init {
person1.value = Person()
…
}
然后,如果将 viewModel 传递给适配器,则可以:
veiwModel.person1.observe { updatedPerson ->
dataset.removeAt(0)
dataset.addItemAtPosotion(updatedPerson, 0)
[email protected](0)
}
在片段中,您可以类似地观察新的实时数据片段,调用 fragmentPerson,并在该数据更改时重新初始化该片段。
评论
因此,要实现您正在寻找的完全相同的行为,您需要将 recyclerView 与 ViewPager2 一起使用。
通常,我们仅将 ViewPager2 或 ViewPager 用于选项卡布局,但我们也可以将它们用于回收器视图或任何其他行为类似于 RecyclerView 的视图。
所以问题是如何做到这一点,
让我们把它分成几个步骤,
步骤1:
创建 RecyclerView 的项和适配器
现在,将该适配器与 recyclerView(谁是 LayoutManager 线性和方向是水平的)
现在,您拥有了完全相同设计的 recyclerView,而不是选项卡
步骤2:
在 recyclerView 下方的 XML 中添加 ViewPager2 标记
为 ViewPager2 创建一个适配器,就像
class PagerAdapter extends FragmentStateAdapter {
PagerAdapter(@NonNull FragmentManager fragmentManager, @NonNull Lifecycle lifecycle) {
super(fragmentManager, lifecycle);
}
@NonNull
@Override
public Fragment createFragment(int position) {
return FragmentYouWantToOpenWhenItemOnRVSelected.newInstance();
}
@Override
public int getItemCount() {
return list.size();
}
}
现在将该 PagerAdapter 的对象创建为
PagerAdapter viewPagerAdapter = new PagerAdapter(getSupportFragmentManager(), getLifecycle());
将 pagerAdapter 与 ViewPager2 附加为
binding.viewPager.setAdapter(viewPagerAdapter);
现在,您已经完成了 RecyclerView 和 ViewPager
步骤3:
剩下的唯一事情就是从 recyclerView 和 ViceVersa 中选择项目时在 ViewPager 中打开指定的 Fragment
因此,当选择某个项目时,您的 recyclerViewAdpater(您在步骤 1 中创建的那个)必须有一个回调,即实现为
@Override
public void selectedTab(int position) {
binding.viewPager.setCurrentItem(position);
binding.viewPager.setOffscreenPageLimit(1);
binding.tabLayout.scrollToPosition(position);
adapter.setTabPosition(position);
}
在您的活动或片段中(您的 ViewPager2 和 RecyclerView 所在的位置)
现在,当 viewPager2 更改片段时,向右或向左滑动,recyclerView 也应该滚动到该项目来实现您想要的 ViewPager 设置下面的操作
public void tabSettings() {
binding.viewPager.registerOnPageChangeCallback(new ViewPager2.OnPageChangeCallback() {
@Override
public void onPageSelected(int position) {
binding.viewPager.setCurrentItem(position);
binding.viewPager.setOffscreenPageLimit(1);
int requiredPosition = globalPosition < position ? position + 1 : position - 1;
try {
binding.tabLayout.scrollToPosition(requiredPosition);
} catch (Exception e) {
binding.tabLayout.scrollToPosition(position);
}
globalPosition = position;
adapter.setTabPosition(position);
}
});
}
上面代码中命名的 tabLayout 基本上是 recyclerView,所以不要与名称混淆。
这就是您现在使用 recyclerView 而不是 TabLayout 实现 ViewPager2 的全部内容。
希望这对你有所帮助。
评论