gpt4 book ai didi

android - 如何在 fragment 中保存和恢复recyclerview的位置

转载 作者:行者123 更新时间:2023-12-04 17:18:28 24 4
gpt4 key购买 nike

这个问题在这里已经有了答案:





How to save RecyclerView's scroll position using RecyclerView.State?

(19 个回答)


6 个月前关闭。




你好我想在从一个 fragment 导航到另一个 fragment 时保存回收器 View 的位置,然后在返回到 fragment 时恢复滚动位置
笔记

I didn't try any method till now because I don't know where exactly Ihave to implement it in my Home_Fragmen.java or in PostAdapter_Home.java


现在,我如何在我的代码中实现这一点?
首页_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) {

}
}
}

最佳答案

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

  • 将以下作为属性添加到您的类:public static int saved_position = 0 (0 值必须是您的 recyclerView 位置的默认值)。
  • 每当 recyclerView 值更改时,添加 Home_Fragment.saved_position = ... , 以保存变量中的实际位置。这行代码可以毫无问题地在任何文件上运行,因为静态变量是公共(public)的。
  • 创建fragment时,将recyclerView位置设置为Home_Fragment.saved_position中保存的位置,这就是为什么您必须将默认值设置为初始值的原因。
  • 如果由于某种原因recyclerView中的元素数量发生了变化,记得改变Home_Fragment.saved_position的值。到默认值。
  • 关于android - 如何在 fragment 中保存和恢复recyclerview的位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67799699/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com