2017-09-14 51 views
1

点击按钮时,我必须更新一个TextView在相同的位置,我已经完成了它,但RecyclerView的第9和第10个位置遵循第一个位置和第二个位置。换句话说,如果我点击第一个按钮的位置,TextView的第一个位置被更新,但是TextView的第九个位置也被更新了,它不应该被更新。如何解决这个问题?处理每个RecyclerView中的点击按钮并更新TextView的值

我跟着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

+1

您是否尝试在更改onClick中的值之后调用notifyDataSetChanged? –

+0

其中我把notifyDataSetChanged()?@AalapPatel –

+1

刚刚改变onClick –

回答

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; 

你可以与其他相同on​​clicklistener

0

更新:你不会的setText在BindView功能您product_quantity TextView的,除非按钮被点击。这意味着它的价值将从其他物品中回收。你应该检查if语句是什么数量的项目,并呈现它甚至没有点击。

旧的和不正确的答案: 我不确定这是否是问题,但它是一个简单的检查,所以试试看。有2个位置 - 适配器位置和布局位置。我想也许你使用的位置(来自onBind函数的位置)是后者。你需要适配器位置,所以试试像这样使用getAdapterPosition(): Products tempObj =(products).get(getAdapterPosition());

+0

我试过了,但没有解决问题,结果是一样的 –

+0

我想我看到了问题。更新我的答案。 –