由于我的测验应用程序中 Firebase 数据库的异步特性,我面临此问题。问题分数包含当前用户及其分数。排名包含用户及其相应的分数。问题分数存储了分数,但是当我正在用分数更新排名数据库...排名对象中的分数值被重置为零。我应该如何处理这个问题?
我已经尝试使用排名回调来更新数据库,但没有成功。
public class RankingFragment extends Fragment {
View myFragment;
RecyclerView rankingList;
LinearLayoutManager layoutManager;
FirebaseRecyclerAdapter<Ranking, RankingViewHolder> adapter;
FirebaseDatabase database;
DatabaseReference questionScore, rankingTbl;
String k;
int sum=0;
public static RankingFragment newInstance() {
RankingFragment rankingFragment = new RankingFragment();
return rankingFragment;
}
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
database = FirebaseDatabase.getInstance();
questionScore = database.getReference("Question_Score");
rankingTbl = database.getReference("Ranking");
}
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
myFragment = inflater.inflate(R.layout.fragment_ranking, container, false);
rankingList = (RecyclerView) myFragment.findViewById(R.id.rankingList);
layoutManager = new LinearLayoutManager(getActivity());
rankingList.setHasFixedSize(true);
layoutManager.setReverseLayout(true);
layoutManager.setStackFromEnd(true);
rankingList.setLayoutManager(layoutManager);
updateScore(Common.currentUser.getUsername());
return myFragment;
}
private void updateScore(final String username)
{
questionScore.orderByChild("user").equalTo(username).addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
for (DataSnapshot data : dataSnapshot.getChildren()) {
QuestionScore ques = data.getValue(QuestionScore.class);
sum+=Integer.parseInt(ques.getScore());
}
Ranking ranking = new Ranking(username, sum);
rankingTbl.child(ranking.getUsername()).setValue(ranking);
adapter = new FirebaseRecyclerAdapter<Ranking, RankingViewHolder>(
Ranking.class, R.layout.layout_ranking, RankingViewHolder.class, rankingTbl.orderByChild("marks")
) {
@Override
protected void populateViewHolder(final RankingViewHolder viewHolder, Ranking model, int position) {
viewHolder.txt_name.setText(model.getUsername());
viewHolder.txt_score.setText(String.valueOf(model.getMarks()));
}
};
finish();
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
}
private void finish() {
adapter.notifyDataSetChanged();
rankingList.setAdapter(adapter);
}
}
排名数据库的分数存储 0,因此 View 持有者也填充零,而它应该存储当前用户的分数(存储在“sum+=Integer.parseInt(ques.getScore());”中
最佳答案
您正在将 QuestionScore
中的值分配给 sum
,而不应该像添加所有 QuestionScore
值
for (DataSnapshot data : dataSnapshot.getChildren()) {
QuestionScore ques = data.getValue(QuestionScore.class);
sum+=Integer.parseInt(ques.getScore()); // <--- changed = to +=
}
关于java - 如何处理 Firebase 数据库的异步特性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56866180/