【问题标题】:How to save and restore recyclerview position in fragment [duplicate]如何在片段中保存和恢复recyclerview位置[重复]
【发布时间】:2021-08-20 07:01:13
【问题描述】:

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

注意

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

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

Home_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) {
            }
        });
    }
}

PostAdapter_Home.java

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) {

        }
    }
}

【问题讨论】:

    标签: android android-recyclerview onsaveinstancestate


    【解决方案1】:

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

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

    【讨论】:

    • 只要应用程序没有完全关闭,该值就会被存储。如果将应用程序置于后台,则该值将被存储,直到其他应用程序占用变量使用的RAM内存...
    • 兄弟,我有点理解,但是如果你告诉我确切的代码是什么以及我应该在我的代码中的哪里实现它会非常有帮助,顺便说一句,谢谢你的回答
    • 好吧,确切的代码取决于您的 PostAdapter_Home 类。我假设它是一个普通的 recyclerView 适配器,并且它有一个 RecyclerView.Holder...所以,这里有更多信息: 1. 确切的代码在那里。将其添加到“@Nullable”上方。 2.在“onBindViewHolder”方法中,添加“Home_Fragment.saved_position = holder.getAbsoluteAdapterPosition()” 3.在“return View”之前添加“postRecyclerView.scrollToPosition(Home_Fragment.saved_position)” 4.取决于视图数量是否改变或不是。如果是,请在发生这种情况的代码部分添加“Home_Fragment.saved_position=0”
    • 如果您不了解“onBindViewHolder”或其他与RecyclerView 相关的内容。检查stackoverflow.com/questions/26682277/…stackoverflow.com/questions/26875061/…
    • 兄弟,如果您检查我的 AdapterClass,这将非常有帮助我已将适配器类包含在问题中
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-06
    • 1970-01-01
    • 2011-11-02
    • 2014-01-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多