Я не понимаю, почему эффективно применять слушателя к держателю.
Я провел большую часть дня, просматривая статьи.Темы здесь на 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.