Итак, я успешно реализовал onClickListener в других моих адаптерах, однако по какой-то причине он не работает для этого.
Как гласит заголовок, всякий раз, когда я нажимаю на элемент в моем представлении переработчика,мой метод onClickListener внутри моего адаптера и держателя представления не вызывается.
Я сравнил свой код с большим количеством ответов, но проблема остается.Я действительно растерялся из-за этого, так как способов сделать это не так много.
Вот как я инициализирую свой адаптер:
recyclerView = view.findViewById(R.id.frag_calendar_recycler_view);
recyclerView.setHasFixedSize(true);
recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
mAdapter = new CalendarAdapter(getContext(),new ArrayList<Section>());
mAdapter.setClickListener(this);
recyclerView.setAdapter(mAdapter);
recyclerView.addItemDecoration(new CalendarDecoration(mAdapter));
Вот как выглядят мой адаптер и держатели просмотранапример:
public class CalendarAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> implements StickyHeaderInterface {
private ArrayList<Section> items;
private LayoutInflater mInflater;
private ItemClickListener mListener;
public CalendarAdapter (Context context, ArrayList<Section> items) {
mInflater = LayoutInflater.from(context);
this.items = items;
}
@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int i) {
View view;
switch (i) {
case 0:
view = mInflater.inflate(R.layout.item_calendar_header, parent, false);
return new HeaderViewHolder(view);
default:
view = mInflater.inflate(R.layout.item_calendar, parent, false);
return new ItemViewHolder(view);
}
}
@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder viewHolder, int i) {
if (viewHolder instanceof HeaderViewHolder) {
((HeaderViewHolder) viewHolder).bindData(i);
} else {
((ItemViewHolder) viewHolder).bindData(i);
}
}
public interface ItemClickListener {
void onItemClick(View view, int position);
}
public void setClickListener(ItemClickListener clickListener) {
mListener = clickListener;
}
public Section getItem(int position) {
return items.get(position);
}
public void setItems(List<Section> items) {
if (items == null) {
throw new IllegalArgumentException("List to set in the RecyclerView is null");
}
this.items.clear();
this.items.addAll(items);
notifyDataSetChanged();
}
@Override
public int getHeaderPositionForItem(int itemPosition) {
int headerPosition = 0;
do {
if (this.isHeader(itemPosition)) {
headerPosition = itemPosition;
break;
}
itemPosition -= 1;
} while (itemPosition >= 0);
return headerPosition;
}
@Override
public void bindHeaderData(View view, int headerPosition) {
if (items.get(headerPosition).getViewType() == 0) {
TextView header = view.findViewById(R.id.item_calendar_header_date);
header.setText(getDateFormat(items.get(headerPosition).getEvent().getDate_stamp()));
}
}
@Override
public int getItemViewType(int position) {
return items.get(position).getViewType();
}
@Override
public int getItemCount() {
return items.size();
}
@Override
public int getHeaderLayout(int headerPosition) {
return R.layout.item_calendar_header;
}
@Override
public boolean isHeader(int itemPosition) {
return items.get(itemPosition).getViewType() == 0;
}
class HeaderViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
public HeaderViewHolder(@NonNull View view) {
super(view);
}
public void bindData(int i) {
// Do something
}
@Override
public void onClick(View v) {
System.out.println("Clicked the item " +getAdapterPosition());
if (mListener != null) mListener.onItemClick(v, getAdapterPosition());
}
}
class ItemViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
public ItemViewHolder(@NonNull View itemView) {
super(itemView);
}
public void bindData(int i) {
// Do something
}
@Override
public void onClick(View v) {
System.out.println("Clicked the item " + getAdapterPosition());
if (mListener != null) mListener.onItemClick(v, getAdapterPosition());
}
}
}
Наконец, вот где я ловлю его в своем фрагменте (обратите внимание, что я заставляю свой фрагмент расширять MyAdapter.ItemClickListener):
@Override
public void onItemClick(View view, int pos) {
System.out.println("HELLO CALENDAR FRAGMENT");
Event e = mAdapter.getItem(pos).getEvent();
String id = e.getTime_stamp()+"?"+e.getHost();
act.onClickLaunchEvent(id);
}