尝试在Recyclerview中实现ClickListener时出错



我正在尝试在适配器中实现对话段的clickListener的头。

我在代码线上遇到错误:

holder.bind(tzmodel.get(位置(,侦听器(;

错误说(在视图持有人中bind((无法应用(。似乎它与视图持有人代码不符。

有人可以协助吗?

我的TimeZoneadapter的代码:

public class timeZoneAdapter extends RecyclerView.Adapter<timeZoneAdapter.ViewHolder> {
    public interface OnItemClickListener {
        void onItemClick(TimezoneModel item);
    }
    private Context c;
    private List<TimezoneModel> tzmodel;
    private final OnItemClickListener listener;
    public timeZoneAdapter(Context c, List<TimezoneModel> tzModel, OnItemClickListener listener) {
        this.c = c;
        this.tzmodel = tzModel;
        this.listener = listener;
    }
    //INITIALIE TZ
    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.timezonemodel, parent, false);
        return new ViewHolder(v);
    }
    @Override
    public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
        holder.bind(tzmodel.get(position), listener); <-- error
    }
    @Override
    public int getItemCount() {
        return tzmodel.size();
    }
    class ViewHolder extends RecyclerView.ViewHolder {
        TextView timeTxt, currenttimeTxt, regionTxt;
        public ViewHolder(View itemView) {
            super(itemView);
            timeTxt= (TextView) itemView.findViewById(R.id.timeTxt);
            currenttimeTxt= (TextView) itemView.findViewById(R.id.currentTimeTxt);
            regionTxt= (TextView) itemView.findViewById(R.id.regionTxt);
        }
        public void bind(ViewHolder viewHolder, int i, final OnItemClickListener listener) {
            viewHolder.timeTxt.setText(tzmodel.get(i).getTime());
            viewHolder.currenttimeTxt.setText(tzmodel.get(i).getCurrentTime());
            viewHolder.regionTxt.setText(tzmodel.get(i).getRegion());
            itemView.setOnClickListener(new View.OnClickListener() {
                @Override public void onClick(View v) {
                    listener.onItemClick((TimezoneModel) tzmodel);
                }
            });
        }
    }
}

问题是您在定义的绑定方法中放置的参数。

您以这种方式定义了在视图持有人类中绑定的公共方法:

public void bind(ViewHolder viewHolder, int i, final OnItemClickListener listener){
   //...
}

您可以修复编译错误将呼叫更改为:

@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
        holder.bind(holder,position, listener); 
}

我还与您分享了几个更正,因为如果您在视图持有人类中创建公共方法,则无需配置Viewholder实例,因为您可以与此操作员访问:


public class TimeZoneAdapter extends RecyclerView.Adapter<TimeZoneAdapter.ViewHolder> {
    public interface OnItemClickListener {
        void onItemClick(TimezoneModel item);
    }
    private Context c;
    private List<TimezoneModel> tzmodel;
    private final OnItemClickListener listener;
    public TimeZoneAdapter(Context c, List<TimezoneModel> tzModel, OnItemClickListener listener) {
        this.c = c;
        this.tzmodel = tzModel;
        this.listener = listener;
    }
    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.item, parent, false);
        return new ViewHolder(v);
    }
    @Override
    public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
        holder.bind(tzmodel.get(position), listener);
    }
    @Override
    public int getItemCount() {
        return tzmodel.size();
    }
    class ViewHolder extends RecyclerView.ViewHolder {
        TextView timeTxt, currenttimeTxt, regionTxt;
        public ViewHolder(View itemView) {
            super(itemView);
            timeTxt= itemView.findViewById(R.id.timeTxt);
            currenttimeTxt= itemView.findViewById(R.id.currentTimeTxt);
            regionTxt= itemView.findViewById(R.id.regionTxt);
        }
        public void bind(TimezoneModel item , final OnItemClickListener listener) {
            this.timeTxt.setText(item.getTime());
            this.currenttimeTxt.setText(item.getCurrentTime());
            this.regionTxt.setText(item.getRegion());
            itemView.setOnClickListener(new View.OnClickListener() {
                @Override public void onClick(View v) {
                    listener.onItemClick((TimezoneModel) tzmodel);
                }
            });
        }
    }
}

最新更新