RecyclerView上的项目单击侦听器不会被调用

时间:2019-07-07 18:20:59

标签: android-studio android-recyclerview onclick adapter

因此,我已经在其他适配器中成功实现了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);
}

0 个答案:

没有答案