Android 如何保存和恢复片段中的recyclerview位置

Android 如何保存和恢复片段中的recyclerview位置,android,android-recyclerview,onsaveinstancestate,Android,Android Recyclerview,Onsaveinstancestate,您好,我想在从一个片段导航到另一个片段时保存回收器视图的位置,然后在返回片段时恢复滚动位置 注 到现在为止我没有尝试过任何方法,因为我不知道我到底在哪里 必须在my Home_Fragmen.java或PostAdapter_Home.java中实现它 现在,我如何在代码中实现这一点 Home\u Fragment.java public class Home_Fragment extends Fragment { private final DatabaseReference dat

您好,我想在从一个片段导航到另一个片段时保存回收器视图的位置,然后在返回片段时恢复滚动位置

到现在为止我没有尝试过任何方法,因为我不知道我到底在哪里 必须在my Home_Fragmen.java或PostAdapter_Home.java中实现它

现在,我如何在代码中实现这一点

Home\u Fragment.java

 public class Home_Fragment extends Fragment {
    private final DatabaseReference databaseReference = FirebaseDatabase.getInstance().getReference("uploads");
    public List<Upload> mUploads;
    PostAdapter_Home postsAdapter;
    RecyclerView postRecyclerView;
    ShimmerFrameLayout shimmerFrameLayout;

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_home, container, false);
        requireActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
        postRecyclerView = view.findViewById(R.id.recyclerViewHome);
        shimmerFrameLayout = view.findViewById(R.id.shimmerEffect);
        SnapHelper snapHelper = new PagerSnapHelper();
        snapHelper.attachToRecyclerView(postRecyclerView);
        postRecyclerView.setLayoutManager(
                new StaggeredGridLayoutManager(1, StaggeredGridLayoutManager.VERTICAL)
        );

        getData();
        shimmerFrameLayout.startShimmer();
        mUploads = new ArrayList<>();
        postsAdapter = new PostAdapter_Home(getContext(), mUploads);
        postRecyclerView.setAdapter(postsAdapter);
        return view;
    }

    private void getData() {
        databaseReference.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot snapshot) {
                if (snapshot.exists()) {

                    postRecyclerView.setVisibility(View.VISIBLE);
                    shimmerFrameLayout.stopShimmer();
                    shimmerFrameLayout.setVisibility(View.GONE);
                    mUploads.clear();
                    for (DataSnapshot dataSnapshot : snapshot.getChildren()) {
                        Upload upload = dataSnapshot.getValue(Upload.class);
                        assert upload != null;
                        upload.setmKey(dataSnapshot.getKey());
                        mUploads.add(upload);


                    }

                }

                //notify the adapter
                postsAdapter.notifyDataSetChanged();
            }

            @Override
            public void onCancelled(@NonNull DatabaseError error) {
            }
        });
    }
}
public class PostAdapter_Home extends RecyclerView.Adapter<PostAdapter_Home.PostViewHolder> {
    public static List<Upload> mUploads;
    public Context mcontext;
    //    ShimmerFrameLayout shimmerFrameLayout;


    public PostAdapter_Home(Context context, List<Upload> uploads) {
        mUploads = uploads;
        mcontext = context;
    }


    @NonNull
    @Override
    public PostViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view;
        view = LayoutInflater.from(mcontext).inflate(R.layout.post_item_container_home, parent, false);
        return new PostViewHolder(view);

    }

    @Override
    public void onBindViewHolder(@NonNull PostViewHolder holder, int position) {
        Upload uploadCurrent = mUploads.get(position);
        Shimmer shimmer = new Shimmer.ColorHighlightBuilder()
                .setBaseColor(Color.parseColor("#F3F3F3"))
                .setBaseAlpha(1)
                .setHighlightColor(Color.parseColor("#E7E7E7"))
                .setHighlightAlpha(1)
                .setDropoff(50)
                .build();
        ShimmerDrawable shimmerDrawable = new ShimmerDrawable();
        shimmerDrawable.setShimmer(shimmer);
        Glide.with(mcontext)
                .load(uploadCurrent.getmImageUrl())
                .diskCacheStrategy(DiskCacheStrategy.DATA)
                .placeholder(shimmerDrawable)
                .into(holder.imageView);


    }

    @Override
    public int getItemCount() {
        return mUploads.size();
    }

    public static class PostViewHolder extends RecyclerView.ViewHolder {
        ShapeableImageView imageView;

        public PostViewHolder(@NonNull View itemView) {
            super(itemView);
            imageView = itemView.findViewById(R.id.imagePostHome);
        }


        public void setOnItemClickListener(PostAdapter.OnItemClickListener listener) {

        }
    }
}
public class Home\u片段扩展了片段{
private final DatabaseReference DatabaseReference=FirebaseDatabase.getInstance().getReference(“上载”);
公共列表多路广播;
后适应者之家后适应者;
回收视图后回收视图;
摆振框架布局摆振框架布局;
@可空
@凌驾
创建视图时的公共视图(@NonNull LayoutInflater inflater、@Nullable ViewGroup container、@Nullable Bundle savedInstanceState){
视图=充气机。充气(R.layout.fragment\u home,container,false);
requireActivity().setRequestedOrientation(ActivityInfo.SCREEN\u ORIENTATION\u Graphic);
postRecyclerView=view.findViewById(R.id.RecyclerViewWhome);
shimmerFrameLayout=view.findViewById(R.id.shimmerEffect);
SnapHelper SnapHelper=新页面SnapHelper();
snapHelper.attachToRecyclerView(postRecyclerView);
postRecyclerView.setLayoutManager(
新的StaggedGridLayoutManager(1,StaggedGridLayoutManager.VERTICAL)
);
getData();
shimmerFrameLayout.startShimmer();
mUploads=newarraylist();
postsAdapter=新的PostAdapter_Home(getContext(),mUploads);
postRecyclerView.setAdapter(postsAdapter);
返回视图;
}
私有void getData(){
databaseReference.addValueEventListener(新的ValueEventListener(){
@凌驾
public void onDataChange(@NonNull DataSnapshot snapshot snapshot){
if(snapshot.exists()){
postRecyclerView.setVisibility(View.VISIBLE);
shimmerFrameLayout.stopShimmer();
shimmerFrameLayout.setVisibility(View.GONE);
mUploads.clear();
对于(DataSnapshot DataSnapshot:snapshot.getChildren()){
Upload Upload=dataSnapshot.getValue(Upload.class);
断言上传!=null;
upload.setmKey(dataSnapshot.getKey());
添加(上传);
}
}
//通知适配器
postsAdapter.notifyDataSetChanged();
}
@凌驾
已取消公共void(@NonNull DatabaseError){
}
});
}
}
PostAdapter_Home.java

 public class Home_Fragment extends Fragment {
    private final DatabaseReference databaseReference = FirebaseDatabase.getInstance().getReference("uploads");
    public List<Upload> mUploads;
    PostAdapter_Home postsAdapter;
    RecyclerView postRecyclerView;
    ShimmerFrameLayout shimmerFrameLayout;

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_home, container, false);
        requireActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
        postRecyclerView = view.findViewById(R.id.recyclerViewHome);
        shimmerFrameLayout = view.findViewById(R.id.shimmerEffect);
        SnapHelper snapHelper = new PagerSnapHelper();
        snapHelper.attachToRecyclerView(postRecyclerView);
        postRecyclerView.setLayoutManager(
                new StaggeredGridLayoutManager(1, StaggeredGridLayoutManager.VERTICAL)
        );

        getData();
        shimmerFrameLayout.startShimmer();
        mUploads = new ArrayList<>();
        postsAdapter = new PostAdapter_Home(getContext(), mUploads);
        postRecyclerView.setAdapter(postsAdapter);
        return view;
    }

    private void getData() {
        databaseReference.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot snapshot) {
                if (snapshot.exists()) {

                    postRecyclerView.setVisibility(View.VISIBLE);
                    shimmerFrameLayout.stopShimmer();
                    shimmerFrameLayout.setVisibility(View.GONE);
                    mUploads.clear();
                    for (DataSnapshot dataSnapshot : snapshot.getChildren()) {
                        Upload upload = dataSnapshot.getValue(Upload.class);
                        assert upload != null;
                        upload.setmKey(dataSnapshot.getKey());
                        mUploads.add(upload);


                    }

                }

                //notify the adapter
                postsAdapter.notifyDataSetChanged();
            }

            @Override
            public void onCancelled(@NonNull DatabaseError error) {
            }
        });
    }
}
public class PostAdapter_Home extends RecyclerView.Adapter<PostAdapter_Home.PostViewHolder> {
    public static List<Upload> mUploads;
    public Context mcontext;
    //    ShimmerFrameLayout shimmerFrameLayout;


    public PostAdapter_Home(Context context, List<Upload> uploads) {
        mUploads = uploads;
        mcontext = context;
    }


    @NonNull
    @Override
    public PostViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view;
        view = LayoutInflater.from(mcontext).inflate(R.layout.post_item_container_home, parent, false);
        return new PostViewHolder(view);

    }

    @Override
    public void onBindViewHolder(@NonNull PostViewHolder holder, int position) {
        Upload uploadCurrent = mUploads.get(position);
        Shimmer shimmer = new Shimmer.ColorHighlightBuilder()
                .setBaseColor(Color.parseColor("#F3F3F3"))
                .setBaseAlpha(1)
                .setHighlightColor(Color.parseColor("#E7E7E7"))
                .setHighlightAlpha(1)
                .setDropoff(50)
                .build();
        ShimmerDrawable shimmerDrawable = new ShimmerDrawable();
        shimmerDrawable.setShimmer(shimmer);
        Glide.with(mcontext)
                .load(uploadCurrent.getmImageUrl())
                .diskCacheStrategy(DiskCacheStrategy.DATA)
                .placeholder(shimmerDrawable)
                .into(holder.imageView);


    }

    @Override
    public int getItemCount() {
        return mUploads.size();
    }

    public static class PostViewHolder extends RecyclerView.ViewHolder {
        ShapeableImageView imageView;

        public PostViewHolder(@NonNull View itemView) {
            super(itemView);
            imageView = itemView.findViewById(R.id.imagePostHome);
        }


        public void setOnItemClickListener(PostAdapter.OnItemClickListener listener) {

        }
    }
}
公共类PostAdapter\u Home扩展了RecyclerView.Adapter{
公共静态列表多路复用器;
公共语境;
//摆振框架布局摆振框架布局;
公共PostAdapter_主页(上下文、列表上载){
mUploads=上传;
mcontext=上下文;
}
@非空
@凌驾
public PostViewHolder onCreateViewHolder(@NonNull ViewGroup父级,int viewType){
视图;
view=LayoutFlater.from(mcontext).充气(R.layout.post\u item\u container\u home,parent,false);
返回新的PostViewHolder(视图);
}
@凌驾
public void onBindViewHolder(@NonNull PostViewHolder,int位置){
Upload uploadCurrent=mUploads.get(位置);
Shimmer Shimmer=新的Shimmer.ColorHighlightBuilder()
.setBaseColor(Color.parseColor(“#f3”))
.a(1)
.setHighlightColor(Color.parseColor(#E7E7E7”))
.setHighlightAlpha(1)
.设置衰减(50)
.build();
ShimmerDrawable ShimmerDrawable=新的ShimmerDrawable();
微光可绘制。设置嵌合体(微光);
使用(mcontext)滑动
.load(uploadCurrent.getmImageUrl())
.diskCacheStrategy(diskCacheStrategy.DATA)
.占位符(可微光绘制)
.插入(支架.图像视图);
}
@凌驾
public int getItemCount(){
返回mUploads.size();
}
公共静态类PostViewHolder扩展了RecyclerView.ViewHolder{
ShapeableImageView图像视图;
公共PostViewHolder(@NonNull View itemView){
超级(项目视图);
imageView=itemView.findViewById(R.id.imagePostHome);
}
public void setOnItemClickListener(PostAdapter.OnItemClickListener侦听器){
}
}
}

一个简单的解决方案是使用静态变量

  • 将以下内容作为属性添加到类中:
    public static int saved_position=0
    0
    值必须是recyclerView position的默认值)
  • 每当recyclerView值更改时,添加
    Home\u Fragment.saved\u position=…
    ,以保存变量中的实际位置。这行代码可以毫无问题地在任何文件上运行,因为静态变量是公共的
  • 创建片段时,请将recyclerView位置设置为保存在
    主页\u片段中的位置。保存的\u位置
    ,这就是为什么必须将默认值设置为初始值的原因
  • 如果由于某种原因,recyclerView中的元素数量发生变化,请记住将
    Home\u Fragment.saved\u position
    的值更改为默认值

  • 只要应用程序未完全关闭,就会存储该值。如果应用程序放在后台,值将被存储,直到其他应用程序占用变量使用的RAM内存…兄弟,我了解一点,但如果你告诉我确切的代码是什么,我应该在我的代码中在哪里实现它,这将非常有帮助,顺便说一句,谢谢你的回答。确切的代码取决于你