如何解决如何获取当前在回收器视图的线性布局中不可见的视图
我正在设计一个 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);
}
}
});
}
下面的代码是函数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
,与单击任何视图(故事)或单击左右按钮的代码相同。基本上,我只是通过传递一个 Intent 来打开另一个 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);
}
问题是它只给我可见的视图。不是其余的意见。我尝试自动滚动以便下一个或上一个视图变得可见,但它似乎不起作用。孩子的最后一个可见位置保持不变,当我尝试在最后一个可见视图之后打开视图时,它向我返回一个空视图。
假设有 5 个故事。然后我将在屏幕上只看到 3 个故事,其余的可以通过滚动看到。当我点击任何故事时。我只能在 1,2 和 3 之间导航。当我尝试从故事 3 向右单击以查看故事 4 时。当前故事被 finish()
函数杀死,null
在 {{ 1}} 变量,因此故事 4 未加载,我返回到 MainActivity。
我必须导航到我的回收者视图中显示的所有故事。
解决方法
做这些改变可能会有所帮助:
1/
我认为您应该使用 ViewPager
。它会自动捕捉到项目而无需滚动到索引。或者在 RecyclerView
SnapHelper
2/
修改 onClickView
方法不是静态的,不需要 View v
才能工作。我看到您只需要 View v
来查看上下文。为什么不直接将 context
传递给该方法。使用这样的参数是不合适的,这种方法会让你陷入 3/ 问题。
3/
nextView = MainActivity.linearLayoutManager.getChildAt(position);
您已经知道 RecyclerView 的工作原理,只需避免使用 getChildAt
,因为在某些情况下,您想要的孩子尚未创建。根据您的代码,我认为您甚至不需要获得 nextView
正如 Tam Huynh 所说。第一点帮助我在线性布局中获得新视图。这些意见运作良好。
函数 getChildAt
的参数有问题。我必须通过与以前相同的位置。因为相对而言,子视图的位置(索引)不会改变。
索引 0 -> 故事编号 1
索引 1 -> 故事编号 2
索引 2 -> 故事编号 3
就像如果有故事编号 1,2 和 3 可见,索引 0 将包含第一个故事,索引 1 将包含第二个,索引 2 将包含第三个故事。当用户单击第三个故事上的右键时。第 4 个故事首先可见,现在屏幕有 2,3 和 4 可见。但第 4 层的索引将仅保持第 3 位。现在索引就像
索引 0 -> 故事编号 2
索引 1 -> 故事编号 3
索引 2 -> 故事编号 4
因此,不应将 position
作为参数传递,而应将 currentPosition
传递给 getChildAt
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。