Почему предлагается присоединить onClickListener к ViewHolder? - PullRequest
0 голосов
/ 10 июля 2019

Я не понимаю, почему эффективно применять слушателя к держателю.

Я провел большую часть дня, просматривая статьи.Темы здесь на stackoverflow охватили диапазон хорошо.Выбор, который я нашел:

  • Присоединить к TextView - создает несколько слушателей.
  • Присоединить к ViewHolder - снова создает несколько слушателей, если только вы не создаете прослушиватель, а затем используете его для присоединения, которое вытакже можно сделать с TextView.
  • Прикрепить onItemTouchListener - удивительно сложный способ.

То, что я не видел, было просто прямым приспособлением View.OnClickListener, прикрепленным к адаптеру.Если вы сделаете это, то сгенерируйте один public void onClick(View view) и дайте адаптеру копию RecyclerView, а затем назначьте адаптер (этот) в качестве прослушивателя для представления элемента, которое вы надули в onCreateViewHolder.Затем получите доступ к позиции через функцию RecyclerView getChildAdapterPosition.См. Фрагменты кода.

//create adapter class implementing the on click listener
public class WordListAdapter extends RecyclerView.Adapter<WordListAdapter.WordViewHolder> implements View.OnClickListener {
    private final LinkedList<String> mWordList;
    private LayoutInflater mInFlater;
    private final RecyclerView recyclerView;

    //in constructor, pass in RecyclerView created in MainActivity 
    public WordListAdapter(Context context, LinkedList<String> wordList, RecyclerView rView) {
        recyclerView = rView; <----
        mInFlater = LayoutInflater.from(context);
        this.mWordList = wordList;
    }

    //implementation of View.OnClickListener makes
    @Override 
    public void onClick(View view) {
        //get the position of the item that was clicked
        int mPosition = recyclerView.getChildAdapterPosition(view); <----

        //other code to do what you want with the list(eg. String element = mWordList.get(mPosition);)
    }

    //And you set your pointer in the adapter class
    @Override
    public WordListAdapter.WordViewHolder onCreateViewHolder( @NonNull ViewGroup parent, int viewType) {
        View mItemView = mInFlater.inflate(R.layout.wordlist_item, parent, false);
        mItemView.setOnClickListener(this); <----
        return new WordViewHolder(mItemView, this);
    }

Мне кажется, что этот ответ прост и имеет преимущество в виде одного потока в прослушивателе кликов, который обрабатывается в адаптере списка.

Iдумаю, я в основном хотел поделиться своим решением на закрытую тему, но я, конечно, приветствую любые предложения о том, почему это не может быть лучше.На самом деле, это мое решение для вызова2 в основах Android 04.5 RecyclerView.

1 Ответ

0 голосов
/ 10 июля 2019

Предполагается, что основной причиной присоединения onClickListener к держателю представления в отличие от самого адаптера является то, что представление - это то, на что нажимают, когда пользователь нажимает на элемент в представлении Recyclerview.

Holder, на который вы ссылаетесь, является классом, который содержит представление, и применение прослушивателя щелчков к этому держателю позволяет вам определить, какое представление (позиция / элемент) фактически щелкается.

Это похоже на объяснение того, почему вы должны прикрепить прослушиватель щелчка к кнопке в макете, а не весь макет. Конечно, вы можете прикрепить прослушиватель щелчков ко всему макету, но пользователь может намереваться щелкнуть что-то другое в вашем представлении, в отличие от кнопки, и у вас не будет возможности отличить, какой из них был нажат, поскольку ваш clickListener не помогает определить, какие.

...