当调用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(); 
    } 
} 
+1

你能否证实,如果列表项('cart_list')在适配器的构造函数接收,不包含旧列表中的项目? – JoelFernandes

+0

可以共享代码,你的'的removeItem()'函数,所以我们可以看到你是如何试图删除的项目?从这里看,似乎没有任何行动正在列表本身。通过在适配器中声明新的片段,您似乎也可能会遇到一些问题。 –

您可以创建一个方法使用适配器中的新数据删除旧数据:

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尚未完成。

+0

你的答案太可行了! –

你必须从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();     
     } 
    }); 
+0

您的回答有效! @sasikumar –