RecyclerView при прослушивании щелчка элемента не вызывается - PullRequest
0 голосов
/ 07 июля 2019

Итак, я успешно реализовал 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);
}
...