java - RecyclerView 在关闭并返回 Activity 后显示数据

标签 java android firebase firebase-realtime-database android-recyclerview

我正在使用 RecyclerView 来显示从 firebase 实时数据库获取的数据。当我打开回收器 View Activity 时,它没有显示任何内容,但是当我再次转到上一个 Activity 时,它就会显示。

这是必须显示数据的 Activity -

   public class BrakesItemActivity extends AppCompatActivity {
   private RecyclerView recyclerView;
  private FloatingActionButton floatingActionButton;
    private FirebaseDatabase database;
    private DatabaseReference BrakestransactionDb, brakesDb;
   private FirebaseRecyclerOptions<Transaction> options;
    private FirebaseRecyclerAdapter<Transaction, TransactionViewHolder> adapter;
   int sumofbrakescost = 0;
   String sumofbrakescostvalue;

BottomAppBar bottomAppBar;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_last2);
    bottomAppBar = findViewById(R.id.bottom_app_bar);
    recyclerView = findViewById(R.id.recycler_view);
    floatingActionButton = findViewById(R.id.floating_button);

    getWindow().setFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS,
            WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);

    setSupportActionBar(bottomAppBar);

    floatingActionButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent intent = new Intent(BrakesItemActivity.this, BInputActivity.class);
            startActivity(intent);
        }
    });

    database = FirebaseDatabase.getInstance();
    BrakestransactionDb = database.getReference().child("Brakes Items Transaction");

    recyclerView.setHasFixedSize(true);
    recyclerView.setLayoutManager(new LinearLayoutManager(BrakesItemActivity.this));

    BrakestransactionDb.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            for (DataSnapshot ds : dataSnapshot.getChildren()) {
                Map<String, Object> map = (Map<String, Object>) ds.getValue();
                Object totalcost = map.get("totalcoststring");
                int totalcostvalue = Integer.parseInt(String.valueOf(totalcost));
                sumofbrakescost += totalcostvalue;
                sumofbrakescostvalue = String.valueOf(sumofbrakescost);

            }
            brakesDb = database.getReference().child("Department").child("Brakes").child("Cost");
            brakesDb.setValue(sumofbrakescostvalue);

        }

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

        }
    });
    showTask();

}

private void showTask() {
    options = new FirebaseRecyclerOptions.Builder<Transaction>().setQuery(BrakestransactionDb, Transaction.class).build();
    adapter = new FirebaseRecyclerAdapter<Transaction, TransactionViewHolder>(options) {
        @Override
        protected void onBindViewHolder(@NonNull TransactionViewHolder holder, int position, @NonNull Transaction model) {
            holder.item_name_card.setText(model.getNameofitemstring());
            holder.bought_by_card.setText(model.getBoughtbystring());
            holder.bought_from_card.setText(model.getBoughtfromstring());
            holder.date_card.setText(model.getDatestring());
            holder.time_card.setText(model.getTimestring());
            holder.cost_of_one_item_card.setText(model.getCostofoneitemstring());
            holder.number_of_items_card.setText(model.getNumberofitemstring());
            holder.total_cost_card.setText(model.getTotalcoststring());

        }

        @NonNull
        @Override
        public TransactionViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
            View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.transaction_row, parent, false);
            return new TransactionViewHolder(itemView);
        }
    };
    recyclerView.setAdapter(adapter);
}

@Override
protected void onStart() {
    super.onStart();
    adapter.startListening();
}

@Override
protected void onStop() {
    super.onStop();
    adapter.stopListening();
}

@Override
public boolean onContextItemSelected(@NonNull MenuItem item) {
    if (item.getTitle().equals("Delete")) {
        deleteTransaction(adapter.getRef(item.getOrder()).getKey());
    }

    return super.onContextItemSelected(item);
}

private void deleteTransaction(String key) {
    BrakestransactionDb.child(key).removeValue();
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.bottommenu, menu);
    return super.onCreateOptionsMenu(menu);
}

@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
    if (item.getItemId() == R.id.delete_all) {
        BrakestransactionDb.removeValue();
    }
    if (item.getItemId() == R.id.home_button) {
        Intent intent = new Intent(this, NavActivity.class);
        finish();
        startActivity(intent);
        if (item.getItemId() == R.id.back_item_activity) {
            Intent intent1 = new Intent(this, Department.class);
            finish();
            startActivity(intent1);
        }
    }
    return super.onOptionsItemSelected(item);
}

}

<小时/>

这是我制作的模型类-

package com.example.android.zfr.Model;

 public class Transaction {
private String nameofitemstring,boughtbystring,boughtfromstring,costofoneitemstring,datestring,
        timestring,totalcoststring,numberofitemstring;

public String getNameofitemstring() { return nameofitemstring; }

public void setNameofitemstring(String nameofitemstring) { this.nameofitemstring = nameofitemstring; }

public String getBoughtbystring() {return boughtbystring; }

public void setBoughtbystring(String bought string) {
    this.boughtbystring = boughtbystring;
}

public String getBoughtfromstring() { return boughtfromstring; }

public void setBoughtfromstring(String boughtfromstring) { this.boughtfromstring = boughtfromstring; }

public String getCostofoneitemstring() {
    return costofoneitemstring;
}

public void setCostofoneitemstring(String costofoneitemstring) { this.costofoneitemstring = costofoneitemstring; }

public String getDatestring() { return datestring; }

public void setDatestring(String datestring) { this.datestring = datestring; }

public String getTimestring() { return timestring; }

public void setTimestring(String timestring) { this.timestring = timestring; }

public String getTotalcoststring() { return totalcoststring; }

public void setTotalcoststring(String totalcoststring) { this.totalcoststring = totalcoststring; }

public String getNumberofitemstring() { return numberofitemstring; }

public void setNumberofitemstring(String numberofitemstring) { this.numberofitemstring = numberofitemstring; }

public Transaction() { }

public Transaction(String nameofitemstring,String boughtbystring,String boughtfromstring,String costofoneitemstring, String timestring,
                 String datestring ,String totalcoststring , String numberofitemstring ){
    this.nameofitemstring=nameofitemstring;
    this.boughtbystring=boughtbystring;
    this.boughtfromstring=boughtfromstring;
    this.costofoneitemstring=costofoneitemstring;
    this.datestring=datestring;
    this.timestring=timestring;
    this.numberofitemstring=numberofitemstring;
    this.totalcoststring=totalcoststring;
}

}

<小时/>

这是浏览者类别-

 package com.example.android.zfr.ViewHolder;

   import android.view.ContextMenu;
import android.view.View;
import android.widget.TextView;

 import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;

import com.example.android.zfr.R;
 import com.facebook.shimmer.ShimmerFrameLayout;

 public class TransactionViewHolder extends RecyclerView.ViewHolder implements 
View.OnCreateContextMenuListener{

public TextView item_name_card,bought_by_card,bought_from_card,date_card,
        time_card,cost_of_one_item_card,number_of_items_card,total_cost_card;

public TransactionViewHolder(@NonNull View itemView) {
    super(itemView);
    item_name_card=itemView.findViewById(R.id.item_name_card);
    bought_by_card=itemView.findViewById(R.id.bought_by_card);
    bought_from_card=itemView.findViewById(R.id.bought_from_card);
    date_card=itemView.findViewById(R.id.date_card);
    time_card=itemView.findViewById(R.id.time_card);
    cost_of_one_item_card=itemView.findViewById(R.id.cost_of_one_item_card);
    number_of_items_card=itemView.findViewById(R.id.number_of_items_card);
    total_cost_card=itemView.findViewById(R.id.total_cost_card);

itemView.setOnCreateContextMenuListener(this);
}
@Override
 public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) 
 {  menu.add(0,0,getAdapterPosition(),"Delete");  }
}
<小时/>

请帮忙。

最佳答案

您需要意识到 Firebase 是异步的,这意味着您的 showTask() 甚至在数据库能够向您发送数据之前就被调用。为了避免这个问题,您需要将 showTask() 放入 addValueEventListener 中。试试这个:

BrakestransactionDb.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            for (DataSnapshot ds : dataSnapshot.getChildren()) {
                Map<String, Object> map = (Map<String, Object>) ds.getValue();
                Object totalcost = map.get("totalcoststring");
                int totalcostvalue = Integer.parseInt(String.valueOf(totalcost));
                sumofbrakescost += totalcostvalue;
                sumofbrakescostvalue = String.valueOf(sumofbrakescost);

            }
            brakesDb = database.getReference().child("Department").child("Brakes").child("Cost");
            brakesDb.setValue(sumofbrakescostvalue);
            showTask();
        }

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

        }
    });

关于java - RecyclerView 在关闭并返回 Activity 后显示数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60712872/

相关文章:

java - 从 2 个或多个数据库表到一个 Java 对象的数据

android - 为什么作者再次在项目中添加taskRepository?:?

Firebase 索引 "order": "ARRAYS"

javascript - Onclick 选择特定的 JSON 数据集

android - 在android中选择微调器时抛出错误

swift - 如何在每次再次加载 View 时清除 tableView 数据和 reloadData

java - 循环内的监听器不允许更改外部 boolean 标志

java - 创建一个打印 ArrayList 的方法,然后在另一个类中调用它

Java EE、Eclipse、Tomcat Simple Servlet 启动错误

android - 如何在没有容器( View )ID 的情况下替换当前 fragment ?