当前位置: 首页 > 知识库问答 >
问题:

恢复滚动位置

微生毅然
2023-03-14

我有一个从Firebase数据库检索数据的简单片段。我使用firebase recycler视图显示检索数据。在滚动或屏幕旋转后,我无法强制回收器视图(或线性布局管理器)恢复滚动位置。

我在这里找到了一些答案,但它们不起作用。

我的代码是:

公共类NewsListFragment扩展了ParentNewsFragment{

static int color_naval, color_black;
private boolean mProcessLikes = false;
private DatabaseReference mDatabaseLikes;
private DatabaseReference mDatabaseViews;
private FirebaseAuth mAuth;
private int position = 0;


public static NewsListFragment getInstance() {
    return new NewsListFragment();
}

@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    mDatabaseReference = FirebaseDatabase.getInstance().getReference()
            .child("App_news");
    mDatabaseLikes = FirebaseDatabase.getInstance().getReference().child("news_likes");
    mDatabaseViews = FirebaseDatabase.getInstance().getReference().child("news_views");
    mAuth = FirebaseAuth.getInstance();
    mQuery = mDatabaseReference.orderByChild("pos").startAt("100");
    color_naval = getResources().getColor(R.color.colorPrimary);
    color_black = getResources().getColor(R.color.colorBlack);
}

@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View rootView = inflater.inflate(R.layout.rv_choose, container, false);
    rv = (RecyclerView) rootView.findViewById(R.id.rv_choose);
    lm = new LinearLayoutManager(getActivity());
    rv.setLayoutManager(lm);
    rv.setHasFixedSize(true);
    return rootView;
}

@Override
public void onPause() {
    super.onPause();
    position = lm.findFirstVisibleItemPosition();
}

@Override
public void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    outState.putInt("position", position);
}

@Override
public void onViewStateRestored(@Nullable Bundle savedInstanceState) {
    super.onViewStateRestored(savedInstanceState);
    if(savedInstanceState != null) {
        position = savedInstanceState.getInt("position");
    }
}

@Override
public void onResume() {
    super.onResume();
    if (position != 0) {
        lm.scrollToPosition(position);
        showToast(position+"");
    }
}

@Override
public void onStart() {
    super.onStart();
    FirebaseRecyclerAdapter<NewsList, NewsListViewHolder> adapter =
            new FirebaseRecyclerAdapter<NewsList, NewsListViewHolder>(
                    NewsList.class,
                    R.layout.frag_newslist_card_view,
                    NewsListViewHolder.class,
                    mQuery
            ) {
                @Override
                protected void populateViewHolder(NewsListViewHolder viewHolder, final NewsList model, int position) {
                    final String post_key = getRef(position).getKey();
                    viewHolder.setDate(model.getDate()+",");
                    viewHolder.setTime(model.getTime());
                    viewHolder.setTitle(model.getTitle());
                    viewHolder.setImage(getContext(), model.getImage());
                    viewHolder.setEye(model.getCode());
                    viewHolder.setThumb(post_key);

                    viewHolder.thumb.setOnClickListener(new View.OnClickListener() {
                        @Override
                        public void onClick(View view) {
                            mProcessLikes = true;
                            mDatabaseLikes.addValueEventListener(new ValueEventListener() {
                                @Override
                                public void onDataChange(DataSnapshot dataSnapshot) {
                                    if (mProcessLikes){
                                        if (dataSnapshot.child(post_key).hasChild(mAuth.getCurrentUser().getUid())){
                                            mDatabaseLikes.child(post_key).child(mAuth.getCurrentUser().getUid())
                                                    .removeValue();
                                            mProcessLikes = false;
                                        }
                                        else {
                                            mDatabaseLikes.child(post_key).child(mAuth.getCurrentUser().getUid())
                                                    .setValue("like");
                                            mProcessLikes = false;
                                        }
                                    }
                                }
                                @Override
                                public void onCancelled(DatabaseError databaseError) {

                                }
                            });
                        }
                    });

                    viewHolder.mView.setOnClickListener(new View.OnClickListener() {
                        @Override
                        public void onClick(View view) {
                            mDatabaseViews.addValueEventListener(new ValueEventListener() {
                                @Override
                                public void onDataChange(DataSnapshot dataSnapshot) {
                                    if (!dataSnapshot.child(post_key).hasChild(mAuth.getCurrentUser().getUid())) {
                                        mDatabaseViews.child(post_key).child(mAuth.getCurrentUser().getUid())
                                                .setValue("view");
                                    }
                                }
                                @Override
                                public void onCancelled(DatabaseError databaseError) {

                                }
                            });
                            mChooserListener.chooseNews(model.getCode());
                        }
                    });
                }
            };
    rv.setAdapter(adapter);
}

public static class NewsListViewHolder extends RecyclerView.ViewHolder {
       //some text here
}

}

最后的showToast方法显示了位置的真实数量,但recyclerview从一开始就开始了。

有什么想法吗?

共有2个答案

康元凯
2023-03-14

用类似于以下内容的内容替换线性布局管理器。我使用这个实现很多次时,使用RecycraView片段。让我知道进展如何

LinearLayoutManager mLayoutManager = new LinearLayoutManager(getActivity());
mLayoutManager.setReverseLayout(true);
mLayoutManager.setStackFromEnd(true);
yourItem.setLayoutManager(mLayoutManager);
萧煜
2023-03-14

确保没有从服务器或任何检索数据的地方重新加载数据。在片段的onCreateView或活动的onCreate中进行Add not null检查,如:

        if(savedInstanceState != null){
    ...
    }else{
    loadData();
}
 类似资料:
  • 我制作了一个recyclerview网格,一旦用户按下按钮,它就会被api中的数据填满。旋转屏幕后,滚动位置会短暂恢复,然后再向上滚动到网格顶部。我使用本教程来保留我的滚动位置: 我还在本教程中尝试保存布局状态。 我的舱单条目是:

  • 抱歉,我的英语很差。 我想要确切的位置。并且在活动/片段被销毁后(不管是我销毁它还是系统销毁它),我重新打开活动/片段,< code > recycle view 也可以在它被销毁的相同位置。 “相同”并不意味着“项目位置”,因为项目可能只是上次显示的一部分。 我想恢复完全相同的位置。 我尝试了下面的一些方法,但没有人是完美的。 有人可以帮忙吗? 1.First方式。 我使用< code>onSc

  • 我在使用react路由器导航时遇到滚动问题。 当我导航到另一个组件时,它会保持上次导航时的滚动位置。然而,我希望它恢复和开始从顶部每当导航被改变。 然而,它不起作用。我有一种感觉,问题在于我的导航风格,而不是window.scrollTo()片段。

  • 我正在为一个项目使用RichTextFX,并想在RichTextFX中的代码区背景中添加一个画布。我已经这样做了,但是我还没有找到一种方法让它在代码区本身滚动。 有没有一种方法可以通过编程获得代码区的滚动位置,这样我就可以做到这一点?

  • 问题内容: 使用react-router时,后退按钮上的滚动位置(历史记录popstate)遇到一些问题。由于浏览器正在实现一些自动滚动行为,因此React Router v4无法开箱即用地管理滚动。这很棒,除非浏览器窗口的高度从一个视图到另一个视图变化太大。我已经实现了ScrollToTop组件,如下所述:https : //reacttraining.com/react- router/web

  • 我有一个包含多个< code>LazyRow的< code>LazyColumn。在旧术语中,嵌套RecyclerView。 我的问题是,当移动到一个新的可组合(不同的选项卡)时,不会恢复滚动状态。但是内部s恢复它们的状态。 例如,打开主屏幕,滚动到底部,然后滚动结束,然后打开不同的选项卡并再次返回主选项卡。 的产品进行评级 如何恢复滚动状态?