另一个Null对象引用



我是新手,尽管我在网站上读过类似的主题,但似乎找不到错误。我理解我错误的要点,但似乎无法纠正;"购物车";对于项目,并且希望通过RecycleView中的onClickListener将项从自定义ArrayList传递到另一个自定义ArrayList。我有一种感觉;位置";,因为它是所讨论的代码行之间唯一的公共元素。我已经标记了错误消息中出现的三行。

public class MainActivity extends AppCompatActivity {
private RecyclerView mRecyclerView;
private MainAdapter mAdapter;
private RecyclerView.LayoutManager mLayoutManager;
private ArrayList<Inventory> mInventoryList;
private int position;

private Button button;
private ArrayList<Inventory> cartList;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
new Estimate("XXX000","John Smith", "john@gmail.com", cartList);

InputStream inputStream = getResources().openRawResource(R.raw.data);
CSVreader csvFile = new CSVreader(inputStream);
ArrayList<Inventory> inventoryList = (ArrayList<Inventory>) csvFile.read();
mRecyclerView = findViewById(R.id.recyclerviewMain);
mRecyclerView.setHasFixedSize(true);   
mLayoutManager = new LinearLayoutManager(this);
mAdapter = new MainAdapter(inventoryList); 
mInventoryList = inventoryList;
mRecyclerView.setLayoutManager(mLayoutManager);
mRecyclerView.setAdapter(mAdapter);
button = findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(v.getContext(), EstimateActivity.class);
intent.putExtra("cartList", cartList); 
v.getContext().startActivity(intent);
}
});

mAdapter.setOnItemClickListener(new MainAdapter.OnItemClickListener() {
@Override
public void onItemClick(int position) {
addToCart(position); //ERROR HERE
}
});
}
public void addToCart(int position){
cartList.add(position, new Inventory()); //ERROR HERE
}

}
public class MainAdapter extends RecyclerView.Adapter<MainAdapter.MainViewHolder> {
private ArrayList<Inventory> mInventoryList;
private ArrayList<Inventory> mCartList;
private OnItemClickListener mListener;

public interface OnItemClickListener {
void onItemClick(int position);
}
public void setOnItemClickListener(OnItemClickListener listener){
mListener = listener;
}

public static class MainViewHolder extends RecyclerView.ViewHolder {
private TextView cardCode;
private TextView cardName;
private CardView containerView;
private ArrayList<Inventory> cartList;

public MainViewHolder(View itemView, final OnItemClickListener listener) {
super(itemView);
cardCode = itemView.findViewById(R.id.text_row_code_viewMain);
cardName = itemView.findViewById(R.id.text_row_name_viewMain);
itemView = itemView.findViewById(R.id.container_viewMain);

itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (listener != null ){
int position = getAdapterPosition(); //ERROR HERE
if (position != RecyclerView.NO_POSITION){
listener.onItemClick(position);  
}
}
}
});
}
}
public MainAdapter(ArrayList<Inventory> inventoryList){   
mInventoryList = inventoryList;
}
@NonNull
@Override
public MainViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.text_row_main, parent, false);
MainViewHolder mvh = new MainViewHolder(view, mListener);
return mvh;
}
@Override
public void onBindViewHolder(@NonNull MainViewHolder holder, int position) {
Inventory currentItem = mInventoryList.get(position);
holder.cardName.setText(currentItem.getName());
holder.cardCode.setText(currentItem.getCode());
holder.itemView.setTag(currentItem);
}

@Override
public int getItemCount() {
return mInventoryList.size();
}
}
11357/com.jourdon.cartsavetest E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.jourdon.cartsavetest, PID: 11357
java.lang.NullPointerException: Attempt to invoke virtual method 'void java.util.ArrayList.add(int, java.lang.Object)' on a null object reference
at com.jourdon.cartsavetest.MainActivity.addToCart(MainActivity.java:76)
at com.jourdon.cartsavetest.MainActivity$2.onItemClick(MainActivity.java:69)
at com.jourdon.cartsavetest.MainAdapter$MainViewHolder$1.onClick(MainAdapter.java:49)
at android.view.View.performClick(View.java:7448)
at android.view.View.performClickInternal(View.java:7425)
at android.view.View.access$3600(View.java:810)
at android.view.View$PerformClick.run(View.java:28305)
at android.os.Handler.handleCallback(Handler.java:938)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:223)
at android.app.ActivityThread.main(ActivityThread.java:7656)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)

2020-11-04 17:51:47.720 11357-11357/?I/Process:发送信号。PID:11357 SIG:9

只需声明您的变量MainViewHolder,这是您在以下行中所做的:

cartList = new ArrayList<Inventory>();

还不够。您还需要用一个可以向其中添加项目的实际列表初始化这个变量。

当您声明一个变量时,您告诉Java您计划在程序中使用某个类型的对象,并且您告诉Java变量的名称和类型。

但是,声明一个变量并不能给出一个实际的列表。您需要做的是创建一个列表并将其存储在变量中。您可能希望在CCD_3构造函数方法中执行此操作。初始化行可能看起来像这样:

PD_6

最新更新