繁体   English   中英

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

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

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

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

在此处输入图像描述

我的布局:

在此处输入图像描述

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

就像在 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);
            }
        }
    });
}

下面的代码是 function 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);
}

问题是它只给我可见的视图。 不是rest的意见。 我尝试了自动滚动,以便下一个或上一个视图变得可见,但它似乎不起作用。 孩子的最后一个可见 position 保持不变,当我尝试在最后一个可见视图之后打开视图时,它返回一个 null 视图给我。

在此处输入图像描述

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

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

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

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

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

3/

nextView = MainActivity.linearLayoutManager.getChildAt(position);

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

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

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

索引 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作为参数传递,而应在getChildAt中传递currentPosition

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM