如何使用回收器视图作为(选项卡布局)以使用用户信息更新片段布局

How to use the recycler view as a (tab layout) to update fragment layout with user info

提问人:Urvish Patel 提问时间:9/3/2023 最后编辑:Urvish Patel 更新时间:9/3/2023 访问量:34

问:

我想实现这个

我的目标是,当用户单击该人时,将文本颜色更改为蓝色,它将显示个人信息,并且对所有用户都是一样的。所以我正在尝试将回收器视图与单个片段一起使用。

当用户单击**按钮增量**时,它将更新回收商视图中的人数。

当用户在恭敬的人之间切换时,我想在不创建新片段的情况下显示该人的信息。

我尝试使用选项卡布局和查看页面,但所有用户的布局都是相同的,所以我认为应该有更好的方法来解决这个问题。

我应该将 viewmodle 传递到我的适配器并观察按钮点击次数吗?

这个问题有 3 个主要问题。

  1. 我是否应该传递视图模型来更新回收器视图数据?
  2. 当不同的人被点击时,我应该创建新的片段并再次应用数据,还是应该使用单视图模型来显示人员数据?
  3. 当用户单击“增量”按钮时如何手动单击,以及如何将数据传回以更新回收器视图中的增量计数。

[图像以达到此结果

Kotlin Android-RecyclerView OnClickListener Android-ViewModel

评论

0赞 Urvish Patel 11/1/2023
我能够通过使用实时数据在不同的乘客之间导航来实现这一点,一旦我选择了当前乘客,它就会更新有关该实时数据的姓名和信息,因为实时数据是它的生命周期,它是事件驱动的,因此它可以帮助我们同步所有其他数据。

答:

0赞 ryankuck 9/3/2023 #1

是的,一个简单的开始方法是将 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,并在该数据更改时重新初始化该片段。

评论

0赞 ryankuck 9/4/2023
如果您有任何疑问,请告诉我,或者如果它适合您,请点赞/接受
0赞 Talha Chaudhry 9/3/2023 #2

因此,要实现您正在寻找的完全相同的行为,您需要将 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 的全部内容。

希望这对你有所帮助。

评论

0赞 Urvish Patel 9/3/2023
如果我有一个片段,对所有选项卡显示相同的内容,这仍然有用吗?
0赞 Talha Chaudhry 9/4/2023
是的,您可以在 PagerAdapter 中始终返回相同的片段(注意:它可以始终是相同或新的片段实例)