Как создать интерфейс между адаптером и вьюхолдером

Я хочу создать интерфейс между адаптером и держателем представления (этот держатель представления является внутренним классом другого адаптера), чтобы я мог обновить текстовое представление (номер). Как я могу это сделать?

Подробно:

У меня есть два вида корзины (основной список Recycler View и Sub List Recycler View, горизонтально расположенные, как показано на рис.), один из которых имеет номер (как один из его элементов), а другой - с флажком (как его элемент).

введите здесь описание изображения

У меня есть два адаптера FilterMainListAdapter и FilterSubListAdapter с держателями представления FilterMainListViewHolder и FilterSubListViewHolder, заполняющими поля.

Когда в представлении Recycler Sub List установлены флажки, я хочу, чтобы соответствующий номер в представлении Recycler основного списка обновлялся.

Для этого я использую и Interface.

public interface ChangeFilterMainNumber {
void OnChangeFilterMainNumberListener(int totalCheckedNumber);
}

У меня есть метод onClick для флажка внутри FilterSubListViewHolder, и я пытаюсь отправить общее число флажков с флажками следующим образом.

changeFilterMainNumber.OnChangeFilterMainNumberListener(totalCheckedNumber);

После этого я реализую ChangeFilterMainNumber интерфейс внутри FilterMainListViewHolder

public class FilterMainListViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener,
ChangeFilterMainNumber {...}

Но как я могу определить этот интерфейс внутри FilterSubListAdapter?

changeFilterMainNumber = ???;

[Если это активность, можно определить такой интерфейс changeFilterMainNumber = (ChangeFilterMainNumber) context внутри конструктора по умолчанию FilterSubListAdapter. Но как насчет держателя представления, который является внутренним классом другого адаптера?]

или есть лучший подход к поиску решения моей проблемы, кроме этого?

Обновление: код можно посмотреть здесь https://github.com/gSrikar/FilterScreen


person Srikar Reddy    schedule 09.09.2016    source источник


Ответы (1)


Если я реализую функцию так, как вы хотите, я буду реализовывать так: (Это похоже на шаблон Observer)

class Fragment/Activity implement OnChangeFilterMainNumberListener{
    FilterMainListAdapter mainAdapter;
    FilterSubListAdapter subAdapter;

    void oncreate() {
         mainAdapter = new FilterMainListAdapter(this);

    }

    @Override
    void OnChangeFilterMainNumberListener(int totalCheckedNumber) {
          .....
         // Update data to sub list
    }
}

class FilterMainListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>{

    public interface ChangeFilterMainNumber {
          void OnChangeFilterMainNumberListener(int totalCheckedNumber);
     }
    ChangeFilterMainNumber listener;
    FilterMainListAdapter(ChangeFilterMainNumber listener) {
         this.listener = listener;
    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
        item.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    if(listener != null) {
                            listener.OnChangeFilterMainNumberListener(position)
                    }
                }
            });
    }

}

class FilterSubListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>{


}
person RoShan Shan    schedule 09.09.2016
comment
Как я могу получить ссылку на отдельный элемент в представлении переработчика основного списка перед их обновлением в OnChangeFilterMainNumberListener? - person Srikar Reddy; 10.09.2016
comment
Я видел ваш проект выше, я обычно делаю так: в файле filter_main_list_items.xml вы указываете id для внешнего вида, например linearCover. И в FilterMainListAdapter, метод onBindViewHolder, вы делаете как выше мой код holder.linearCover.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if(listener != null) { listener.OnChangeFilterMainNumberListener(position) } } }); - person RoShan Shan; 10.09.2016