Intereting Posts
Карты Google содержат локацию на Android Получить элемент из списка только с помощью OnTouchListener Подключение моего устройства Android с помощью Visual Studio 2015 RC Android Realm copyToRealmOrUpdate создает дубликаты вложенных объектов Java.util.ConcurrentModificationException android после удаления элементов из списка массивов Как получить непрерывное событие Touch? Лучший способ отправить обновления местоположения пользователя на сервер в фоновом режиме (Android) Отображение файла формы и файла OSM в android в качестве карты Не допускается привязка к сервису Firebase извлекает все данные при запуске приложения Styling AutoCompleteTextView с AppCompat.EditText не работает Будет ли приложение, построенное с использованием только armeabi, работать на устройствах armeabi-v7a? Android Studio Требуется перестроить каждый запуск Как перезагрузить приложение в Genymotion и Android Studio без перезагрузки эмулятора? Будет ли это возможно с Android-носителем sdk

Как переопределить CursorAdapter bindView

Я пытаюсь отобразить информацию из Cursor в ListView , каждая строка содержит ImageView и TextView . У меня есть CustomCursorAdapter расширяющий CursorAdapter , в bindView я оцениваю данные с помощью курсора и на основе этого устанавливают изображения и текст представлений.

Когда я запускаю приложение, ListView отображает правильное количество строк, но они пусты. Я знаю, что что-то пропустил, переопределив bindView, но я не уверен, что.

Любая помощь будет принята с благодарностью.

 private class CustomCursorAdapter extends CursorAdapter { public CustomCursorAdapter() { super(Lmw.this, monitorsCursor); } @Override public View newView(Context context, Cursor cursor, ViewGroup parent) { LayoutInflater layoutInflater = getLayoutInflater(); return layoutInflater.inflate(R.layout.row, null); } @Override public void bindView(View view, Context context, Cursor cursor) { try { int monitorNameIndex = cursor.getColumnIndexOrThrow(DbAdapter.MONITORS_COLUMN_MONITOR_NAME); int resultTotalResponseTimeIndex = cursor.getColumnIndexOrThrow(DbAdapter.RESULTS_COLUMN_TOTAL_RESPONSE_TIME); String monitorName = cursor.getString(monitorNameIndex); int warningThreshold = cursor.getInt(resultTotalResponseTimeIndex); String lbl = monitorName + "\n" + Integer.toString(warningThreshold) + " ms"; TextView label = (TextView) view.findViewById(R.id.label); label.setText(lbl); ImageView icon = (ImageView)view.findViewById(R.id.icon); if(warningThreshold < 1000) { icon.setImageResource(R.drawable.ok); } else { icon.setImageResource(R.drawable.alarm); } } catch (IllegalArgumentException e) { // TODO: handle exception } } } 

Метод bindView() выглядит нормально.

Попробуйте заменить метод newView () :

 @Override public View newView(Context context, Cursor cursor, ViewGroup parent) { return mInflater.inflate(R.layout.row, parent, false); } 

И, по соображениям производительности:

  • Переместить getLayoutInflater() в конструкторе
  • То же самое со всеми cursor.getColumnIndexOrThrow() , как уже сказано в
    Комментарии
  • Используйте StringBuilder для создания вашего lbl- текста
  • Вам не нужно делать Integer.toString (warningThreshold) … просто используйте warningThreshold

Позже отредактируйте : Единственная разница между вашим методом inflate() и тем, который я предложил, заключается в том, что он создает параметры макета, соответствующие родительскому элементу.