Android BaseAdapter, работающий с пустым списком массивов

Я пытаюсь заполнить ListView ArrayList> с помощью базового адаптера. ArrayList заполняется базой данных, и база данных может не иметь записей и, следовательно, быть пустым ArrayList, например, когда приложение запускается в первый раз. Пока ArrayList пуст, я получаю не де-скрипт "java.lang.RuntimeException: невозможно запустить активность 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, я получаю сообщение об ошибке. Я следил за двумя примерами 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 (не самый лучший, я знаю). Любая помощь будет принята с благодарностью.


person Ten_Ten_Steve    schedule 24.04.2012    source источник


Ответы (1)


пусть getCount вернет 0, чтобы избежать NPE:

public int getCount() {
    return (samples == null) ? 0 : samples.size();
}
person Blackbelt    schedule 24.04.2012
comment
Большое спасибо за помощь, все получилось. Мой пустой ListView появляется, когда приложение запускается в первый раз, но NPE возвращается, когда я удаляю все записи в базе данных, обновляю ArrayList и вызываю sa.notifyDataSetChanged(); есть идеи? - person Ten_Ten_Steve; 24.04.2012