![](/img/trans.png)
[英]How to retain the scrolled position of a Recycler view in a fragment on back press from another activity?
[英]How to retain the scrolled position of a Recyclerview on back press from another activity and i fetch data from firebase realtime database?
我在里面使用片段,我从 firebase 数据库中获取数据。 我使用卡片视图来显示数据,通过单击我到达新活动的每个卡片视图,但是当我按下后退按钮时,回收站视图再次加载并且回收站视图页面从顶部开始。 我想保留 recyclerview 位置。请帮助如何保留滚动视图位置。
public class StationaryDetailFragment extends Fragment {
private RecyclerView pendingOrder_row;
private DatabaseReference orderDatabase;
FirebaseRecyclerAdapter orderRecyclerAdapter;
private DatabaseReference databaseReference;
private String rollnumber , mobilenumber, collegename, hostelname, key;
private ArrayList<String> title2 = new ArrayList<>();
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
View v = inflater.inflate(R.layout.fragment_stationarydetail, container, false);
pendingOrder_row = v.findViewById(R.id.pendingOrder_row);
pendingOrder_row.setHasFixedSize(true);
pendingOrder_row.setLayoutManager(new LinearLayoutManager(getContext()));
orderDatabase = FirebaseDatabase.getInstance().getReference().child("StationaryConfirmOrder");
orderDatabase.addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
key= dataSnapshot.getKey();
title2.add(key);
Log.i("key",key);
}
@Override
public void onChildChanged(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
}
@Override
public void onChildRemoved(@NonNull DataSnapshot dataSnapshot) {
}
@Override
public void onChildMoved(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
return v;
}
@Override
public void onStart() {
super.onStart();
FirebaseRecyclerOptions<details> optioner =
new FirebaseRecyclerOptions.Builder<details>()
.setQuery(orderDatabase, details.class)
.setLifecycleOwner(this)
.build();
orderRecyclerAdapter = new FirebaseRecyclerAdapter<details, orderViewHolder>(optioner){
@NonNull
@Override
public orderViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
return new orderViewHolder(LayoutInflater.from(parent.getContext())
.inflate(R.layout.stat_order_cnfrow, parent, false));
}
@Override
protected void onBindViewHolder(@NonNull final orderViewHolder holder, int position, @NonNull details model) {
final String userid = model.getUserid();
final String price = model.getPrice();
final String Quantity = model.getQuantity();
final String Name = model.getName();
final String key2 = title2.get(position);
holder.setUserId(key2);
databaseReference = FirebaseDatabase.getInstance().getReference("User").child(userid);
databaseReference.keepSynced(true);
databaseReference.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
rollnumber = dataSnapshot.child("rollNumber").getValue().toString();
mobilenumber = dataSnapshot.child("mobileNumber").getValue().toString();
collegename = dataSnapshot.child("collegeName").getValue().toString();
hostelname = dataSnapshot.child("hostelName").getValue().toString();
Log.i("user", rollnumber+"/"+ mobilenumber+"/"+collegename+"/"+hostelname);
holder.setName(rollnumber);
holder.setPrice(hostelname +", "+ collegename);
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
holder.orderCard.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
final Intent orderDetail = new Intent(getActivity(),stat_con_order.class);
orderDetail.putExtra("userid",userid);
orderDetail.putExtra("price",price);
orderDetail.putExtra("Quantity",Quantity);
orderDetail.putExtra("Name",Name);
orderDetail.putExtra("orderid",key2);
startActivity(orderDetail);
}
});
}
@Override
public int getItemCount() {
return title2.size();
}
};
pendingOrder_row.setAdapter(orderRecyclerAdapter);
orderRecyclerAdapter.notifyDataSetChanged();
pendingOrder_row.smoothScrollToPosition(0);
}
public static class orderViewHolder extends RecyclerView.ViewHolder {
View view;
RelativeLayout orderCard;
public orderViewHolder(@NonNull View itemView) {
super(itemView);
view =itemView;
orderCard = itemView.findViewById(R.id.orderCard);
}
public void setName(String Name){
TextView rollTextView = (TextView) view.findViewById(R.id.rollTextView);
rollTextView.setText(Name);
}
public void setPrice(String Price){
TextView mobileTextView = (TextView) view.findViewById(R.id.mobileTextView);
mobileTextView.setText(Price);
}
public void setUserId(String userId){
TextView orderidTextView = (TextView) view.findViewById(R.id.orderidTextView);
orderidTextView.setText(userId);
}
}
}
您的 onStart 具有初始化 Recycler、Adapter 和:Collection DATA 的实现!
所以如果你的 Fragment 失去了可见性,当另一个 Activity 全屏时,你回到你的 Fragment 隐藏,你执行一个请求,获取数据,并设置为 Recycler,但是,这是一个新的 Collection,所以 Recycler 放入第一个位置。
您需要将您的集合保存在 onSaveInstanceState 中并在 onActivityCreated() 中恢复它并将其设置为适配器。
使用这种方法,您必须更改很多 Fragment 实现,因为您没有考虑生命周期!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.