Как исправить мой onClick cardView, который возвращает другие цифры - PullRequest
1 голос
/ 01 октября 2019

У меня есть переработчик, который показывает список предметов, там цену и статус. Когда я нажимаю на карточку, я хочу, чтобы она показала цену товара, на который я нажал. Однако всякий раз, когда я нажимаю. Карта возвращает данные других карт, а не ту карту, на которую я нажал.

    public class ItemAdapter extends RecyclerView.Adapter<ItemAdapter.ItemHolder> {
private TextView viewName, viewPrice;
private CheckBox viewAvailability;

private Context context;
private List<Item> listItems;

@NonNull
@Override
public ItemAdapter.ItemHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {

    View view = LayoutInflater.from(context).inflate(R.layout.list_item, parent, false);
    return new ItemAdapter.ItemHolder(view);
}

@Override
public void onBindViewHolder(@NonNull ItemAdapter.ItemHolder holder, int position) {
    Item item = listItems.get(position);
    holder.setDetails(item);

}

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


public class ItemHolder extends RecyclerView.ViewHolder {
    public ItemHolder(final View itemView) {
        super(itemView);
        viewName = itemView.findViewById(R.id.viewName);
        viewPrice = itemView.findViewById(R.id.viewPrice);
        viewAvailability = itemView.findViewById(R.id.viewAvailability);


        itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {


            }
        });
    }

    public void setDetails(Item item) {
        viewName.setText(item.getName());
        viewPrice.setText(item.getPrice());
        int as = item.getAvailabilityStatus();

        if (as == 1) {
            viewAvailability.setChecked(true);
        } else {
        }
    }
}

public ItemAdapter(Context context, List<Item> objects) {
    this.context = context;
    this.listItems = objects;
}

}

Ответы [ 4 ]

0 голосов
/ 01 октября 2019

Попробуйте этот код ...

public class ItemAdapter extends RecyclerView.Adapter<ItemAdapter.ItemHolder> {


private Context context;
private List<Item> listItems;

@NonNull
@Override
public ItemAdapter.ItemHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {

    View view = LayoutInflater.from(context).inflate(R.layout.list_item, parent, false);
    return new ItemHolder(view);
}

@Override
public void onBindViewHolder(@NonNull ItemAdapter.ItemHolder holder, int position) {
    Item item = listItems.get(position);
    holder.viewName.setText(item.getName());
    holder.viewPrice.setText(item.getPrice());
    int as = item.getAvailabilityStatus();

    if (as == 1) {
        holder.viewAvailability.setChecked(true);
    } else {
        holder.viewAvailability.setChecked(false);
    }

}

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


public class ItemHolder extends RecyclerView.ViewHolder {

    private TextView viewName, viewPrice;
    private CheckBox viewAvailability;

    public ItemHolder(final View itemView) {
        super(itemView);
        viewName = itemView.findViewById(R.id.viewName);
        viewPrice = itemView.findViewById(R.id.viewPrice);
        viewAvailability = itemView.findViewById(R.id.viewAvailability);




        itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {


            }
        });
    }
}

public ItemAdapter(Context context, List<Item> objects) {
    this.context = context;
    this.listItems = objects;
}

}

0 голосов
/ 01 октября 2019

Insted of itemView.setOnClickListener используйте set clickListener на вашем cardView и используйте getAdapterPosition() для отслеживания того, на каком объекте вы щелкнете

 cardView= itemView.findViewById(R.id.cardView);

        cardView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
            int price = getThePrice(getAdapterPosition());
            // use price here
            }
        });

, вам нужно создать здесь метод getThePrice(), который вернет вам ценуэлемент, который вы нажимаете.

0 голосов
/ 01 октября 2019

Я только что исправил ваш код, пожалуйста, проверьте его один раз.

public class ItemAdapter extends RecyclerView.Adapter<ItemAdapter.ItemHolder> {


    private Context context;
    private List<Item> listItems;

    public ItemAdapter(Context context, List<Item> objects) {
        this.context = context;
        this.listItems = objects;
    }

    @NonNull
    @Override
    public ItemAdapter.ItemHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {

        View view = LayoutInflater.from(context).inflate(R.layout.list_item, parent, false);
        return new ItemAdapter.ItemHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull ItemAdapter.ItemHolder holder, int position) {
        Item item = listItems.get(position);

        holder.viewName.setText(item.getName());
        holder.viewPrice.setText(item.getPrice());
        int as = item.getAvailabilityStatus();

        if (as == 1) {
            holder.viewAvailability.setChecked(true);
        } else {
        }

    }

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


    public class ItemHolder extends RecyclerView.ViewHolder {
        private TextView viewName, viewPrice;
        private CheckBox viewAvailability;

        public ItemHolder(final View itemView) {
            super(itemView);
            viewName = itemView.findViewById(R.id.viewName);
            viewPrice = itemView.findViewById(R.id.viewPrice);
            viewAvailability = itemView.findViewById(R.id.viewAvailability);


            itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {

                    Toast.makeText(context,"Clickde"+getAdapterPosition(),Toast.LENGTH_SHORT);
                }
            });
        }


    }


}

Возникла какая-то проблема в вашем коде, например, вам нужно надуть данные внутри onBindViewHolder, и вторая проблема заключается в том, что вывыполняете щелчок на itemView, что было неправильно, вам нужно выполнить щелчок на представлении, таком как TextView, ImagView ИЛИ LinearLayout, чтобы получить прослушиватель щелчков ... В своем коде вы выполнили щелчок на щелчке представления. Поэтому он получает неправильную позицию

0 голосов
/ 01 октября 2019

Попробуйте этот код, поместите itemView onclick listner внутри setDetails

public void setDetails(Item item) {
        viewName.setText(item.getName());
        viewPrice.setText(item.getPrice());
        int as = item.getAvailabilityStatus();

        if (as == 1) {
            viewAvailability.setChecked(true);
        } else {
        }

        itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                // here you will able to access valid item
            }
        });
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...