[英]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 和null
在nextView
变量中返回,因此故事 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.