java - 在 Recyclerview 中,如何将初始滚动位置更改为第一项的顶部?
问题描述
我ItemView
在一个RecyclerView
. ItemView
看起来像这样:
的大小ItemView
大于屏幕高度的大小。
所以我想,最初,RecyclerView
将显示的上半部分ItemView
:
但是RecyclerView
显示了下半部分:
如何将初始滚动位置更改为顶部ItemView
?
这是代码:
public class TimelineRecyclerViewAdapter extends RecyclerView.Adapter<TimelineRecyclerViewAdapter.ViewHolder> {
private Post post;
private ArrayList<Integer> timelineRecyclerViewData = null;
private ArrayList<Integer> viewPagerData = null;
private ArrayList<Integer> replyRecyclerViewData = null;
private Context context;
private ActivityMain activityMain;
TimelineRecyclerViewAdapter(ArrayList<Integer> timelineRecyclerViewList,
ArrayList<Integer> viewPagerList,
ArrayList<Integer> replyRecyclerViewList,
Context context,
ActivityMain activityMain) {
timelineRecyclerViewData = timelineRecyclerViewList;
viewPagerData = viewPagerList;
replyRecyclerViewData = replyRecyclerViewList;
this.context = context;
this.activityMain = activityMain;
}
public class ViewHolder extends RecyclerView.ViewHolder {
ViewPager viewPager;
RecyclerView replyRecyclerView;
ViewHolder(View itemView) {
super(itemView);
viewPager = itemView.findViewById(R.id.viewPager);
replyRecyclerView = itemView.findViewById(R.id.replyRecyclerView);
}
}
@Override
@NonNull
public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {
View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.post, viewGroup, false);
post = new Post(view);
return new ViewHolder(view);
}
HashMap<Integer, Integer> viewPagerState = new HashMap<>();
@Override
public void onViewRecycled(ViewHolder viewHolder) {
viewPagerState.put(viewHolder.getAdapterPosition(), viewHolder.viewPager.getCurrentItem());
super.onViewRecycled(viewHolder);
}
@Override
public void onBindViewHolder(ViewHolder viewHolder, int position) {
viewHolder.setIsRecyclable(false);
PostViewPagerAdapter postViewPagerAdapter = new PostViewPagerAdapter(viewPagerData);
viewHolder.viewPager.setAdapter(postViewPagerAdapter);
post.getMenu().setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
PopupMenu popupMenu = new PopupMenu(context, post.getMenu());
popupMenu.inflate(R.menu.post_menu);
popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
switch(item.getItemId()) {
case R.id.postMenuEdit:
activityMain.switchActivity(ActivityEdit.class);
case R.id.postMenuDelete:
return true;
default:
return false;
}
}
});
popupMenu.show();
}
});
post.getProfilePicture().setImageResource(R.drawable.temp_profile);
post.getId().setText("ID" + position);
post.getTime().setText("time" + position);
post.getContent().setText("content" + position);
if(viewPagerState.containsKey(viewHolder.getAdapterPosition())) {
viewHolder.viewPager.setCurrentItem(viewPagerState.get(position));
}
viewHolder.replyRecyclerView.setLayoutManager(new LinearLayoutManager(context));
viewHolder.replyRecyclerView.setAdapter(new ReplyRecyclerViewAdapter(replyRecyclerViewData)); // THIS IS THE PROBLEM
}
@Override
public int getItemCount() {
return timelineRecyclerViewData.size();
}
}
我发现这段代码是问题所在。当我删除它时,问题得到了解决:
viewHolder.replyRecyclerView.setAdapter(new ReplyRecyclerViewAdapter(replyRecyclerViewData));
为什么会出现这个问题?
解决方案
这可能是由于以下几个原因:
1)有时recyclerview会自动从第一个位置滚动一点。
解决方案:将以下属性添加到父布局。
android:descendantFocusability="blocksDescendants"
2)其他一切
解决方案:mRecyclerView.layoutManager.smoothScrollToPosition(mRecyclerView, null, 0);
推荐阅读
- javascript - Webpack 5 资产模块与 woff 文件有关
- node.js - 异步/等待的nodejs超时
- reactjs - react.js 和 usemutation 的无限循环
- android - 多线程 runOnUiThread
- json - 在一个混合数据类型的系列中,如何将偶尔出现的列表和字典转换成字符串?
- r - pdfetch 包中的 R pdfetch_boe 错误
- python - 奇怪的 python 文档字符串与 Jupyter Lab 的“上下文帮助”交互
- reactjs - 使用 textfiled 创建一个 Material Ui 复选框
- c# - 如何在 C# 中从特定点到终点进行索引?
- python - 将传感器数据附加到文件,特定于列