java如何获取当前在回收器视图的线性布局中不可见的视图
我在设计Instagram故事类型模板。我陷入了一个非常奇怪的问题。我在主要活动中使用了recycler视图
主要活动:(这只是显示的布局。我已将方向更改为水平)
我的布局:
然后,我设计了一个自定义适配器,并在布局中使用了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);
}
问题是它只给我可见的视图。而不是其他的观点。我尝试了自动滚动,以便下一个或上一个视图可见,但它似乎不起作用。子对象的最后一个可见位置保持不变,当我尝试在最后一个可见视图之后打开视图时,它会向我返回一个空视图
假设有5层。然后我将在屏幕上只看到3个故事,其余的可以通过滚动看到。当我点击任何故事时。我只能在1、2和3之间导航。当我尝试从故事3右键单击以查看故事4时。当前故事被finish()
函数终止,并且null
在nextView
变量中返回,因为没有加载故事4,我返回到MainActivity
我必须导航到我的回收器视图中的所有故事
# 1 楼答案
这些更改是否有助于:
一,/ 我认为你应该使用
ViewPager
。它会自动捕捉到项目,而无需滚动到索引。或者在SnapHelper
的帮助下继续使用RecyclerView
二,/ 将
onClickView
方法修改为非静态,并且不需要View v
即可工作。我看您只需要View v
作为上下文。为什么不直接将context
传递给该方法呢。使用这样的参数是不合适的,这种方法会让您陷入3/问题3/
您已经知道RecyclerView是如何工作的,只需避免使用
getChildAt
,因为在某些情况下,您想要的子级尚未创建。基于您的代码,我认为您甚至不需要获取nextView
# 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