day 25
这段时间一直会出现和困扰我的空指针异常
出现太多次了
因为前面我利用一个类(类似于hash map的集合)对购物车数据进行存储包含添加、修改、删除等功能
package Home.utils; import android.content.Context; import android.util.SparseArray; import com.google.gson.reflect.TypeToken; import java.util.ArrayList; import java.util.List; import Home.Data.ShoppingCart; public class CartProvider { public static final String CART_JSON="cart_json"; private SparseArray<ShoppingCart> datas =null; private Context mContext; public CartProvider(Context context){ mContext = context; datas = new SparseArray<>(200); listToSparse(); } public void put(ShoppingCart cart){ ShoppingCart temp = datas.get(cart.getId().intValue()); if (temp != null) { temp.setCount(temp.getCount() + 1); } else { temp = cart; temp.setCount(1); } datas.put(cart.getId().intValue(), temp); commit(); } public void update(ShoppingCart cart){ datas.put(cart.getId().intValue(),cart); commit(); } public void delete(ShoppingCart cart){ datas.delete(cart.getId().intValue()); commit(); } public List<ShoppingCart> getAll(){ return getDataFromLocal(); } public void commit(){ List<ShoppingCart> carts = sparseToList(); PreferencesUtils.putString(mContext,CART_JSON,JSONUtil.toJSON(carts)); } private List<ShoppingCart> sparseToList(){ int size = datas.size(); List<ShoppingCart> list = new ArrayList<>(size); for (int i=0;i<size;i++){ list.add(datas.valueAt(i)); } return list; } private void listToSparse(){ List<ShoppingCart> carts = getDataFromLocal(); if(carts!=null && carts.size()>0){ for (ShoppingCart cart: carts) { datas.put(cart.getId().intValue(),cart); } } } public List<ShoppingCart> getDataFromLocal(){ String json = PreferencesUtils.getString(mContext,CART_JSON); List<ShoppingCart> carts =null; if(json !=null ){ carts = JSONUtil.fromJson(json,new TypeToken<List<ShoppingCart>>(){}.getType()); } return carts; } }
代码运行都是成功的但是,我通过点击事件调用他的时候就就会出现空指针异常
调试了半天终于找到问题所在
public CartProvider(Context context){ mContext = context; datas = new SparseArray<>(200); listToSparse(); }
这个类只有在这里才声明了数组以及它的大小
而我一开始只是单纯的private CartProvider cartProvider 并没有初始化它,所以加上这个就ok了
public DetailFragment(Context context, Goods good,int id) { // Required empty public constructor this.mcontext = context; this.good=good; this.id=id; cartProvider=new CartProvider(mcontext); }
还有一个问题也是我掉的小坑,就是我在用RecyclerView设计它的adapter时因为布局文件太多,声明的R.id.时候弄混,然后它就报fragment must no null 的错误,我还一直没发现
checkBox=view.findViewById(R.id.checkbox_all); textView=view.findViewById(R.id.txt_total); button1=view.findViewById(R.id.btn_order); button2=view.findViewById(R.id.btn_del);