如何在Android中向List<Object> items添加数据

4

我是一名新的Android开发者。我正在开发一个样例应用程序。我想在一个对象列表中添加一些数据。

我的MainActivity.java类代码:

public class MainActivity extends Activity {
private PersonalInfo item;
private List<PersonalInfo> itemList = new ArrayList<PersonalInfo>();

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    for (int i = 0; i < 5; i++) {
        item.setFirstName("AA::" + i);
        item.setLastName("BB::" + i);
        item.setAddress("New City " + i);
        item.setSex("Male");
        itemList.add(item);
        item = new PersonalInfo();
    }
    for(PersonalInfo p:itemList){
        System.out.println("First Name::"+p.getFirstName());
        System.out.println("Last Name::"+p.getLastName());
    }

}

}

我的 PersonalInfo.java 类代码:

public class PersonalInfo {

 private String firstName;
 private String lastName;
 private String address;
 private String sex;

 public String getFirstName() {
  return firstName;
 }
 public void setFirstName(String firstName) {
  this.firstName = firstName;
 }
 public String getLastName() {
   return lastName;
 }
 public void setLastName(String lastName) {
  this.lastName = lastName;
 }
 public String getAddress() {
  return address;
 }
 public void setAddress(String address) {
   this.address = address;
 }
 public String getSex() {
   return sex;
 }
 public void setSex(String sex) {
   this.sex = sex;
 }  

}

当我运行它时,会显示以下错误 在此输入图片描述 谢谢你的帮助。

创建一个新的item变量实例,然后将其他内容设置为它。在for语句中,您必须创建一个新的实例,并在设置任何内容之前对其进行设置。 - Saeed-rz
3个回答

5
问题出在这里:
for (int i = 0; i < 5; i++) {
        item.setFirstName("AA::" + i);  <-- error happened here because item is null
        item.setLastName("BB::" + i);
        item.setAddress("New City " + i);
        item.setSex("Male");
        itemList.add(item); 
        item = new PersonalInfo();
    }

您需要先初始化item,然后将数据设置到其中,因此您的代码必须是:

for (int i = 0; i < 5; i++) {
            item = new PersonalInfo();  <-- I've moved this line
            item.setFirstName("AA::" + i);
            item.setLastName("BB::" + i);
            item.setAddress("New City " + i);
            item.setSex("Male");
            itemList.add(item);

        }

谢谢,这真的很有帮助。但是您能否解释一下为什么我们需要在每次循环中重新初始化它呢? - Gaurav Sarma
@gaurav4sarma 传递引用时的问题,如果你在循环中没有初始化,那么每次你都会更改一个实例,因为你的列表项指向对象的引用,所有项都会更改为最后一项。如果还不清楚,请告诉我让我解释更多。 - Shayan Pourvatan
我明白了,很抱歉错过了这么重要的小细节 @shayan - Gaurav Sarma

2

将你的for循环更改为以下内容:

    for (int i = 0; i < 5; i++) {
        item = new PersonalInfo();  // line1
        item.setFirstName("AA::" + i);
        item.setLastName("BB::" + i);
        item.setAddress("New City " + i);
        item.setSex("Male");
        itemList.add(item);

    }
    for (PersonalInfo p : itemList) {
        System.out.println("First Name::" + p.getFirstName());
        System.out.println("Last Name::" + p.getLastName());
    }

你的问题在于Line1:你无法在创建对象之前向对象插入值。因此,你必须先创建对象,然后初始化它的属性。


你确定列表的大小总是5吗?也许OP只是为了测试而将其设置为5,因此使用数组不合适。正如我在答案中所说,初始化行是问题所在,因此不需要将列表更改为数组。 - Shayan Pourvatan
@shayanpourvatan 这个更改可以接受吗?我们可以使用计数变量来改变大小。 - user3717646
为什么不使用List?这个解决方案只适用于固定大小。 - Shayan Pourvatan
@shayanpourvatan 我明白你的意思了,这个修改可以吗?提前感谢。 - user3717646

1
你只需要实例化一个名为PersonalInfo的对象;
像这样:
for (int i = 0; i < 5; i++) {
    item = new PersonalInfo();  <-- I've moved this line
    item.setFirstName("AA::" + i);
    item.setLastName("BB::" + i);
    item.setAddress("New City " + i);
    item.setSex("Male");
    itemList.add(item);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接