简体   繁体   English

在 Recyclerview 中,如何将初始滚动位置更改为第一项的顶部?

[英]In Recyclerview, how to change initial scroll position to the top of first item?

I put an ItemView in a RecyclerView .我将ItemView放在RecyclerView The ItemView looks like this: ItemView看起来像这样:

在此处输入图片说明

The size of ItemView is larger than the size of the screen height. ItemView的尺寸大于屏幕高度的尺寸。

So I thought, initially, the RecyclerView will show the upper part of the ItemView :所以我想,最初, RecyclerView将显示ItemView的上部:

在此处输入图片说明

But the RecyclerView showed the lower part:但是RecyclerView显示了下半部分:

在此处输入图片说明

How can I change the initial scroll position to the top of the ItemView ?如何将初始滚动位置更改为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. 1)有时recyclerview会自动从第一个位置滚动一点。

Solution: add this below property to parent layout.解决方案:将此以下属性添加到父布局。

  android:descendantFocusability="blocksDescendants"

2) for everything else 2)对于其他一切

Solution: mRecyclerView.layoutManager.smoothScrollToPosition(mRecyclerView, null, 0);解决方案: mRecyclerView.layoutManager.smoothScrollToPosition(mRecyclerView, null, 0);

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM