java - 如何使用 parcelable 将对象列表从一个活动传递到另一个活动
问题描述
我想将 itemselected 或 ItemsInCart 的列表传递给另一个活动。我的项目模型实现了 parcelable。问题是在我的 SecondActivity 类中出现以下错误。
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void androidx.recyclerview.widget.RecyclerView.setLayoutManager(androidx.recyclerview.widget.RecyclerView$LayoutManager)' on a null object reference at com.example.Project1.SecondActivity.onCreate(SecondActivity.java:59)
下面是代码
模型项目;
public class Item implements Parcelable {
private int iid;
private String itenname;
private String itemprice;
private String itemstock;
private int totalInCart;
private List<Item> items;
public Item(int iid, String itenname, String itemprice, String itemstock, int totalInCart,List<Item> items) {
this.iid = iid;
this.itenname = itenname;
this.itemprice = itemprice;
this.itemstock = itemstock;
this.totalInCart = totalInCart;
this.items = items;
}
protected Item(Parcel in) {
iid = in.readInt();
itenname = in.readString();
itemprice = in.readString();
itemstock = in.readString();
totalInCart = in.readInt();
items = in.createTypedArrayList(Item.CREATOR);
}
public static final Creator<Item> CREATOR = new Creator<Item>() {
@Override
public Item createFromParcel(Parcel in) {
return new Item(in);
}
@Override
public Item[] newArray(int size) {
return new Item[size];
}
};
public List<Item> getItems() {
return items;
}
public void setItems(List<Item> items) {
this.items = items;
}
public int getIid() {
return iid;
}
public void setIid(int iid) {
this.iid = iid;
}
public String getItenname() {
return itenname;
}
public void setItenname(String itenname) {
this.itenname = itenname;
}
public String getItemprice() {
return itemprice;
}
public void setItemprice(String itemprice) {
this.itemprice = itemprice;
}
public String getItemstock() {
return itemstock;
}
public void setItemstock(String itemstock) {
this.itemstock = itemstock;
}
public int getTotalInCart() {
return totalInCart;
}
public void setTotalInCart(int totalInCart) {
this.totalInCart = totalInCart;
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeInt(iid);
dest.writeString(itenname);
dest.writeString(itemprice);
dest.writeString(itemstock);
dest.writeInt(totalInCart);
dest.writeTypedList(items);
}
}
第一个活动;我要传递给第二个活动的列表是“itemsInCart”
buttonCheckout.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (itemsInCart==null||itemsInCart.size()<=0){
Toast.makeText(List_Items.this, "Please add some items to the cart.", Toast.LENGTH_SHORT).show();
return;
}
ArrayList<Item> additems = new ArrayList<Item>();
for (int i = 0; i < itemsInCart.size(); i++){
additems.add(itemsInCart.get(i));
}
Intent intent = new Intent(MainActivity.this,DisplaySelectedItems.class);
intent.putParcelableArrayListExtra ("Itemselected", additems);
startActivity(intent);
}
});
第二个活动(在 OnCreate 方法中):
Bundle bundle = getIntent().getExtras();
ArrayList<Item> selecteditems = bundle.getParcelableArrayList("Itemselected");
CartItemsInRecyclerView.setLayoutManager(new LinearLayoutManager(this));
placeOrderAdapter = new PlaceOrder_Adapter((ArrayList<Item>) items); <- This is line 59 of the error
CartItemsInRecyclerView.setAdapter(placeOrderAdapter);
我发现了类似的问题并尝试了他们的解决方案,但一切都不起作用。请告知我必须更改的内容。
第二个活动适配器。
公共类 SecondActivity_Adapter 扩展 RecyclerView.Adapter<SecondActivity_Adapter.MyViewHolder> { private ArrayList itemList;
public SecondActivity_Adapter(ArrayList<Item> itemList){
this.itemList = itemList;
}
public void updateData(ArrayList<Item> itemList){
this.itemList = itemList;
notifyDataSetChanged();
}
@NonNull
@Override
public SecondActivity_Adapter.MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.row_of_place_order,parent,false);
return new MyViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull SecondActivity_Adapter.MyViewHolder holder, int position) {
holder.name.setText(itemList.get(position).getItenname());
holder.price.setText("Unit Price: "+String.format("%.0f",itemList.get(position).getItemprice())+"/=");
holder.QTY.setText("Qty: "+itemList.get(position).getTotalInCart());
}
@Override
public int getItemCount() {
return 0;
}
static class MyViewHolder extends RecyclerView.ViewHolder {
TextView menuName,menuPrice,menuQTY,tvCount;
public MyViewHolder(View view){
super(view);
name = view.findViewById(R.id.menuName);
price = view.findViewById(R.id.menuPrice);
QTY = view.findViewById(R.id.menuQTY);
tvCount = view.findViewById(R.id.tvCount);
}
}
}
解决方案
检查是否在xml中添加了RecyclerView,即activity_second.xml
如果您在 xml 中添加了 Recyclerview,请检查您是否在 SecondActivity 中使用findViewById引用了它
RecyclerView CartItemsInRecyclerView = findViewById(R.id.recyclerview_id)
您收到布局管理器错误,即使用空对象引用引用它,这意味着CartItemsInRecyclerView为空
编辑 :
在第一个活动中:-
for (int i = 0; i < itemsInCart.size(); i++){
additems.add(itemsInCart.get(i));
}
//log statement
for (int i = 0; i < additems.size(); i++){
Log.d("firstActivity",i.getItenname())
}
在第二个活动中:-
而不是 bundle.getParcelableArrayList 尝试 getIntent().getgetParcelableArrayList
ArrayList<Item> selecteditems =
getIntent().getParcelableArrayList("Itemselected");
//log statement
if(selecteditems.size()!=0){
for (int i = 0; i < selecteditems.size(); i++){
Log.d("secondActivity",i.getItenname())
}
}else{
Log.d("secondActivity","empty data")
}
然后在 Logcat 中查看结果
推荐阅读
- forms - 下拉列表字段表单未保存在数据库中
- android - kotlin中的位图高度和宽度变化
- java - log4j2 LogManager.getLogger() 是线程安全的吗?
- visual-studio-code - 如何阻止单个 VS Code 扩展自动更新?
- wxpython - 在 wx.Panel 中滚动
- c# - 使用 Linq 从嵌套类中返回一个新对象
- tensorflow - 带 TPU 训练的 Tensorflow 对象检测 API - 显示更精细的 Tensorboard 图
- nginx - 在生产中部署 Vue js 似乎更难
- cron - 脚本后 cron 重启
- keycloak - Keycloak:禁用外部 IDP 的用户名/密码登录