首页 > 解决方案 > 根据 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 语句移到onBindViewHolderwhere 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 中看到的,第二张是对手看到的:

在此处输入图像描述

在此处输入图像描述

标签: androidfirebaseandroid-recyclerviewgoogle-cloud-firestore

解决方案


经过长时间的尝试,我找到了解决方案。我使用了 == 运算符,它比较两个对象的引用,而不是字符串。要比较字符串,我必须使用.equals(). 我很惊讶,因为 Android Studio 向我显示“字符串是使用 '==' 而不是 'equals()' 进行比较的,所以可能存在错误。

这是正确的 if-else 语句:

if (mTurn.equals(uid)){
            holder.textViewPlay.setText("Wait");
        }else {
            holder.textViewPlay.setText("Play");
        }

推荐阅读