【问题标题】:Losing data when sending between two classes在两个类之间发送时丢失数据
【发布时间】:2019-07-24 14:14:57
【问题描述】:

将数据从一个类传递到另一个类时,我的应用程序不显示任何内容。我通过调试器发现我的 ArrayList 没有从类中获得正确的值。 我正在使用以下功能发送数据:

public class Adaugare extends AppCompatActivity {

private ListView myListView;
private NumeAdapter numeAdapter;
String inume;
int ivarsta;
Intent intent = new Intent();
private ArrayList persoanaArrayList = new ArrayList<>();

public ArrayList getPersoanaArrayList() {
    return persoanaArrayList;
}

public int getPersoanaArrayListsize() {
    return persoanaArrayList.size();
}

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

    myListView = (ListView) findViewById(R.id.persoana_list);

    Button btn_fin = (Button) findViewById(R.id.btn_fin);
    btn_fin.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            EditText nume_edit_text = (EditText) findViewById(R.id.ins_nume);
            EditText varsta_edit_text = (EditText) findViewById(R.id.ins_var);

            ivarsta = Integer.parseInt(varsta_edit_text.getText().toString());
            inume = nume_edit_text.getText().toString();

            persoanaArrayList.add(new Persoana(inume, ivarsta));
        }
    });
}

}

并通过以下方式接收它:

public class Afisare extends AppCompatActivity {

ListView myListView;
NumeAdapter numeAdapter;
Adaugare ad = new Adaugare();
int cate;
int i;

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

    myListView = (ListView) findViewById(R.id.persoana_list);
    ArrayList<Persoana> persoanaArrayList = new ArrayList<Persoana>(ad.getPersoanaArrayList());
    numeAdapter = new NumeAdapter(this, persoanaArrayList);
    myListView.setAdapter(numeAdapter);
}

类 Persoana 是:

public class Persoana {
private String nume;
private int varsta;

Persoana(String inume, int ivar) {
    this.nume = inume;
    this.varsta = ivar;
}

public String getNume() {
    return nume;
}

public int getVarsta() {
    return varsta;
}

public void setNume(String nume) {
    this.nume = nume;
}

public void setVarsta(int varsta) {
    this.varsta = varsta;
}

}

Persoana 是主类,所有内容都保存在其中。 adAdaugare 的一个对象,Adaugare 是我从中获取 getPersoanaArrayList 代码的类。在调试时,一些值出现在 ad,即 Adaugare @4556,而 persoanaArrayList 仍然是 null。 我需要 persoanaArrayList 以便我可以初始化我的适配器和 listView。使用调试器逐步测试代码中的所有其他内容似乎都很好。

【问题讨论】:

  • 显示与问题相关的所有代码
  • 欢迎来到 Stack Overflow!我们愿意帮助你,但我们不是千里眼。请花时间阅读tour 并阅读How to Ask,然后阅读edit 相应的问题。请创建a Minimal, Complete, and Verifiable example,并提供示例输入、输出和您收到的错误消息(如果有)。这将帮助我们确定正在发生的事情并提高您获得答案的机会。
  • Adaugare ad = new Adaugare(); 据我所知:这不是在这种情况下创建新类的方式,因为 AdaugareonCreate 不会被调用,并且它的列表不会被填满。
  • 如果您将此标记为与 Android 相关,我觉得您将获得更好的支持

标签: java android function oop arraylist


【解决方案1】:

您的问题在于 Afisare 类中的以下行:

Adaugare ad = new Adaugare();

您不能简单地从另一个活动中新建一个活动并期望访问它们之间的共享列表。要在 java 对象之间共享实例数据,您需要引用另一个对象。创建一个新实例将创建一个新的空列表。这就是您“丢失”数据的原因。一个快速的解决方法是将列表设为静态,以便可以从任何实例访问它。

但由于您使用的是 Android,因此在 Activity 之间共享数据的正确方法是使用 Intent Extras。第一个活动通过意图启动第二个活动。第一个活动将所需的数据作为额外数据放入意图中。第二个活动使用 getIntent() 和 Intent 上的各种方法来访问额外内容。

最后一个提示,在 Android 中,您永远不要在活动中使用 new 运算符。活动由系统创建以服务于意图。如果您发现自己在使用 new 运算符,则表明您做错了。

【讨论】:

  • 所以我选择了使用意图的选项。我在“Adaugare”中发送一个意图并在“Afisare”中接收它,但在“myListView.setAdapter(NumeAdapter)”它崩溃了。我找不到原因,但是在注释中添加那部分代码我发现这一行有问题。
猜你喜欢
  • 2019-12-08
  • 2013-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-09-24
  • 2017-10-29
  • 2021-07-19
  • 1970-01-01
相关资源
最近更新 更多