Получение нулевой ссылки на объект при использовании viewHolder в представлении BaseAdapter - PullRequest
0 голосов
/ 26 декабря 2018

У меня есть представление в BaseAdapter, который работает правильно.Вот оно:

public class lv_cb_db_ea_Adapter extends BaseAdapter {

final private Context context;
private Cursor cursor;

lv_cb_db_ea_Adapter(Context context, Cursor cursor) {
    super();
    this.context = context;
    this.cursor = cursor;
}

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

    LayoutInflater layoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    view = layoutInflater.inflate(R.layout.list_item, parent, false);

    TextView tvTextView = view.findViewById(R.id.listItem_TextView);
    CheckBox cbCheckBox = view.findViewById(R.id.listItem_CheckBox);

    cursor.moveToPosition(position);

    // create string for TextView
    String sTextView =
            cursor.getString(cursor.getColumnIndex("name")) +
                    " (" + cursor.getString(cursor.getColumnIndex("code")) + ")";

    tvTextView.setText(sTextView);
    cbCheckBox.setChecked(cursor.getInt(cursor.getColumnIndex("selected")) != 0);

    return view;
}

public int getCount() {
    return cursor.getCount();
}

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

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

}

Я получаю только одно предупреждение: используйте ViewHolder, и я так и сделал:

public class lv_cb_db_ea_Adapter extends BaseAdapter {

final private Context context;
private Cursor cursor;

lv_cb_db_ea_Adapter(Context context, Cursor cursor) {
    super();
    this.context = context;
    this.cursor = cursor;
}

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

    ViewHolder viewHolder;

    if (convertView == null) {

        LayoutInflater layoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        convertView = layoutInflater.inflate(R.layout.list_item, parent, false);

        viewHolder = (ViewHolder) convertView.getTag();

        viewHolder.list_item_TextView = convertView.findViewById(R.id.listItem_TextView);
        viewHolder.list_item_Checkbox = convertView.findViewById(R.id.listItem_CheckBox);

    } else {
        viewHolder = (ViewHolder) convertView.getTag();
    }

    cursor.moveToPosition(position);

    // create string for TextView
    String sTextView =
            cursor.getString(cursor.getColumnIndex("name")) +
                    " (" + cursor.getString(cursor.getColumnIndex("code")) + ")";

    viewHolder.list_item_TextView.setText(sTextView);
    viewHolder.list_item_Checkbox.setChecked(cursor.getInt(cursor.getColumnIndex("selected")) != 0);

    return convertView;
}

public int getCount() {
    return cursor.getCount();
}

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

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

private static class ViewHolder {
    // fields from list_item.xml
    CheckBox list_item_Checkbox;
    TextView list_item_TextView;
}

}

Но когда я запускаю класс с ViewHolder, он выдаетИСКЛЮЧИТЕЛЬНОЕ ИСКЛЮЧЕНИЕ: Вот часть моего logcat:

2018-12-25 23:44:19.379 18010-18033/? D/EGL_emulation: eglMakeCurrent: 0xde285180: ver 3 0 (tinfo 0xde283690)
2018-12-25 23:44:19.547 18010-18010/? D/AndroidRuntime: Shutting down VM
2018-12-25 23:44:19.588 18010-18010/? E/AndroidRuntime: FATAL EXCEPTION: main
Process: ws.rtin.android.listviewexample, PID: 18010
java.lang.NullPointerException: Attempt to write to field 'android.widget.TextView ws.rtin.android.listviewexample.lv_cb_db_ea_Adapter$ViewHolder.list_item_Text    View' on a null object reference
    at ws.rtin.android.listviewexample.lv_cb_db_ea_Adapter.getView(lv_cb_db_ea_Adapter.java:35)
    at android.widget.AbsListView.obtainView(AbsListView.java:2366)
    at android.widget.ListView.makeAndAddView(ListView.java:2052)
    at android.widget.ListView.fillDown(ListView.java:786)
    at android.widget.ListView.fillFromTop(ListView.java:847)

У меня есть похожее приложение, которое использует ArrayAdapter с ListView, где все работает.Я не могу найти ошибку.Ошибка указывает на строку:

viewHolder.list_item_TextView = convertView.findViewById (R.id.listItem_TextView);

Я также пробовал:

view = layoutInflater.inflate(R.layout.list_item, null);

вместо

view = layoutInflater.inflate(R.layout.list_item, parent, false);

без успеха.

Я сделал:

System.out.println (convertView.findViewById (R.id.listItem_TextView));

android.widget.TextView {5e43116 V.ED ..... ...... ID 0,0-0,0 # 7f070047 приложение: id / listItem_TextView}

System.out.println (viewHolder.list_item_TextView);

java.lang.NullPointerException: попытка чтения из поля 'android.widget.TextView ws.rtin.android.listviewexample.lv_cb_db_ea_Adapter $.list_item_TextView 'для нулевой ссылки на объект

Итак, я предполагаю, что это должно быть проблемой с ViewHolder, а не с TextView.И, конечно, viewHolder должен быть нулевым, поскольку он определен в условии "if (convertView == null) {", но во всех примерах, которые я видел, это работает.

...