如何获取当前在回收视图的线性布局中不可见的视图

How to get the views which are not visible currently in the linear layout of the recycler view

我正在设计一个 Instagram 故事类型模板。我被困在一个非常奇怪的问题上。我在主要 activity.

中使用了回收站视图

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

我的布局:

然后我设计了一个自定义适配器,在布局中我使用了 linearLayout。单击每个视图时,它会打开一个新的 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,单击任何视图(故事)或单击左右按钮的代码相同。基本上我只是打开了另一个 activity 通过传递一个意图和我分别点击右边或左边时获得的下一个或上一个视图。

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);
}

问题是它只给我可见的视图。不是其余的意见。我尝试了自动滚动以便下一个或上一个视图变得可见,但它似乎不起作用。 child 的最后一个可见位置保持不变,当我尝试在最后一个可见视图之后打开视图时,它 return 对我来说是一个空视图。

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

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

做这些改变可能会有帮助:

1/ 我认为你应该使用 ViewPager。它会自动捕捉到没有 scrollTo 索引的项目。或者在 SnapHelper

的帮助下继续使用 RecyclerView

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

3/

nextView = MainActivity.linearLayoutManager.getChildAt(position);

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

正如 Tam Huynh 所说。第一点帮助我获得了线性布局中的新视图。这些观点很好。

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

索引 0 -> 故事编号 1

索引 1 -> 故事编号 2

索引 2 -> 故事编号 3

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

索引 0 -> 故事编号 2

索引 1 -> 故事编号 3

索引 2 -> 故事编号 4

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