android - RecyclerView 适配器数据在调用 notifyitemsetchanged() 后重置

标签 android android-recyclerview

我有一个购物车,我想在点击按钮时增加/减少商品的数量。我可以看到该应用程序正在进行更改,但就在它更改时它变回默认值可能是由于 notifyitemsetchanged()?请检查 onClick(),我不确定为什么它会“重置”为默认值,而我增加了该值但它在几分之一秒内变回了原来的值:

适配器:

public class CartRecyclerAdapter extends RecyclerView.Adapter<CartRecyclerAdapter.MyViewHolder>  {

Context context;
String json;
ListSharedPreference.Get getSharedPreference;

public CartRecyclerAdapter(Context context, String json) {
    this.context = context;
    this.json = json;
    getSharedPreference = new ListSharedPreference.Get(context);
}

public static <T> List<T> stringToArray(String s, Class<T[]> clazz) {
    return Arrays.asList(new Gson().fromJson(s, clazz));
}

public void setItemList(String itemList) {
    this.itemList = itemList;
    notifyDataSetChanged();
}

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

@Override
public void onBindViewHolder(CartRecyclerAdapter.MyViewHolder holder, int position) {
    holder.title.setText(stringToArray(json, RestaurantModel.Menu[].class).get(position).getFoodtitle());
    holder.price.setText(String.format("%d USD", stringToArray(json, RestaurantModel.Menu[].class).get(position).getPrice()));
    holder.quantity.setText(String.valueOf(stringToArray(json, RestaurantModel.Menu[].class).get(position).getQuantity()));
}

@Override
public int getItemCount() {
    if (itemList != null) {
        return stringToArray(json, RestaurantModel.Menu[].class).size();
    }
    return 0;
}

public class MyViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
    TextView title;
    TextView price;
    TextView quantity;
    Button add;

    public MyViewHolder(View itemView) {
        super(itemView);
        title = (TextView) itemView.findViewById(R.id.cardView_name);
        price = (TextView) itemView.findViewById(R.id.item_price);
        add = (Button) itemView.findViewById(R.id.add_button);
        quantity = (TextView) itemView.findViewById(R.id.quantity);

        add.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.add_button:
                int i = Integer.parseInt(quantity.getText().toString());
                i++;
                quantity.setText(String.valueOf(i));
                stringToArray(json, RestaurantModel.Menu[].class).get(getAdapterPosition()).setQuantity(i);
                notifyItemChanged(getAdapterPosition());
                break;
        }
    }
}
}

最佳答案

问题在于,每次您调用 stringToArray() 时,它都会根据您的 json 对象返回一个新数组。因此,显然这个新数组具有所有默认值,但您的 Adapter 会根据它们重新绑定(bind) View 。这就是为什么您需要一个数组,以便每次更改其元素并调用 notifyItemChanged()/notifyDataSetChanged() onBindViewHolder 时都从它而不是其他数组中检索值.它可能如下所示:

public class CartRecyclerAdapter extends RecyclerView.Adapter<CartRecyclerAdapter.MyViewHolder>  {    
    Context context;
    private List<RestaurantModel.Menu> menus = new ArrayList<>();
    ListSharedPreference.Get getSharedPreference;

    public CartRecyclerAdapter(Context context, String json) {
        this.context = context;
        menus = stringToArray(json, RestaurantModel.Menu[].class);
        getSharedPreference = new ListSharedPreference.Get(context);
    }

    public static <T> List<T> stringToArray(String s, Class<T[]> clazz) {
        return Arrays.asList(new Gson().fromJson(s, clazz));
    }

    public void setItemList(String itemList) {
        menus = stringToArray(json, RestaurantModel.Menu[].class);
        notifyDataSetChanged();
    }

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

    @Override
    public void onBindViewHolder(CartRecyclerAdapter.MyViewHolder holder, int position) {
        holder.title.setText(menus.get(position).getFoodtitle());
        holder.price.setText(String.format("%d USD", menus.get(position).getPrice()));
        holder.quantity.setText(String.valueOf(menus.get(position).getQuantity()));
    }

    @Override
    public int getItemCount() {
        menus.size();
    }

    public class MyViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
        TextView title;
        TextView price;
        TextView quantity;
        Button add;

        public MyViewHolder(View itemView) {
            super(itemView);
            title = (TextView) itemView.findViewById(R.id.cardView_name);
            price = (TextView) itemView.findViewById(R.id.item_price);
            add = (Button) itemView.findViewById(R.id.add_button);
            quantity = (TextView) itemView.findViewById(R.id.quantity);

            add.setOnClickListener(this);
        }

        @Override
        public void onClick(View v) {
            switch (v.getId()) {
                case R.id.add_button:
                    int i = Integer.parseInt(quantity.getText().toString());
                    i++;
                    menus.get(getAdapterPosition()).setQuantity(i);
                    notifyItemChanged(getAdapterPosition());
                    break;
            }
        }
    }
}

关于android - RecyclerView 适配器数据在调用 notifyitemsetchanged() 后重置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51906265/

相关文章:

android - 在 webview android 4.0.4 中突出显示搜索词

java - 如何从日期/时间选择器对话框获取日期和时间并显示它?

android - 以编程方式为从 XML 创建的现有菜单创建子菜单

java - 在显示 Firebase 查询的 RecyclerView 的开头插入对象

android - 将单个项目对齐到 RecyclerView android 中的中心

android - 如何检查 Talkback 在 JellyBean 中是否处于 Activity 状态

java - 随机生成形状和颜色并绘制到 Canvas 上

java - 单击一个后禁用回收器 View 中的所有其他切换按钮

android - 单击 onBindViewHolder 中的 cardview 时如何将数据传递给 fragment ?

android - 如何在 firebase android 的 recyclerview/cardlayout 中将最新帖子显示在顶部而不是底部?