繁体   English   中英

如何在另一个活动的背面按下时保留 Recyclerview 的滚动位置,并从 firebase 实时数据库中获取数据?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM