1

このガイドに従って、リスト ビューのカスタム行を作成しようとしています。行ごとにガイドラインに従って、自分の行のさまざまなビューに対応するために名前といくつかの詳細を変更するだけで機能しました。ただし、ボタンをクリックして行を追加できるようにしたいため、例で提供されている配列は機能しません。タイプ Requirement の ArrayList を作成しようとしました。これは、クラス Requirement によって定義され、アダプターの作成に使用される配列を置き換えますが、機能しません。ボタンをテストするインテントを開くことができなくなりました。これは、リスト ビューを初期化しようとするとクラッシュするためです。エラーは Null Pointer Exception です。

onCreate でこの関数を呼び出します。

ArrayList<Requirement> req_data_list;
RequirementAdapter adapter;

private void initialize_listView(){
    req_data_list.add(new Requirement());
    RequirementAdapter adapter = new RequirementAdapter(this, R.layout.requirements_item, req_data_list);
    ListView req_list = (ListView) findViewById(R.id.Requirement_listview);
    req_list.setAdapter(adapter);
}

これは、ArratList の要素のクラスです。

public class Requirement{
    public String name,requirement_id,type,notes;// These variables will be implemented later, and correspond to elements not yet included.
    public int men, hours, elevation,req_count;
    public boolean breathing_air;

    public Requirement(){
        super();
    }

    public Requirement(int men_p, int hours_p, int elevation_p, int req_count_p, String name_p, 
        String requirement_id_p, String type_p, String notes_p, boolean breathing_air_p){
        super();
        //TODO this constructor will be defined later.
    }

}// Requirement

これは、アダプターを定義するクラスです。

public class RequirementAdapter extends ArrayAdapter<Requirement>{
Context context;
int layoutResourceId;
ArrayList<Requirement> data = null;

public RequirementAdapter(Context context, int layoutResourceId, ArrayList<Requirement> data ){
    super(context, layoutResourceId, data);
    this.layoutResourceId = layoutResourceId;
    this.context = context;
    this.data=data;
}

@Override
public View getView(int position, View convertView, ViewGroup parent){
    View row = convertView;
    RequirementHolder holder = null;
    if(row==null){
        LayoutInflater inflater = ((Activity)context).getLayoutInflater();
        row = inflater.inflate(layoutResourceId,parent,false);

        holder = new RequirementHolder();
        holder.name = (TextView) row.findViewById(R.id.Name_Text);
        holder.name_e = (EditText) row.findViewById(R.id.Name_Edit);
        holder.men = (Button) row.findViewById(R.id.Men_But);

        row.setTag(holder);
    } // if

    else{
        holder = (RequirementHolder)row.getTag();
    } // else


    return row;

} // getView


static class RequirementHolder{
    TextView name;
    EditText name_e;
    Button men;
}
}

最後に、これはリスト ビューに新しい要素を追加する関数です。

private void new_layout_element(){
    req_data_list.add(new Requirement());
    adapter.notifyDataSetChanged();
}

どうすればこれを修正できますか? ありがとう!

編集:それが役立つ場合、配列リストを配列に戻すと、配列の長さに関係なく、1 つの要素しか表示されないことがわかりました。

4

1 に答える 1

0

アダプターのどこにもデータをリストアイテムのコンポーネントに設定しないでください。アダプターでこれと同じコードを使用します。

 holder.name.setText(data.get(position).name);
 holder.name_e.setText(data.get(position).name_e);
于 2013-06-19T03:23:09.137 に答える