【问题标题】:Changing a TextView in RecyclerView with if-else statement depending on a value from Firestore根据 Firestore 中的值,使用 if-else 语句更改 RecyclerView 中的 TextView
【发布时间】:2020-04-05 06:24:07
【问题描述】:

我正在开发一个游戏,当前用户可以在 RecyclerView 中查看他当前的所有游戏(见图)。为此,我正在使用 Firestore UI,并且我想将 TextView 更改为“播放”或“等待”,具体取决于当前用户必须玩还是对手必须玩。为此,我在 RecyclerViewAdapter 检索其值并为其提供当前玩家或对手的 UID 的值(取决于谁必须玩)的文档中创建了一个字段“转”。

所以当当前用户必须玩时,他应该在 RecyclerView 项目中看到“Play”作为 TextView,而对手必须看到“Wait”(见图)。为了获得所需的结果,我想实现一个 if-else 语句,但不幸的是 if 语句中的 textViewTurn.getText().toString() 没有值,但是当我将值作为意图发送到下一个 Activity 时它有一个值,所以我的 if else 语句是不工作。如何在CurrentGamesHolder 中获取此 TextView 的值?我应该在 RecyclerAdapter 的其他地方使用 if else 语句吗?

编辑: 我现在将 if else 语句移到 onBindViewHolder 中,其中 mTurnuid 都有一个值,但该方法仍然不起作用。这意味着当我登录玩家 1 的帐户时,textViewPlay 显示“等待”,这与玩家 2 相同。uid 的值在两个帐户中是不同的,所以我实际上不知道如何两个帐户中的结果可能是相同的,因为根据 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 中看到的,第二张是对手看到的:

【问题讨论】:

    标签: android firebase android-recyclerview google-cloud-firestore


    【解决方案1】:

    RecyclerView 仅为适合屏幕的视图创建视图(通过调用构造函数),然后根据适合屏幕的对象(使用 onBindViewHolder 方法)使用您的数据填充它。

    您的 if-else 块在您的 ViewHolder 构造函数中,而在那一刻,您还没有绑定它。在那一刻,你的 textviews 中的文本就是你放在 xml 文件中的文本,这就是它为空的原因。 if-else 语句应该在 onBindViewHolder 方法中。

    【讨论】:

    • 是的,我注意到了,但我不知道如何在 onBindViewHolder 中实现 if-else 语句。(请参阅我更新的问题)
    【解决方案2】:

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

    这是正确的 if-else 语句:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-09-06
      • 2018-04-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多