I am bumbing my head on trying to implement a ClickListener in an adapter for a DialogFragment.
I am getting the error on the codeline:
holder.bind(tzmodel.get(position), listener);
Error says (bind() in ViewHolder cannot be applied). Seems it does not match the ViewHolder code.
Could somebody please assist?
The code for my 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);
}
});
}
}
}
The problem is the parameters that you put in the bind method that you define.
You define the public method bind in the ViewHolder class in this way:
public void bind(ViewHolder viewHolder, int i, final OnItemClickListener listener){
//...
}
You can fix your compile error change the call to :
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
holder.bind(holder,position, listener);
}
I also share with you a couple of correction because if you create a public method in the ViewHolder class, you don't need to recipe the viewHolder instance because you can access with this operator:
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);
}
});
}
}
}
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.