Problem with RecyclerView adapter

0

I have a reservation RecyclerView loaded from an adapter, the final result is the image that I place below:

The problem is that when wanting to select an option like 'View Detail' I can not obtain the data of the reserve entity and from its id look for the details of it. Next, the adapter code

public class MisReservasAdapter extends RecyclerView.Adapter<MisReservasAdapter.ViewHolder> {

private List<ReservasApi> list;
private View.OnClickListener listener;


public MisReservasAdapter(List<ReservasApi> list, Context mCtx, View.OnClickListener listener) {
    this.list = list;
    Context mCtx1 = mCtx;
    this.listener = listener;
}

@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View v = LayoutInflater.from(parent.getContext())
            .inflate(R.layout.rv_reservas, parent, false);
    return new ViewHolder(v);
}

@Override
public void onBindViewHolder(final MisReservasAdapter.ViewHolder holder, int position) {
    ReservasApi myList = list.get(position);

    holder.txtEstado.setText(myList.getEstado());

    int idEstado = myList.getIdEstado();

    if(idEstado==2){
        holder.imgEstado.setImageResource(R.drawable.ic_confirm);
    }else if(idEstado == 5){
        holder.imgEstado.setImageResource(R.drawable.ic_cancel);
    }

    holder.txtFecha.setText(myList.getFechaReserva());

    holder.buttonViewOption.setOnClickListener(listener);
}

@Override
public int getItemCount() {
    return list.size();
}


public class ViewHolder extends RecyclerView.ViewHolder {

    @BindView(R.id.txtEstado)
    public TextView txtEstado;
    @BindView(R.id.txtFecha)
    public TextView txtFecha;
    @BindView(R.id.txtOptions)
    public TextView buttonViewOption;
    @BindView(R.id.imgEstado)
    public ImageView imgEstado;

    public ViewHolder(View itemView) {
        super(itemView);
        ButterKnife.bind(this,itemView);
    }
}}

Then the adapter instance is created in the onPostExecute of an AsyncTask

      protected void onPostExecute(String s) {
        if (!TextUtils.isEmpty(s)) {
            // forma 1
            Type listType = new TypeToken<ArrayList<ReservasApi>>() {
            }.getType();
            final List<ReservasApi> reservas = new Gson().fromJson(s, listType);

            adapter = new MisReservasAdapter(reservas, getContext(), new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    //creating a popup menu
                    PopupMenu popup = new PopupMenu(getContext(), v);
                    //inflating menu from xml resource
                    popup.inflate(R.menu.options_reservas);
                    //adding click listener
                    popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
                        @Override
                        public boolean onMenuItemClick(MenuItem item) {
                            switch (item.getItemId()) {
                                case R.id.VerDetalle:
                                    new GetDetalleReserva().execute(3051);
                                    break;
                                case R.id.Cancelar:
                                    Toast.makeText(getContext(),"Cancelar todo esto",Toast.LENGTH_LONG).show();
                                    break;
                            }
                            return false;
                        }
                    });
                    popup.show();
                }
            });
            recyclerView.setAdapter(adapter);

        } else {
            Toast.makeText(getContext(), "Ha ocurrido un error", Toast.LENGTH_LONG).show();
        }
    } 
    
asked by DavidC 01.09.2018 в 15:08
source

1 answer

0

The solution to your problem is to implement the interface within the view holder, as I have shown you in the example. Within the public void onClick (View view) {method                     if (mClickListener! = null) mClickListener.onItemClick (view, getAdapterPosition ());                 }, you can place the business logic of your application, now that you can already know the view that has been pressed and the position inside the adapter. Or place the clickListner inside the ViewHolder constructor like this:

@BindView(R.id.imgEstado)
public ImageView imgEstado;

        public ViewHolder(View itemView) {
            super(itemView);
            ButterKnife.bind(this,itemView);
            imgEstado.setOnClickListener(this);
        }

To put the item to the listening:

public class MisReservasAdapter extends RecyclerView.Adapter<MisReservasAdapter.ViewHolder> {

    private List<ReservasApi> list;
    private View.OnClickListener listener;


    public MisReservasAdapter(List<ReservasApi> list, Context mCtx) {
        this.list = list;
        Context mCtx1 = mCtx;
    }

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View v = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.rv_reservas, parent, false);
        return new ViewHolder(v);
    }

    @Override
    public void onBindViewHolder(final MisReservasAdapter.ViewHolder holder, int position) {
        ReservasApi myList = list.get(position);

        holder.txtEstado.setText(myList.getEstado());

        int idEstado = myList.getIdEstado();

        if(idEstado==2){
            holder.imgEstado.setImageResource(R.drawable.ic_confirm);
        }else if(idEstado == 5){
            holder.imgEstado.setImageResource(R.drawable.ic_cancel);
        }

        holder.txtFecha.setText(myList.getFechaReserva());

        holder.buttonViewOption.setOnClickListener(listener);
    }

    @Override
    public int getItemCount() {
        return list.size();
    }


    public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {

        @BindView(R.id.txtEstado)
        public TextView txtEstado;
        @BindView(R.id.txtFecha)
        public TextView txtFecha;
        @BindView(R.id.txtOptions)
        public TextView buttonViewOption;
        @BindView(R.id.imgEstado)
        public ImageView imgEstado;

        public ViewHolder(View itemView) {
            super(itemView);
            ButterKnife.bind(this,itemView);
            itemView.setOnClickListener(this);
        }

    @Override
            public void onClick(View view) {
                if (mClickListener != null) mClickListener.onItemClick(view, getAdapterPosition());
            }
    }
    // allows clicks events to be caught
        public void setClickListener(ItemClickListener itemClickListener) {
            this.mClickListener = itemClickListener;
        }

        // parent activity will implement this method to respond to click events
        public interface ItemClickListener {
            void onItemClick(View view, int position);
        }
    }
    
answered by 01.09.2018 в 16:17