I put an ItemView
in a RecyclerView
. The ItemView
looks like this:
The size of ItemView
is larger than the size of the screen height.
So I thought, initially, the RecyclerView
will show the upper part of the ItemView
:
But the RecyclerView
showed the lower part:
How can I change the initial scroll position to the top of the ItemView
?
Here is the code:
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();
}
}
I found this code is the problem. When I deleted this, the problem fixed:
viewHolder.replyRecyclerView.setAdapter(new ReplyRecyclerViewAdapter(replyRecyclerViewData));
Why does it make this problem?
This may happen due to a few reasons:
1) some times recyclerview automatically scrolls a bit from the first position.
Solution: add this below property to parent layout.
android:descendantFocusability="blocksDescendants"
2) for everything else
Solution: mRecyclerView.layoutManager.smoothScrollToPosition(mRecyclerView, null, 0);
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.