android - 根据 Firestore 中的值,使用 if-else 语句更改 RecyclerView 中的 TextView
问题描述
我正在开发一个游戏,当前用户可以在 RecyclerView 中查看他当前的所有游戏(见图)。为此,我正在使用 Firestore UI,并且我想将 TextView 更改为“播放”或“等待”,具体取决于当前用户必须玩还是对手必须玩。为此,我在 RecyclerViewAdapter 检索其值并为其提供当前玩家或对手的 UID 的值(取决于谁必须玩)的文档中创建了一个字段“转”。
因此,当当前用户必须玩时,他应该在 RecyclerView 项目中看到“Play”作为 TextView,而对手必须看到“Wait”(见图)。为了得到想要的结果,我想实现一个 if-else 语句,但不幸textViewTurn.getText().toString()
的是,在 if 语句中没有值,但是当我将值作为意图发送到下一个 Activity 时它有一个值,所以我的 if else 语句不起作用。如何在 中获取此 TextView 的值CurrentGamesHolder
?我应该在 RecyclerAdapter 的其他地方使用 if else 语句吗?
编辑:
我现在将 if else 语句移到onBindViewHolder
where bothmTurn
并且uid
有一个值,但该方法仍然不起作用。这意味着当我登录到玩家 1 的帐户时,textViewPlay
显示“等待”,这与玩家 2uid
相同。两个帐户的值不同,所以我实际上不知道结果如何可能在这两个帐户中是相同的,因为根据 if else 语句它不应该是。
任何帮助深表感谢!
这是我的 RecyclerViewAdapter:
public class CurrentGameAdapter extends FirestoreRecyclerAdapter<CurrentGames, CurrentGameAdapter.CurrentGamesHolder> {
private OnItemClickListener listener;
public CurrentGameAdapter(@NonNull FirestoreRecyclerOptions<CurrentGames> options) {
super(options);
}
@Override
protected void onBindViewHolder(@NonNull CurrentGamesHolder holder, int position, @NonNull CurrentGames model) {
holder.textViewTurn.setText(model.getTurn());
holder.textViewPlay.setText("");
...
mTurn = model.getTurn();
FirebaseUser currentUser = FirebaseAuth.getInstance().getCurrentUser();
String mCurrentUser =currentUser.getUid();
if (mTurn == mCurrentUser){
holder.textViewPlay.setText("Play");
}else if (mTurn != mCurrentUser){
holder.textViewPlay.setText("Wait");
}
}
@NonNull
@Override
public CurrentGamesHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.listitem_current_game,parent, false);
return new CurrentGamesHolder(view);
}
class CurrentGamesHolder extends RecyclerView.ViewHolder {
TextView textViewTurn, textViewPlay;
...
public CurrentGamesHolder(@NonNull View itemView) {
super(itemView);
textViewPlay = itemView.findViewById(R.id.play_current_game);
textViewTurn = itemView.findViewById(R.id.turn_current_game);
textViewTurn.setVisibility(View.INVISIBLE);
...
itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
int position = getAdapterPosition();
if (position != RecyclerView.NO_POSITION && listener != null){
listener.onItemClick(getSnapshots().getSnapshot(position),(position));
Intent i = new Intent (itemView.getContext(), PlayInterimResultMainActivity.class);
i.putExtra("turn", textViewTurn.getText().toString());
itemView.getContext().startActivity(i);
}
}
});
}
}
public interface OnItemClickListener{
void onItemClick (DocumentSnapshot documentSnapshot, int position);
}
public void setOnItemClickListener(OnItemClickListener listener){
this.listener = listener;
}
}
第一张图是玩家必须玩时在他的 RecyclerView 中看到的,第二张是对手看到的:
解决方案
经过长时间的尝试,我找到了解决方案。我使用了 == 运算符,它比较两个对象的引用,而不是字符串。要比较字符串,我必须使用.equals()
. 我很惊讶,因为 Android Studio 向我显示“字符串是使用 '==' 而不是 'equals()' 进行比较的,所以可能存在错误。
这是正确的 if-else 语句:
if (mTurn.equals(uid)){
holder.textViewPlay.setText("Wait");
}else {
holder.textViewPlay.setText("Play");
}
推荐阅读
- visual-studio-code - 在 VS Code 中关闭文件夹时如何折叠子文件夹?
- error-handling - Rust `From` 特征、错误、引用 vs Box 和 `?` 运算符
- php - 访问对象数组
- numpy - Numpy 乘法并创建新列表 B[i] = Product(A[j]) 其中 j =! 一世
- java - 如何在 spring-boot 应用程序中配置多个 Keycloak sso 客户端?
- r - Rasch:模型和组分析的决定
- javascript - 为什么模板字符串中的数组显示为普通字符串?
- python - 如何将 .csv 文件从 MacBook 导入到 jupyter
- pandas - python中单列的多列
- vue.js - 如何从graphql中的父引用节点中查找子节点