Android 根据Firestore中的值,使用if-else语句更改RecyclerView中的TextView
我正在开发一个游戏,当前用户可以在一个RecyclerView中看到他当前的所有游戏(见图)。为此,我正在使用Firestore用户界面,我想将文本视图更改为“播放”或“等待”,这取决于当前用户必须播放还是对手必须播放。为此,我在文档中做了一个字段“turn”,其中RecycleServiceAdapter检索其值,并为其提供当前玩家或对手的UID值(取决于谁必须玩) 因此,当当前用户必须玩游戏时,他应该在RecyclerView项中看到文本视图中的“玩”,而对手必须看到“等待”(见图)。为了获得所需的结果,我想实现一个if-else语句,但不幸的是if语句中的Android 根据Firestore中的值,使用if-else语句更改RecyclerView中的TextView,android,firebase,android-recyclerview,google-cloud-firestore,Android,Firebase,Android Recyclerview,Google Cloud Firestore,我正在开发一个游戏,当前用户可以在一个RecyclerView中看到他当前的所有游戏(见图)。为此,我正在使用Firestore用户界面,我想将文本视图更改为“播放”或“等待”,这取决于当前用户必须播放还是对手必须播放。为此,我在文档中做了一个字段“turn”,其中RecycleServiceAdapter检索其值,并为其提供当前玩家或对手的UID值(取决于谁必须玩) 因此,当当前用户必须玩游戏时,他应该在RecyclerView项中看到文本视图中的“玩”,而对手必须看到“等待”(见图)。为了获
textViewTurn.getText().toString()
没有值,但当我将值作为意图发送到下一个活动时,它有一个值,因此if-else语句不起作用。如何在CurrentGamesHolder
中获取此文本视图的值?我应该在RecyclerAdapter的其他地方使用if-else语句吗
编辑:
现在,我将if-else语句移动到onBindViewHolder
中,其中mTurn
和uid
都有一个值,但该方法仍然不起作用。这意味着当我登录到播放器1的帐户时,textViewPlay
显示与播放器2相同的“等待”。在两个帐户中,uid
的值是不同的,因此我实际上不知道两个帐户中的结果如何可能是相同的,因为根据if-else语句,它不应该是相同的
非常感谢您的帮助
这是我的RecycleServiceAdapter:
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;
}
}
公共类CurrentGameAdapter扩展FirestoreRecyclerAdapter{
私人监听;
public CurrentGameAdapter(@NonNull FirestoreRecyclerOptions选项){
超级(期权);
}
@凌驾
受保护的无效onBindViewHolder(@NonNull CurrentGamesHolder,int位置,@NonNull CurrentGames模型){
holder.textViewTurn.setText(model.getTurn());
holder.textViewPlay.setText(“”);
...
mTurn=model.getTurn();
FirebaseUser currentUser=FirebaseAuth.getInstance().getCurrentUser();
字符串mCurrentUser=currentUser.getUid();
if(mTurn==mCurrentUser){
holder.textViewPlay.setText(“播放”);
}else if(mTurn!=mCurrentUser){
holder.textViewPlay.setText(“等待”);
}
}
@非空
@凌驾
public CurrentGamesHolder onCreateViewHolder(@NonNull ViewGroup父级,int viewType){
View View=LayoutInflater.from(parent.getContext()).flate(R.layout.listitem\u current\u game,parent,false);
返回新的CurrentGamesHolder(视图);
}
类CurrentGamesHolder扩展了RecyclerView.ViewHolder{
TextView textViewTurn,textViewPlay;
...
public-CurrentGamesHolder(@NonNull-View-itemView){
超级(项目视图);
textViewPlay=itemView.findViewById(R.id.play\u current\u game);
textViewTurn=itemView.findViewById(R.id.turn\u当前游戏);
textViewTurn.setVisibility(View.INVISIBLE);
...
itemView.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
int position=getAdapterPosition();
if(position!=RecyclerView.NO_position&&listener!=null){
onItemClick(getSnapshots().getSnapshot(position),(position));
Intent i=新的Intent(itemView.getContext(),PlayInterimResultMainActivity.class);
i、 putExtra(“turn”,textViewTurn.getText().toString());
itemView.getContext().startActivity(i);
}
}
});
}
}
公共接口侦听器{
void onItemClick(DocumentSnapshot DocumentSnapshot,int位置);
}
公共void setOnItemClickListener(OnItemClickListener侦听器){
this.listener=listener;
}
}
第一张图片是玩家在必须比赛时在其回收视图中看到的,第二张图片是对手看到的:
RecyclerView仅为适合屏幕的视图创建视图(通过调用构造函数),然后根据适合屏幕的对象(使用onBindViewHolder方法)使用数据填充视图
if-else块位于ViewHolder构造函数中,此时,还没有绑定它。此时,TextView中的文本就是放置在xml文件中的文本,这就是为什么它是空的。if-else语句应该在onBindViewHolder方法中。经过长时间的尝试,我找到了解决方案。我使用了==运算符,它比较两个对象的引用,而不是字符串。要比较字符串,我必须使用
.equals()
。我很惊讶,因为Android Studio向我显示“字符串是使用“==”而不是“equals()”进行比较的,所以这可能有一个bug
下面是正确的if-else语句:
if (mTurn.equals(uid)){
holder.textViewPlay.setText("Wait");
}else {
holder.textViewPlay.setText("Play");
}
是的,我注意到了这一点,但我不知道如何在onBindViewHolder中实现if-else语句。(请参阅我更新的问题)