【问题标题】:How to get the views which are not visible currently in the linear layout of the recycler view如何在回收站视图的线性布局中获取当前不可见的视图
【发布时间】:2021-05-16 14:41:25
【问题描述】:

我正在设计一个 Instagram 故事类型模板。我陷入了一个非常奇怪的问题。我在主要活动中使用了回收站视图。

MainActivity:(这只是显示的布局。我已将方向更改为水平)。

我的布局:

然后我设计了一个自定义适配器,并在布局中使用了线性布局。当点击每个视图时,它会打开一个显示整个故事内容的新 Activity。

就像在 Instagram 中,当用户打开任何故事时,用户可以点击屏幕右侧进入下一个故事,或点击屏幕左侧进入上一个故事。我试图实现同样的功能。开启剧情成功实施。当我在屏幕上添加右击和左击的功能时,问题就来了。我添加了两个按钮;一个在右边,一个在左边。问题是,如果当前有 3 个视图可见,那么我只能在这些故事之间导航,而不能导航到由于回收站视图而在屏幕上不可见的故事。

下面的代码是左右点击的代码

leftArrow = findViewById(R.id.leftArrow);
    leftArrow.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if(myAdapter.currentPosition - 1 >= 0) {
                int firstVis = MainActivity.linearLayoutManager.findFirstVisibleItemPosition();
                MainActivity.linearLayoutManager.scrollToPosition(firstVis - 1);
                rightOrLeftClicks(myAdapter.currentPosition - 1);
            }
        }
    });

    rightArrow = findViewById(R.id.rightArrow);
    rightArrow.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if(myAdapter.currentPosition + 1 < myAdapter.localDataSet.length) {
                int lastVis = MainActivity.linearLayoutManager.findLastVisibleItemPosition();
                MainActivity.linearLayoutManager.scrollToPosition(lastVis + 1);
                rightOrLeftClicks(myAdapter.currentPosition + 1);
            }
        }
    });
}

下面的代码是函数rightOrLeftClicks

public void rightOrLeftClicks(int position) {
    finish();
    Log.d("rl", "working");
    nextView = MainActivity.linearLayoutManager.getChildAt(position);
    Log.d("ll", "The last element is " + MainActivity.linearLayoutManager.findLastVisibleItemPosition());
    if(nextView != null)myAdapter.onClickView(position, myAdapter.localDataSet[position].symptom, nextView);
}

以下代码用于onClickView,与单击任何视图(故事)或单击左右按钮的代码相同。基本上我只是通过传递一个意图来打开另一个活动,其中包含我分别单击右侧或左侧时获得的下一个或上一个视图。

public static void onClickView(int position, String element, View v) {
    Intent intent = new Intent(v.getContext(), MainActivity2.class);
    idPosition = "";
    idPosition = element;
    ArrayList<String> passingContent = new ArrayList<>();
    currentPosition = position;
    passingContent.add(localDataSet[position].description);
    passingContent.add(localDataSet[position].imageUrl);
    intent.putExtra(element + "", passingContent);
    v.getContext().startActivity(intent);
}

问题是它只给我可见的视图。不是其余的观点。我尝试了自动滚动,以便下一个或上一个视图变得可见,但它似乎不起作用。孩子的最后一个可见位置保持不变,当我尝试在最后一个可见视图之后打开视图时,它会向我返回一个空视图。

假设有 5 个故事。然后我会在屏幕上看到只有 3 个故事,其余的可以通过滚动看到。当我点击任何故事时。我只能在 1,2 和 3 之间导航。当我尝试从故事 3 中单击以查看故事 4 时。当前故事被 finish() 函数杀死,nullnextView 变量中返回,因为其中故事 4 未加载,我返回到 MainActivity。

我必须导航到我的回收站视图中显示的所有故事。

【问题讨论】:

    标签: java android android-recyclerview android-linearlayout linearlayoutmanager


    【解决方案1】:

    这些改变是否有帮助:

    1/ 我认为你应该使用ViewPager。它会自动捕捉到项目而无需滚动到索引。或者在SnapHelper的帮助下继续使用RecyclerView

    2/ 修改onClickView 方法不是静态的,不需要View v 工作。我看到你只需要View v 就可以了。为什么不直接将context 传递给该方法。使用这样的参数是不合适的,这种方法会使您陷入 3/ 问题。

    3/

    nextView = MainActivity.linearLayoutManager.getChildAt(position);
    

    你已经知道 RecyclerView 是如何工作的,只是避免使用getChildAt,因为在某些情况下,你想要的孩子还没有被创建。根据您的代码,我认为您甚至不需要获取nextView

    【讨论】:

    • 我从 1/ 开始进行了更改,但我无法弄清楚如何解决 2/ 和 3/ 请多解释一下。特别是第三点。
    • 谢谢,我已经找到解决方案了。您的第 1 点很有帮助。
    【解决方案2】:

    正如 Tam Huynh 所说。第一点帮助我在线性布局中获得新视图。视图运行良好。

    函数getChildAt的参数有问题。我必须通过与以前相同的位置。因为子视图的位置(索引)相对不会改变。

    索引 0 -> 故事编号 1

    索引 1 -> 故事编号 2

    索引 2 -> 故事编号 3

    就像如果有可见的故事编号 1,2 和 3,索引 0 将包含第 1 个故事,索引 1 将包含第 2 个故事,索引 2 将包含第 3 个故事。当用户单击第三个故事的右键时。第 4 个故事首先可见,现在屏幕有 2,3 和 4 可见。但第 4 层的索引将仅保持在第 3 层。现在索引就像

    索引 0 -> 故事编号 2

    索引 1 -> 故事编号 3

    索引 2 -> 故事编号 4

    因此,不应将position 作为参数传递,而应将currentPosition 传递给getChildAt

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-12-21
      • 1970-01-01
      • 1970-01-01
      • 2022-01-03
      • 2020-12-12
      • 1970-01-01
      • 2016-02-14
      相关资源
      最近更新 更多