当调用notifydatasetchanged(),适配器显示旧的列表项目也随着新项目
我碰到火力点的列表,并在列表视图中显示它并点击删除按钮的时候,我能删除在firebase中的项目,但问题是呼吁notifydatasetchanged()
,RecyclerView显示旧项目以及新项目。当调用notifydatasetchanged(),适配器显示旧的列表项目也随着新项目
我需要知道如何防止RecyclerView从显示旧项目,我应该在哪里打电话notifydatasetchanged()
public class CartRecyclerAdapter extends RecyclerView.Adapter<CartRecyclerAdapter.CartProductViewHolder> {
MyCartFragment myCartFragment = new MyCartFragment();
public List<CartProduct> cart_list = myCartFragment.cart_list;
public ArrayList<CartProduct> data = new ArrayList<>();
public CartRecyclerAdapter(List<CartProduct> cart_list) {
this.data.clear();
data.addAll(cart_list);
}
public class CartProductViewHolder extends RecyclerView.ViewHolder{
View mView;
TextView textView_name;
TextView textView_quantity;
TextView textView_price;
TextView order_quantity;
TextView order_price;
ImageView imageView;
ImageButton delete;
public CartProductViewHolder(View itemView) {
super(itemView);
mView = itemView;
textView_name = (TextView) itemView.findViewById(R.id.cproductname);
textView_price = (TextView) itemView.findViewById(R.id.cproductprice);
textView_quantity = (TextView) itemView.findViewById(R.id.cproductQuantity);
order_price = (TextView) itemView.findViewById(R.id.cuserprice);
order_quantity = (TextView) itemView.findViewById(R.id.cuserquantity);
imageView = (ImageView) itemView.findViewById(R.id.cproductimage);
delete = (ImageButton) itemView.findViewById(R.id.cdeletebutton);
delete.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
int product_position = getAdapterPosition();
String pid = data.get(product_position).getId();
myCartFragment.removeitem(pid);
notifyDataSetChanged();
}
});
}
public void setName(String title) {
textView_name.setText(title);
}
public void setQunatity(Double quantity) {
textView_quantity.setText("Available Quantity: " + Double.toString(quantity));
}
public void setPrice(Double price) {
textView_price.setText("Price: " + Double.toString(price));
}
public void setOrderPrice(Double cart_price) {
order_price.setText("Price: " + Double.toString(cart_price));
}
public void setOrderQuantity(int cart_Quantity) {
order_quantity.setText(Integer.toString(cart_Quantity));
}
public void setImage(String image) {
Picasso.with(mView.getContext())
.load(image)
.placeholder(product)
.resize(1000,700)
.centerCrop()
.into(imageView);
}
}
@Override
public CartProductViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View itemView = LayoutInflater.from(parent.getContext())
.inflate(R.layout.product_cart_item, parent, false);
return new CartProductViewHolder(itemView);
}
@Override
public void onBindViewHolder(CartProductViewHolder holder, int position) {
CartProduct cartProduct = data.get(position);
holder.setName(cartProduct.getProductName());
holder.setQunatity(cartProduct.getQuantity());
holder.setPrice(cartProduct.getPrice());
holder.setImage(cartProduct.getUri());
holder.setOrderQuantity(cartProduct.getCart_quantity());
holder.setOrderPrice(cartProduct.getCart_price());
}
@Override
public int getItemCount() {
return data.size();
}
}
您可以创建一个方法使用适配器中的新数据删除旧数据:
public class CartRecyclerAdapter extends RecyclerView.Adapter<CartRecyclerAdapter.CartProductViewHolder> {
...
public void swap(List<CartProduct> cartList) {
data.clear();
data.addAll(cartList);
notifyDataSetChanged();
}
}
然后,你可以把它与更新列表:
yourAdapter.swap(cartList);
请检查你的下面的代码错误:
public class CartRecyclerAdapter extends RecyclerView.Adapter<CartRecyclerAdapter.CartProductViewHolder> {
MyCartFragment myCartFragment = new MyCartFragment();
public List<CartProduct> cart_list = myCartFragment.cart_list;
...
}
其中myCartFragment
被实例化,那么你尝试获得的名单CartProduct
。由于创建片段的异步过程,它会在代码中引入一个bug,因为myCartFragment尚未完成。
你的答案太可行了! –
你必须从ArrayList中删除数据也
delete.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
int product_position = getAdapterPosition();
String pid = data.get(product_position).getId();
myCartFragment.removeitem(pid);
data.remove(product_position);
notifyDataSetChanged();
}
});
您的回答有效! @sasikumar –
你能否证实,如果列表项('cart_list')在适配器的构造函数接收,不包含旧列表中的项目? – JoelFernandes
可以共享代码,你的'的removeItem()'函数,所以我们可以看到你是如何试图删除的项目?从这里看,似乎没有任何行动正在列表本身。通过在适配器中声明新的片段,您似乎也可能会遇到一些问题。 –