【问题标题】:How to fix 'Double data loading' from firebase realtime database如何修复 Firebase 实时数据库中的“双重数据加载”
【发布时间】:2019-08-18 06:23:56
【问题描述】:

我正在为一个小项目使用 firebase 实时数据库。我们有一个来自单个部门的学生列表。目的是借钱给其他学生,我们保留记录。

我有用户身份验证用户 firebase 身份验证。我面临的问题是一旦用户添加更多条目,而不是加载实际列表,它会创建副本。

这是我在回收站视图中加载数据的代码。 私有 void loadtorecyclerview() {

    databaseReference  = FirebaseDatabase.getInstance().getReference("Transaction");


    databaseReference.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            for(DataSnapshot snapshot : dataSnapshot.getChildren()) {
                readTransaction = snapshot.getValue(Transaction.class);
                if (readTransaction.getSponsor_id().contentEquals(user.getUserId().toString())) {
                  read_data.add(readTransaction);
                  Log.e("log" , readTransaction.toString());
                }
            }

               transactionAdapter.notifyDataSetChanged();

        }

        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {

        }
    });

}

我在片段的 OnCreateView 中调用此方法。

这是向 firebase 添加新数据的代码。

button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String amount = editText.getText().toString();

                setValue(amount);

                //value published firebase
                Log.e("amount" , amount);
                DatabaseReference databaseReference = FirebaseDatabase.getInstance().getReference("Transaction");
                String key = databaseReference.push().getKey();
                databaseReference.child(key).setValue(transaction_submitted);


            //    loadtorecyclerview();


                popupWindow.dismiss();
            }
        });

这是事务适配器的代码。

public class TransactionAdapter extends RecyclerView.Adapter<TransactionAdapter.ViewHolder>{
    Context context;
    ArrayList<Transaction> data;

    public TransactionAdapter(Context context, ArrayList<Transaction> data) {
        this.context = context;
        this.data = data;
    }

    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View v = (View) LayoutInflater.from(context).inflate(R.layout.single_item_sponsor_rv  , parent ,false);
        ViewHolder viewHolder = new ViewHolder(v);
        return viewHolder;
    }

    @Override
    public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
        holder.amount.setText(data.get(position).getAmount());
        holder.department.setText(data.get(position).getDepartment());
        holder.collector.setText(data.get(position).getCollector_name());
        holder.published.setText(data.get(position).getPublished_at());
    }

    @Override
    public int getItemCount() {

        return data.size();

    }

    class ViewHolder extends RecyclerView.ViewHolder {
        TextView published;
        TextView department;
        TextView amount;
        TextView collector;

        public ViewHolder(@NonNull View itemView) {
            super(itemView);
            published = itemView.findViewById(R.id.timestamp);
            department = itemView.findViewById(R.id.department);
            amount = itemView.findViewById(R.id.amount);
            collector = itemView.findViewById(R.id.collector);
        }
    }
}

您可以在图像中看到 Transaction 中有三个条目,但是在加载时,它会复制它们并显示很多。

【问题讨论】:

  • 适配器似乎有问题。请附上TransactionAdapter类的代码。
  • @salmanwahed 请检查更新后的代码。
  • 请检查答案,如果它解决了问题,请告诉我。
  • @salmanwahed 我用这个:read_data.clear(); transaction_adapter.notifydatasetchanged() 并且有效

标签: android firebase-realtime-database


【解决方案1】:

这是适配器设置的问题。您正在向数据集添加值而不删除旧值。请在添加新项目之前重新初始化/清除 read_data 对象。

databaseReference  = FirebaseDatabase.getInstance().getReference("Transaction");

read_data.clear();

databaseReference.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            for(DataSnapshot snapshot : dataSnapshot.getChildren()) {
                readTransaction = snapshot.getValue(Transaction.class);
                if (readTransaction.getSponsor_id().contentEquals(user.getUserId().toString())) {
                  read_data.add(readTransaction);
                  Log.e("log" , readTransaction.toString());
                }
            }

               transactionAdapter.notifyDataSetChanged();

        }

        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {

        }
    });

}

【讨论】:

    猜你喜欢
    • 2021-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-10
    • 2019-12-26
    • 2019-11-13
    相关资源
    最近更新 更多