user.get (position) .getId () не работает - PullRequest
0 голосов
/ 25 января 2020

Я занимаюсь разработкой приложения для чата и хочу получать уникальный идентификатор (например, evrW ...) пользователя при каждом нажатии на его имя. Я использую getId () в классе модели, но он возвращает ноль.
enter image description here

public class Users {
    String username;
    String id;

    public Users(String username, String id) {
        this.username = username;
        this.id = id;
    }

    public Users() {
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }
}

Это та часть, где я получаю ошибку.

public class User_Adapter extends RecyclerView.Adapter<User_Adapter.ViewHolder> {

    private Context context;
    private List<Users> Username;

    public User_Adapter(Context context, List<Users> Username) {
        this.Username = Username;
        this.context = context;
    }

    @NonNull
    @Override
    public User_Adapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.user_item,parent,false);
        ViewHolder viewHolder=new ViewHolder(view);
        return viewHolder;
    }

    @Override
    public void onBindViewHolder(@NonNull User_Adapter.ViewHolder holder, final int position) {
        TextView name = holder.mView.findViewById(R.id.username);
    //        DatabaseReference reference = FirebaseDatabase.getInstance().getReference().child("User");
        name.setText(Username.get(position).getUsername());

        holder.mView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(context, chatActivity.class);
               String key = Username.get(position).getId();

                intent.putExtra("userId", key);
                context.startActivity(intent);
            }
        });

    }

    @Override
    public int getItemCount() {
        return Username.size();
    }

    public class ViewHolder extends RecyclerView.ViewHolder {
        View mView;
        public ViewHolder(@NonNull View itemView) {
            super(itemView);
            mView = itemView;
        }

    }
}

Часть getUsername () работает, но ключевая часть возвращает ноль. Пожалуйста, помогите.

Ответы [ 4 ]

1 голос
/ 25 января 2020

Вы должны query до база данных firebase , как показано ниже, чтобы получить UserId. Пожалуйста, проверьте:

@Override
public void onBindViewHolder(@NonNull User_Adapter.ViewHolder holder, final int position) {
    TextView name = holder.mView.findViewById(R.id.username);
    DatabaseReference reference = FirebaseDatabase.getInstance().getReference().child("User");
    name.setText(Username.get(position).getUsername());

    holder.mView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            reference.orderByChild("username").equalTo(Username.get(position).getUsername())
                    .addListenerForSingleValueEvent(new ValueEventListener() {
                @Override
                public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

                    String key = "";
                    for(DataSnapshot childSnapshot: dataSnapshot.getChildren()) {
                        key = childSnapshot.getKey();
                    }

                    Intent intent = new Intent(context, chatActivity.class);

                    intent.putExtra("userId", key);
                    context.startActivity(intent);
                }

                @Override
                public void onCancelled(@NonNull DatabaseError databaseError) {

                }
            });
        }
    });

}
0 голосов
/ 25 января 2020

Возможно, проблема в том, как вы устанавливаете List<Users>, который вы передаете в адаптер.

Что касается общей структуры Firebase и вашего POJO, то ясно, что объекты не будут хранить идентификаторы.

POJO должен представлять данные, хранящиеся под ключами коллекции User ( именуется evr .., quqj .., et c). Данные под этими ключами содержат только ключ - username, а не ключ - id. Поэтому, когда вы пытаетесь отобразить данные в пользовательской коллекции с использованием класса Users, значение username устанавливается, а значение id устанавливается на null.

Вы должны будете получить идентификаторы, как объяснил @Md. Asaduzzaman и используйте его так, как он использовал, или сохраните его в поле id вашего списка.

0 голосов
/ 25 января 2020

Во-первых, я бы переименовал ваш Users класс в User, поскольку он относится только к одному пользователю, а не к нескольким.

Далее, вместо того, чтобы называть ваш список Username, что делает его похожим на class, я бы переименовал его в mUserList, чтобы следовать соглашениям о присвоении имен.

Аналогичным образом, я бы переименовал chatActivity в ChatActivity, поскольку это имя класса, а не экземпляр.

Теперь к актуальной проблеме: вместо вызова mUserList.get(position) из обработчика щелчков проще и менее подвержено ошибкам вызывать его в начале onBindViewHolder и назначать его переменной final, которая Затем вы используете для обновления всего остального.

public class User_Adapter extends RecyclerView.Adapter<User_Adapter.ViewHolder> {
    private Context mContext;
    private List<User> mUserList;

    public User_Adapter(Context context) {
        this.mContext = context;
        this.mUserList = new ArrayList<>(); // create with empty user list
    }

    public User_Adapter(Context context, List<User> userList) {
        this.mContext = context;
        this.mUserList = userList;
    }

    @NonNull
    @Override
    public User_Adapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.user_item,parent,false);
        return new User_Adapter.ViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull User_Adapter.ViewHolder holder, final int position) {
        final User user = this.mUserList.get(position);

        holder.mTxtViewUsername.setText(user.getUsername());

        holder.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(mContext, ChatActivity.class);
                String userId = user.getId();
                intent.putExtra("userId", userId);
                mContext.startActivity(intent);
            }
        });
    }

    @Override
    public int getItemCount() {
        return mUserList.size();
    }

    public static class ViewHolder extends RecyclerView.ViewHolder {
        private mTxtViewUsername;

        public ViewHolder(View v) {
            super(v);
            this.mTxtViewUsername = v.findViewById(R.id.username);
        }
    }
}
0 голосов
/ 25 января 2020

Возврат this.id вместо id в вашей getId функции

public String getId() {
    return this.id;
}

То же самое происходит с getUsername функцией

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...