【问题标题】:When this method ends, the ArrayList is emptied当此方法结束时,ArrayList 被清空
【发布时间】:2015-06-29 22:53:59
【问题描述】:

我有这个方法用于存储应用程序列表。

public void storeApplication(String name, String item){
    peopleAttending.add(new Application(name, item));
}

它做了它应该做的事情,但是当方法完成时,包含在 ArrayList 中的数据也会被破坏。

我已经在全局范围内声明并实例化了 ArrayList:

private ArrayList<Application> peopleAttending = new ArrayList<>();

所以我会认为一旦将对象添加到 ArrayList 中,它将被安全地存储,直到程序终止。

任何帮助将不胜感激。

调用 storeApplication 的类:

    public void saveBookingInfo(View view) {

        GuestsAttending sendApplication = new GuestsAttending();

        EditText applicantNameText = (EditText) findViewById(R.id.applicantNameTextField);
        EditText itemToBurnText = (EditText) findViewById(R.id.itemToBurnTextField);

        String appName = applicantNameText.getText().toString();
        String appItemToBurn = itemToBurnText.getText().toString();

        if (appItemToBurn.isEmpty() || appName.isEmpty()) {
            Toast.makeText(BookingScreen.this, "Please fill in all fields.", Toast.LENGTH_SHORT).show();
        }
        else {
            sendApplication.storeApplication(appName, appItemToBurn);
        }
    }

编辑 - 整个班级:

public class GuestsAttending extends Activity {

    private ArrayList<Application> peopleAttending = new ArrayList<>();

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

    public void storeApplication(String name, String item){
        peopleAttending.add(new Application(name, item));
    }
}

【问题讨论】:

  • 你能分享你的代码吗
  • 创建Singlton Class并存储在其中。
  • 这将有助于我们查看包含storeApplicationpeopleAttending 的整个类(或者可能只是相关部分),以及调用storeApplication 的代码。跨度>
  • 您可能创建了一个新实例并希望从已填充的 ArrayList 中读取 .. 如果是这样,那将无法正常工作
  • 这里没有太多上下文,作为初步猜测,我会检查您是否从调用 storeApplication 的同一对象查询列表。

标签: java android methods arraylist


【解决方案1】:

您的 GuestsAttending 扩展了 Activity 类,因此不要这样做:

GuestsAttending sendApplication = new GuestsAttending();  //remove this line

让系统处理创建活动。

我猜 saveBookingInfo() 也可能是GuestAttending 活动的成员,该活动是有线的,例如。到一个按钮。

【讨论】:

  • 再往下:sendApplication是用来外部调用storeApplication方法的,我在它的地方放什么? -- saveBooking 信息与相关 XML 文件中的按钮连接到 Booking Screen 类。
  • 不清楚您的应用程序结构。哪个活动调用 saveBookingInfo() ?
  • 我有一个带有两个文本字段和一个按钮的 xml 文件。从按钮调用 saveBookingInfo() 方法,用于将文本字段转换为变量并通过外部方法传递。
  • 好的,saveBookingInfo() 属于哪个活动?你的活动之间有什么关系?为什么你调用外部方法来保存,而不是在当前活动中?或者一般来说,用户如何在您的活动和您希望他们做什么/在哪里做之间导航?
  • 这个程序有两个活动:一个收集信息(预订屏幕),一个存储信息,将显示在另一个活动上。有点像:“谁参加了这个活动?”系统类型。从预订屏幕收集信息后,我需要将其移动到显示屏幕,以便在那里使用信息。用户通过使用主菜单进行导航,该菜单包含多个意图,具体取决于用户想去的地方。 saveBookingInfo 属于预订屏幕活动。 :)
【解决方案2】:

我原以为一旦将对象添加到 ArrayList 中, 它将被安全地存储到程序终止

不。查看发布的代码 saveBookingInfo 实例化了声明 peopleAttendingGuestsAttending。当 saveBookingInfo 完成时,GuestsAttending 被销毁,因此 peopleAttending 被销毁。

在您的第一个活动中声明 peopleAttending 并使用意图在其他屏幕上传递。不要忘记使用 onSaveInstanceState 来处理操作系统关闭应用程序。

【讨论】:

    【解决方案3】:

    试着修改一下你的代码。

    1. private ArrayList peopleAttending;
    2. 有 getter 和 setter
    3. 在添加到列表之前检查 if(peopleAttending==null) peopleAttending = new ArrayList();
    4. 在调用方法中,创建GuestAttending的obj,然后尝试使用getter获取列表。

    根据您的要求,将详细说明我的观点:

    在GuestAttending你正在使用

    private ArrayList<Application> peopleAttending = new ArrayList<>();
    

    我希望你打破这条线并拥有

    private ArrayList<Application> peopleAttending;
    
    public ArrayList getPeopleAttending(){ 
        return peopleAttending;
    }
    
    public void setPeopleAttending(ArrayList<Application> peopleAttending){ 
        this.peopleAttending=peopleAttending;
    }
    
    
    public void storeApplication(String name, String item){
        if(peopleAttending==null) 
            peopleAttending = new ArrayList<>();
    
        peopleAttending.add(new Application(name, item));
    }
    

    假设您要在 saveBookingInfo 类中使用 peopleAttending 列表,您应该使用

    ArrayList<Application> peopleAttendingLst = sendApplication.getPeopleAttending();
    

    您应该能够获取列表中的对象。

    【讨论】:

    • 你能再澄清一下吗? (编写示例方法和声明)。谢谢! :D
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-07
    • 1970-01-01
    相关资源
    最近更新 更多