有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

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

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

enter image description here

我的布局:

enter image description here

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

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

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

enter image description here

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

我必须导航到我的回收器视图中的所有故事


共 (2) 个答案

  1. # 1 楼答案

    这些更改是否有助于:

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

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

    3/

    nextView = MainActivity.linearLayoutManager.getChildAt(position);
    

    您已经知道RecyclerView是如何工作的,只需避免使用getChildAt,因为在某些情况下,您想要的子级尚未创建。基于您的代码,我认为您甚至不需要获取nextView

  2. # 2 楼答案

    正如谭惠恩所说。第一点帮助我获得线性布局中的新视图。这些景色很美

    函数getChildAt的参数中存在问题。我必须通过和以前一样的职位。因为相对而言,子视图的位置(索引)不会更改

    指数0->;故事一

    指数1->;故事2

    指数2->;故事3

    就像有故事编号1、2和3可见一样,索引0将包含第一个故事,索引1将包含第二个故事,索引2将包含第三个故事。当用户点击第三层的右键时。第四层首先可见,现在屏幕上有2、3和4可见。但第四层的索引将只保留在第三层。就像现在一样,索引将是这样的

    指数0->;故事2

    指数1->;故事3

    指数2->;故事4

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