0

私は、研究者が対象患者の小さなコホート (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 のチュートリアルなど、多数の例とチュートリアルを見つけました。残念ながら、ほとんどの例では文字列配列を使用して例を作成しています。

必要なすべての情報をリストに載せることができました。ここで、すべてのデータを表示/編集するために個々の患者を選択するロングプレスの後にポップアップ ダイアログを使用する必要があります。私はこれを行うことができましたが、ここで行き詰まります。

データを編集すると、arrayList と arrayadapter の患者フィールドが変更されているように見えます。私が助けを必要としているのは、これらの変更を患者の元の配列 cohort[] に反映する方法と、コホート内の患者を削除する方法です。現在、患者は削除されますが、notifyDataSetChanged(); を呼び出しても、方向を変更するまで画面のリストから削除されません。

初心者の Android プログラマーとして、元の配列、配列リスト、配列アダプターの間の関係を完全には理解していないことは明らかです。私の現在のコードは不器用で、あまり洗練されていません。なぜなら、そこにある多くの例の断片と多くの不要なデバッグ コードを組み合わせたものだからです。デバッグ中に、コホート配列、arraylist、および arrayadapter に複数の患者のコピーが表示されます。

現在、ユーザーが新しいインテントを使用して「患者の編集」ボタンを押すと、編集画面が起動します。患者の配列は、arrayadapter で arraylist を作成するために使用され、リストが画面に表示されます。長押しすると、編集機能、[保存]、[削除]、および [キャンセル] ボタンを備えた警告ダイアログを使用して、特定の患者が表示されます。

最初からやり直す必要がありますが、より良いアプローチ方法について、経験豊富なプログラマーからのガイダンスが必要です。基本的な作業サンプル コードへのポインタで十分です。または、リストビュー内のオブジェクトのライフ サイクルに関するフローチャートがあればさらに良いでしょう。(私は作成しようとしましたが、最も謙虚に失われました。) また、developer.android.com に何時間も費やしましたが、すべての関連リンクをたどった元のクエストを見失いました。

Android 2.3 以降で実行するアプリが必要です。大学院の研究者は最新の Android ギアを持っていないからです。うまくいけば、アプローチに違いはありません。

4

1 に答える 1

1

残念ながら、ほとんどの例では文字列配列を使用して例を作成しています。

以下の私の例は、独自のアダプターを作成し、リストビューで患者の配列リストを使用する方法の最小限の例です。

リスト内の別のクラスで、似たようなことをしました。患者の配列リストを作成する場合:

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 内の患者にアクセスできます。

@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 のパフォーマンスを向上させることをお勧めします。

于 2014-04-07T11:41:43.827 に答える