在listview,arraylist和arrayadapter中的对象的Android生命周期

时间:2013-10-04 14:45:45

标签: arrays android-listview arraylist android-arrayadapter

我正在构建一个原型应用程序,帮助研究人员跟踪一小群(8-10)受试者。他们需要定期更新患者信息。我希望能够触摸一个按钮,显示所有患者的列表视图,如果不是每行的患者信息都很多。我创建了一个基本类的患者:

public class Patient {

 public String name;
public String gender;
public int painLevel;
public String risk;
public int score;

public Patient() {
    super();
}

public Patient(String name, String gender, int painLevel, String risk,
        int score) {
    super();
    this.name = name;
    this.gender = gender;
    this.location = painLevel;
    this.risk = risk;
    this.score = score;
}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

public String getGender() {
    return gender;
}

public void setGender(String gender) {
    this.gender = gender;
}

public int getpainLevel() {
    return painLevel;
}

public void setpainLevel(int painLevel) {
    this.painLevel = painLevel;
}

public int getScore() {
    return score;
}

public void setScore(int score) {
    this.score = score;
}

public void setRisk(String risk) {
    this.risk = risk;
}

public String getRisk() {
    return risk;
}

}

最初我以这种方式将它们输入数组:

 Patient[] cohort= new Patient[maxPatients];

现在我发现为了在ListView中显示,我必须使用arrayadapter。我发现了许多示例和教程,例如Vogella's教程非常有帮助。不幸的是,大多数示例使用字符串数组来举例。

我已经能够列出我需要的所有信息。现在,我需要在长按后使用弹出对话框,选择单个患者来显示/编辑所有数据。我已经能够做到这一点,但这里是我被卡住的地方。

我可以编辑数据,它似乎可以更改arrayList和arrayadapter中的Patient字段。我需要帮助的是如何反映患者原始阵列组[]中的这些变化,以及删除队列中的患者。现在它删除了一个病人,但是直到我改变方向时才将其从屏幕上的列表中删除,即使我调用notifyDataSetChanged();.

作为一名新手Android程序员,我显然不完全理解原始数组,数组列表,数组适配器之间的关系 - 即使在我完成所有阅读之后。我当前的代码是笨拙的而且不是很优雅,因为它是从许多例子的碎片拼凑而成的,加上许多不必要的调试代码。在调试期间,我看到队列数组中的患者的多个副本,即arraylist和arrayadapter。

如果用户使用新意图点击“编辑患者”按钮,我当前会启动编辑屏幕。患者阵列用于在阵列适配器中构建arraylist,并且列表出现在屏幕上。使用具有编辑功能的警报对话框,longpress会显示特定患者,然后“保存”,“删除”和“取消”按钮。

我需要重新开始,但需要更有经验的程序员提供一些指导,帮助他们更好地解决这个问题。指向基本工作示例代码的指针就足够了,或者列表视图中对象生命周期的流程图会更好。 (我试图制作一个,但最谦卑地失去了。)我还花了几个小时在developer.android.com上,但在所有相关链接后忘记了我原来的任务。

我需要该应用程序在Android 2.3及更高版本上运行,因为Grad学校的研究人员并不都拥有最新的Android设备。希望这种方法没有任何区别。

1 个答案:

答案 0 :(得分:1)

  

不幸的是,大多数示例使用字符串数组来举例。

下面的示例是关于如何创建自己的适配器的最小示例,然后在列表视图中使用患者的arraylist。

我做了类似的事情,只是列表中的另一个类。 如果您创建患者的arraylist:

ArrayList <Patient> patientList = new ArrayList<Patient>();
// Add patients to the list:
patientList.add(new Patient());
patientList.add(new Patient());
// etc...

然后将自定义适配器添加到列表视图。

PatientListAdapter adapter = new PatientListAdapter(getApplicationContext(), patientList);
ListView patientListView.setAdapter(adapter);

创建自定义列表适配器:

private class PatientListAdapter extends BaseAdapter {

    private final Context context;

    private final ArrayList<Patient> patientList;

    public PatientListAdapter(Context context, ArrayList<Patient> itemsArrayList) {

       this.context = context;
       patientList = itemsArrayList;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
    // code below
    }
}

然后您需要覆盖自定义适配器的getView函数。然后在getView中,您可以访问arraylist中的Patient:

@Override
public View getView(int position, View convertView, ViewGroup parent) {

    // This is a veeery minimal example.

     LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

    // Custom layout for a row if you want to:
    convertView = inflater.inflate(R.layout.patient_row, parent, false);

   // get the patient's name from the list of patients:

    (TextView) name = (TextView) covertView.findViewById(R.id.patient_name);
    String patientName = patientList.get(position).getName();
    name.setText = patientName;

  return convertView;
}

最后,我建议您实现ViewHolder模式以提高ListView的性能。