Получить значение родительского ключа по клику ребенка в представлении реселлера из базы данных Firebase - PullRequest
0 голосов
/ 06 ноября 2019

Я создаю представление переработчика, в котором я получаю Имя опроса, которое является дочерним по отношению к номеру опроса в базе данных Firebase. Я хочу, чтобы, когда пользователь нажимал на название опроса в списке переработчиков, он получал родительское значение KeyValue (которое является ссылочным номером опроса). Я приложил изображение базы данных. При нажатии на название опроса, которое обведено синей линией, родительский ключ должен быть затенен желтой линией

enter image description here

Я использовал интерфейс в классе адаптера, где я нахожусьполучение позиции и моделиОтзывы

public SurveysListAdapter(List<SurveysListModel> modelList, Context context, HandleClickListener handleClickListener)
 {
        this.modelList = modelList;
        this.context = context;
        this.handleClickListener = handleClickListener;
    }

    @Override
    public void onBindViewHolder(@NonNull final SurveyListViewHolder holder, final int position) {
        final SurveysListModel response = modelList.get(position);
        holder.questions.setText(response.getSurvey_name());
        holder.itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                handleClickListener.onItemClicked(position, modelList.get(position));
            }
        });
    }
    public interface HandleClickListener {
        void onItemClicked(int position, SurveysListModel surveysListModel);
    }

Затем в Activity Iam это выглядит так

databaseReference.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

                for (final DataSnapshot parentSnap : dataSnapshot.getChildren()) {

                    if (parentSnap.exists()) {
                        progressDialog.dismiss();
                        SurveysListModel model = parentSnap.getValue(SurveysListModel.class);
                        list.add(model);

                        adapter = new SurveysListAdapter(list, UserAllSurveys.this, new SurveysListAdapter.HandleClickListener() {
                            @Override
                            public void onItemClicked(int position, SurveysListModel surveysListModel) {
                                String typ = surveysListModel.getSurvey_name();
                                Toast.makeText(UserAllSurveys.this, "CLicked" + position, Toast.LENGTH_SHORT).show();
                            }
                        });
                        recyclerView.setAdapter(adapter);
                    }

1 Ответ

2 голосов
/ 06 ноября 2019

Чтобы сделать это, вам нужно сделать две вещи:

  1. Сделать значения parentSnap.getKey() доступными для вашего адаптера, так же, как вы уже делаете для объектов parentSnap.getValue(...).
  2. Найдите правильный ключ для значения, по которому щелкнул пользователь, обычно путем поиска его по положению.

Чтобы сделать ключи доступными, у вас снова есть два варианта:

  1. Добавьте поле для этого ключа в свой класс SurveysListModel, а затем установите его после получения значения.

  2. Поддерживайте отдельный List<String> keyListв дополнение к существующему List<SurveysListModel> modelList и передайте оба в конструктор вашего адаптера.

В обоих случаях код будет выглядеть одинаково, поэтому я просто сосредоточусь на том, как получитьключ, а затем, например, передать его в объект `` (так # 1 выше):

public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

    for (final DataSnapshot parentSnap : dataSnapshot.getChildren()) {
        progressDialog.dismiss();
        SurveysListModel model = parentSnap.getValue(SurveysListModel.class);
        model.key = parentSnap.getKey();
        list.add(model);
    }

    adapter = new SurveysListAdapter(list, UserAllSurveys.this, new SurveysListAdapter.HandleClickListener() {
        @Override
        public void onItemClicked(int position, SurveysListModel surveysListModel) {
            String typ = surveysListModel.getSurvey_name();
            String key = surveysListModel.key;
            Toast.makeText(UserAllSurveys.this, "CLicked " + key, Toast.LENGTH_SHORT).show();
        }
    });
    recyclerView.setAdapter(adapter);

Что я изменил здесь:

  1. Удалите if (parentSnap.exists()) {, так как тамэто не может быть ложным в цикле по getChildren().
  2. Передать ключ на model.key = parentSnap.getKey();. Вам нужно будет добавить это поле key в ваш класс и, вероятно, пометить его как @Exclude, чтобы убедиться, что оно не записывается в базу данных:

    @Exclude 
    String key;
    
  3. Переместите весь блок adapter = new SurveysListAdapter за пределы цикла над getChildren(), что, как я полагаю, было ошибкой копирования / вставки в исходном коде.

  4. Считайте, что они возвращают ключ от объектас String key = surveysListModel.key;, когда пользователь нажимает на элемент.

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