2

ベースアダプターを使用して ListView に ArrayList> を設定しようとしています。ArrayList はデータベースによって入力されます。たとえば、アプリが初めて起動されたときなどに、データベースにエントリがないため、空の ArrayList になる可能性があります。ArrayList が空の間、de-script ではない "java.lang.RuntimeException: Unable to start activity ComponentInfo ... java.lang.NullPointerException" を受け取ります。

私の onCreate メソッドは次のようになります。

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.samples_list_layout);
    mContext = getApplicationContext();
    lv = getListView();
    list = myDatabase.getInstance(mContext).getAllSamples();
    sa = new SamplesAdapter(this, list);
    lv.setAdapter(sa);
    registerForContextMenu(lv);
}

lv.setAdapter(null) を設定すると、設定した空のリスト ビューがアプリに表示されます。ただし、BaseAdapter に任せると、エラーが発生します。私は 2 つの Android List8.java と List14.java の例に従いましたが、どちらの方法でも同じ結果が得られます。私の BaseAdapter クラスは次のようになります。

public class SamplesAdapter extends BaseAdapter {

private static final String SAMPLE_NAME_COL = "name";

private static final String SAMPLE_HOST_COL = "host";

private static final String SAMPLE_ICON_COL = "icon";

private static final String SAMPLE_MODIFIED_STAMP_COL = "moddate";

private Context mContext;
private ArrayList<HashMap<String, String>> samples = new ArrayList<HashMap<String, String>>();

public SamplesAdapter(Context c, ArrayList<HashMap<String, String>> list){
    mContext = c;
    samples = list;
}

public int getCount() {
    return samples.size();
}

public Object getItem(int position) {
    return position;
}

public long getItemId(int position) {
    return position;
}

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

    LayoutInflater inflater = (LayoutInflater) mContext .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    View v = inflater.inflate(R.layout.samples_row_layout, parent, false);
    TextView name = (TextView) v.findViewById(R.id.samples_name);
    name.setText(samples.get(position).get(SAMPLE_NAME_COL));
    TextView host = (TextView) v.findViewById(R.id.samples_host);
    host.setText(samples.get(position).get(SAMPLE_HOST_COL));
    TextView moddate = (TextView) v.findViewById(R.id.samples_mod_stamp);
    moddate.setText(samples.get(position).get(SAMPLE_MODIFIED_STAMP_COL));
    return v;
}

}

また、表示するものがある場合、ListView はアイテムを適切に表示することにも注意してください。ArrayList が空の場合にのみ失敗します。また、私は Android 2.2 を使用しています (最高ではありませんが、私は知っています)。どんな助けでも大歓迎です。

4

1 に答える 1

6

NPEgetCountを回避するために、0 を返します。

public int getCount() {
    return (samples == null) ? 0 : samples.size();
}
于 2012-04-24T15:47:45.170 に答える