У меня есть представление в 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) {", но во всех примерах, которые я видел, это работает.