Ошибка при попытке реализовать ClickListener в Recyclerview - PullRequest
0 голосов
/ 26 мая 2019

Я бьюсь над головой, пытаясь внедрить ClickListener в адаптер для DialogFragment.

Я получаю сообщение об ошибке в кодовой строке:

holder.bind (tzmodel.get (position), listener);

Ошибка говорит (bind () в ViewHolder не может быть применен).Кажется, он не соответствует коду ViewHolder.

Может кто-нибудь помочь?

Код для моего 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);
                }
            });
        }
    }
}

1 Ответ

0 голосов
/ 26 мая 2019

Проблема в параметрах, которые вы указываете в методе связывания, который вы определяете.

Вы определяете публичный метод bind в классе ViewHolder следующим образом:

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, вам не нужно создавать рецепт экземпляра 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);
                }
            });
        }
    }
}


Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...