【发布时间】:2019-07-26 18:37:44
【问题描述】:
我正在从头开始创建我的第一个应用程序,它是 android 上的一个论坛应用程序,我已经了解了它的赞成/反对部分。
我已将其设置为我的用户可以投票反对的位置(类似于 StackOverflow),但我不知道如何将其限制为每个用户一票。
我使用 Firebase-Firestore 作为数据库。
我设置了 upvote 和 downvote 切换按钮,以在按钮点击侦听器上更新 firestore 中的分数,每个按钮都有各自的选择器 item.xml。
有没有人能阐明一种方法,将用户限制为每个用户每个答案只能投一票,类似于堆栈溢出?
感谢任何和所有的帮助。
编辑
尝试提供的答案之前的当前代码。
应答适配器
public class AnswerAdapter extends FirestoreRecyclerAdapter<Answer, AnswerAdapter.AnswerHolder> {
private QuestionAdapter.OnItemClickListener listener;
private Context mContext;
private static final String TAG = "AnswerAdapter";
/**
* Create a new RecyclerView adapter that listens to a Firestore Query. See {@link
* FirestoreRecyclerOptions} for configuration options.
*
* @param options
*/
public AnswerAdapter(@NonNull FirestoreRecyclerOptions<Answer> options) {
super(options);
}
@NonNull
@Override
public AnswerHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.answer_item, viewGroup, false);
return new AnswerHolder(v);
}
@Override
protected void onBindViewHolder(@NonNull final AnswerAdapter.AnswerHolder answerHolder, final int position, @NonNull final Answer model) {
answerHolder.answerItemTextView.setText(model.getAnswer());
answerHolder.answerAuthorTextView.setText(model.getAuthor());
answerHolder.answerTimeStampTextView.setText(model.getTimestamp());
answerHolder.answerScoreTextView.setText(getSnapshots().getSnapshot(position).get("answerScore").toString());
answerHolder.mAnswerUpVoteButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO: 2019-07-26 check order of operations. seems to go through upvote and then also through downvote unchecking state
if (answerHolder.mAnswerUpVoteButton.isChecked()){
answerUpVote(answerHolder, position, model);
} else {
// answerDownVote(answerHolder, position, model);
}
}
});
public class AnswerHolder extends RecyclerView.ViewHolder{
TextView answerItemTextView;
TextView answerScoreTextView;
ToggleButton answerCheckMark;
TextView answerAuthorTextView;
TextView answerTimeStampTextView;
ToggleButton mAnswerUpVoteButton;
ToggleButton mAnswerDownVoteButton;
public AnswerHolder(@NonNull final View itemView) {
super(itemView);
answerItemTextView = itemView.findViewById(R.id.answerItemTextViewId);
answerScoreTextView = itemView.findViewById(R.id.questionScoreId);
answerCheckMark = itemView.findViewById(R.id.answerCheckMarkId);
answerAuthorTextView = itemView.findViewById(R.id.answerAuthorTextViewId);
answerTimeStampTextView = itemView.findViewById(R.id.answerTimeStampTextViewId);
mAnswerUpVoteButton = itemView.findViewById(R.id.answerUpVoteId);
mAnswerDownVoteButton = itemView.findViewById(R.id.answerDownVoteId);
mContext = itemView.getContext();
}
}
private void answerUpVote(@NonNull final AnswerAdapter.AnswerHolder answerHolder, final int position, @NonNull final Answer model) {
final String answerScoreFBValue = getSnapshots().getSnapshot(position).get("answerScore").toString();
final String answerFirebaseIdString = getSnapshots().getSnapshot(position).get("answerFirebaseId").toString();
// Toast.makeText(mContext, "upvote button clicked " + answerScoreFBValue, Toast.LENGTH_SHORT).show();
final CollectionReference answerCollectionRef = FirebaseFirestore.getInstance().collection("Answers");
final DocumentReference answerDocRef = answerCollectionRef.document(answerFirebaseIdString);
answerDocRef.update("answerScore", FieldValue.increment(1)).addOnSuccessListener(new OnSuccessListener<Void>() {
// answerRef.document().update("answerscore", answerScoreTestInt).addOnSuccessListener(new OnSuccessListener<Void>() {
@Override
public void onSuccess(Void aVoid) {
Log.d(TAG, "onSuccess: answerScore incremented");
// answerHolder.answerScoreTextView.setText("testing");
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
Log.e(TAG, "onFailure: answerScore was not incremented", e);
}
});
}
Answer.java
package com.example.stairmaster.models;
public class Answer {
private String answer;
private String comment;
private String timestamp;
private int answerScore;
private String author;
private String answerFirebaseId;
private String parentQuestionId;
public Answer(String answer, String timeStamp, String author, String parentQuestionId, int answerScore) {
this.answer = answer;
this.timestamp = timeStamp;
this.answerScore = answerScore;
this.author = author;
this.parentQuestionId = parentQuestionId;
}
public Answer () {
// public no-arg constructor needed
}
public String getAnswerFirebaseId() {
return answerFirebaseId;
}
public void setAnswerFirebaseId(String answerFirebaseId) {
this.answerFirebaseId = answerFirebaseId;
}
public String getAnswer() {
return answer;
}
public void setAnswer(String answer) {
this.answer = answer;
}
public String getComment() {
return comment;
}
public void setComment(String comment) {
this.comment = comment;
}
public String getTimestamp() {
return timestamp;
}
public void setTimestamp(String timestamp) {
this.timestamp = timestamp;
}
public int getAnswerScore() {
return answerScore;
}
public void setAnswerScore(int answerScore) {
answerScore = answerScore;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
public String getParentQuestionId() {
return parentQuestionId;
}
public void setParentQuestionId(String parentQuestionId) {
this.parentQuestionId = parentQuestionId;
}
}
【问题讨论】:
-
分享一些代码以便我们更好地提供帮助
-
@treewallie,稍后再做。目前在工作场所。
-
问题解决了吗?
-
@Treewallie,为你添加代码
-
@AlexMamo,还没有。不幸的是,我要到明天或本周晚些时候才能解决它。
标签: java android google-cloud-firestore android-togglebutton