【问题标题】:Update Recyclerview List After Deleting Row [duplicate]删除行后更新 Recyclerview 列表 [重复]
【发布时间】:2018-09-06 17:26:56
【问题描述】:

我已经尝试了这个网站的大多数答案,但没有得到想要的结果。

我有 recyclerview,其中包含项目列表和每行中包含的按钮。单击按钮时,我希望删除整行并自动更新列表。

这是我的适配器类代码:

public class CartAdapter extends RecyclerView.Adapter<CartViewHolder> {

private static final String TAG = CartAdapter.class.getSimpleName();

private final Context context;
private List<Cart> itemsList;
private String id;

public CartAdapter(Context context, List<Cart> itemsList) {
    this.context = context;
    this.itemsList = itemsList;
}

@Override
public CartViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.cart_items_layout, parent, false);
    return new CartViewHolder(view);
}

@Override
public void onBindViewHolder(final CartViewHolder viewholder, final int position) {
    final Cart cart = itemsList.get(position);
    id = cart.getProductId();

    AndroidNetworking.get(Constants.PRODUCT_DETAILS_ENDPOINT + id)
            .setTag("Get Product Image")
            .setPriority(Priority.HIGH)
            .build()
            .getAsJSONObject(new JSONObjectRequestListener() {
                @Override
                public void onResponse(JSONObject response) {
                    Log.d(TAG, "Cart Item Image Response:\t" + response.toString());
                    String imagePath = null;
                    try {
                        JSONObject itemObject = new JSONObject(response.toString());
                        JSONObject data = itemObject.getJSONObject("data");
                        imagePath = data.getString("image");

                        Picasso.with(context)
                                .load(imagePath)
                                .placeholder(R.drawable.noimage)
                                .into(viewholder.cartItemImg);

                    } catch (JSONException e) {
                        e.printStackTrace();
                    }
                }

                @Override
                public void onError(ANError anError) {

                }
            });

    viewholder.cartItemTitle.setText(cart.getProductTitle());
    viewholder.cartQtyTV.setText(cart.getCartQty() + "");
    viewholder.clearProductIV.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            removeProductRow(cart);
        }
    });
    viewholder.decreaseCartIV.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            decreaseProduct();
        }
    });
    viewholder.increaseCartIV.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            increaseProduct();
        }
    });
}

private void increaseProduct() {

}

private void decreaseProduct() {

}

public void removeProductRow(final Cart cart) {
    AndroidNetworking.get(Constants.REMOVE_PRODUCT_CART + id)
            .setTag("Delete Product From Cart")
            .setPriority(Priority.HIGH)
            .build()
            .getAsJSONObject(new JSONObjectRequestListener() {
                @Override
                public void onResponse(JSONObject response) {
                    Log.d(TAG, "Delete Product From Cart Response:\t" + response.toString());

                    int position = itemsList.indexOf(cart);
                    itemsList.remove(position);
                    notifyItemRemoved(position);
                    notifyItemRangeChanged(position, itemsList.size());
                }

                @Override
                public void onError(ANError anError) {

                }
            });
}

@Override
public int getItemCount() {
    if (itemsList == null) {
        return 0;
    }
    return itemsList.size();
}
}

此代码有效并且该项目已被删除。但是,在我再次重新访问该活动之前,该列表不会更新。如何立即更新视图?

【问题讨论】:

  • 这主要是因为您执行网络操作以删除位于不同线程中的行,尝试在 CartAdapter 的私​​有函数中从 onResponse 移动代码然后调用它onResponse
  • 我应该删除响应中的代码块吗?
  • 您可以发表您的评论作为答案,以便我接受吗?
  • 把它移到一个函数中,比如说updateData(Cart cart),然后在onResponse里面调用这个函数
  • 谢谢。那行得通

标签: android android-recyclerview


【解决方案1】:
private update(Cart cart){
      Log.d(TAG, "Delete Product From Cart Response:\t" +
      response.toString());
                int position = itemsList.indexOf(cart);
                itemsList.remove(position);
                notifyItemRemoved(position);
                notifyItemRangeChanged(position, itemsList.size());
}

然后,onResponse 只需调用update(cart);

更新(与您的第二个问题有关):

@Override
public long getItemId(int position) {
    return itemList != null ? itemList.get(position).getId() : 0;
}

或者,您可以创建一个为您返回完整项目的公共函数

public Cart getItem(int position){
    return itemList != null itemList.get(position) : null;
} // you have to check if this is null when you call it 

【讨论】:

  • 出现了一个小问题。当我单击行上的任何项目时,我没有得到正确的 id 值。如何解决这个问题?
  • 我已经解决了这个问题。谢谢
【解决方案2】:

可能不是UI线程在代码下面运行,导致界面没有及时刷新 @覆盖 公共无效 onResponse(JSONObject 响应){ Log.d(TAG, "Delete Product From Cart Response:\t" + response.toString());

                int position = itemsList.indexOf(cart);
                itemsList.remove(position);
                notifyItemRemoved(position);
                notifyItemRangeChanged(position, itemsList.size());
            }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-17
    • 1970-01-01
    • 2018-05-23
    • 2022-01-19
    相关资源
    最近更新 更多