处理每个RecyclerView中的单击按钮并更新TextView值

时间:2017-09-14 19:02:31

标签: android android-recyclerview

当点击按钮时,我必须在同一位置更新TextView并完成它,但RecyclerView的第9和第10位置跟随第一个位置和第二个位置。换句话说,如果我点击第一个按钮位置,TextView的第一个位置会更新,但是,TextView的第9个位置也会更新,它应该不会更新。怎么解决这个问题?

我关注this link

这是我的适配器

class ProductsByStoreAdapter extends RecyclerView.Adapter<ProductsByStoreAdapter.ViewHolder> {

private ArrayList<Products> products;

 ProductsByStoreAdapter(ArrayList<Products> productses) {
     this.products = productses;
     //products = CenterRepository.getCenterRepository()
             //.getListOfProductsInShoppingList();
}

@Override
public ProductsByStoreAdapter.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
    View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.products_card_item, viewGroup, false);
    return new ProductsByStoreAdapter.ViewHolder(view);
}

class ViewHolder extends RecyclerView.ViewHolder{
    private TextView tv_product_name, tv_product_price, tv_product_quantity;
    private ImageView im_product_image;
    private ImageButton button_add_product, button_min_product;
    private EditText e_note;
    private LinearLayout layout_note;
    ViewHolder(View view) {
        super(view);

        im_product_image            = (ImageView)view.findViewById(R.id.product_image);
        tv_product_name             = (TextView)view.findViewById(R.id.product_name);
        tv_product_price            = (TextView)view.findViewById(R.id.product_price);
        tv_product_quantity         = (TextView)view.findViewById(R.id.product_quantity);
        e_note                      = (EditText)view.findViewById(R.id.e_note);
        layout_note                 = (LinearLayout)view.findViewById(R.id.layout_note);

        this.button_add_product = (ImageButton)view.findViewById(R.id.button_add_product);
        button_min_product = (ImageButton)view.findViewById(R.id.button_min_product);

    }
}

@Override
public void onBindViewHolder(final ProductsByStoreAdapter.ViewHolder viewHolder, final int position) {
    Glide.with(viewHolder.im_product_image.getContext())
            .load(products.get(position).getImage_uri())
            .centerCrop()
            .crossFade()
            //.placeholder(R.drawable.placeholder_main)
            .into(viewHolder.im_product_image);
    CurrencyFormats currencyFormat = new CurrencyFormats();
    viewHolder.tv_product_name.setText(products.get(position).getName());
    viewHolder.tv_product_price.setText(currencyFormat.toRupiah(products.get(position).getPrice()));
    //viewHolder.tv_product_quantity.setText("0");
    viewHolder.button_add_product.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            //current object
            Products tempObj = (products).get(position);
         ((ProductsByStoreActivity)view.getContext()).updateItemCount(true);
                tempObj.setQuantity(String.valueOf(1));
          viewHolder.tv_product_quantity.setText(tempObj.getQuantity());
        }
    });
    viewHolder.button_min_product.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Products tempObj = (products).get(position);
                                 viewHolder.tv_product_quantity.setText(CenterRepository
                            .getCenterRepository().getListOfProductsInShoppingList()
                            .get(indexOfTempInShopingList).getQuantity());

                        ((ProductsByStoreActivity)view.getContext()).updateItemCount(false);
                    }
                }
            }else {

            }
        }
    });

}

@Override
public int getItemCount() {
    //return products.size();
    return products == null ? 0 : products.size();
}}

添加

解决
@Override
public int getItemViewType(int position) {return position;}

感谢MMBarno

中的this answer

3 个答案:

答案 0 :(得分:1)

您需要将onclick侦听器移动到onCreateViewHolder

final ProductsByStoreAdapter.ViewHolder viewHolder = new ProductsByStoreAdapter.ViewHolder(view);
button_add_product.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {

        //current object
        Products tempObj = products.get(viewHolder.getAdapterPosition(););
     ((ProductsByStoreActivity)view.getContext()).updateItemCount(true);
            tempObj.setQuantity(String.valueOf(1));
      viewHolder.tv_product_quantity.setText(tempObj.getQuantity());
    }
});
return viewHolder;

您可以对其他onclicklistener

执行相同的操作

答案 1 :(得分:0)

更新:除非单击按钮,否则不要在BindView函数中将textText设置为product_quantity textview。这意味着它的价值将从其他项目中回收。您应该使用if语句检查项目的数量是什么,并且即使不点击也要显示它。

陈旧且答案不正确: 我不确定这是不是问题,但它很容易检查,所以试一试。有2个位置 - 适配器位置和布局位置。我想也许你正在使用的位置(来自onBind函数的位置)是后者。您需要适配器位置,因此请尝试使用getAdapterPosition(),如下所示:      产品tempObj =(产品).get(getAdapterPosition());

答案 2 :(得分:0)

添加下面这行来解决 item 的第 9 和第 10 位的问题

@Override
public int getItemViewType(int position) 
{
    return position;
}