Я использовал SimpleCursorAdapter с xml-файлом, в котором определены некоторые представления:
<LinearLayout ...>
<ImageView android:id="@+id/listIcon" />
<TextView android:id="@+id/listText" />
</LinearLayout>
Моя цель состояла в том, чтобы программно установить цвет текста TextView и цвет фона LinearLayout (то есть каждой строки в ListView); цвет возвращается из базы данных.
Я получал NPE при попытке манипулировать TextView, например, после того, как он нашел его без жалоб:
TextView tv = (TextView) findViewById(R.id.listText);
tv.setTextColor(color); // NPE on this line
Что справедливо; если в списке несколько записей, разумно предположить, что « R.id.listText » не будет работать. Поэтому я расширил адаптер SimpleCursor:
public View getView(int position, View convertView, ViewGroup parent) {
View row = super.getView(position, convertView, parent);
TextView text = (TextView) row.findViewById(R.id.listText);
// ImageView icon = (ImageView) row.findViewById(R.id.listIcon);
// If there's an icon defined
if (mIcon_id != 0) {
// icon.setImageResource(mIcon_id);
}
// If text color defined
if (mTextColor != 0) {
text.setTextColor(mTextColor);
}
// If background color set
if (mBackgroundColor != 0) {
row.setBackgroundColor(mBackgroundColor);
}
return(row);
}
И я получаю две разные ошибки:
- Подобный NPE брошен в
" text.setTextColor (mTextColor) "
- Если строки с ImageView
без комментариев я получаю
« ClassCastException:
android.widget.TextView"где я нахожусь
призвание
" row.findViewById (R.id.listIcon) "
Для справки я пытался использовать пример кода Commonsware, применяя его к моей ситуации. ссылка (pdf)
Изменено на это:
public View getView(int position, View convertView, ViewGroup parent) {
convertView = super.getView(position, convertView, parent);
if (convertView == null) convertView = View.inflate(mContext, R.layout.theme_item, null);
TextView text = (TextView) convertView.findViewById(R.id.listText_tv);
ImageView icon = (ImageView) convertView.findViewById(R.id.listIcon_iv);
// If there's an icon defined
if (mIcon_id != 0) {
icon.setImageResource(mIcon_id);
}
// If text color defined
if (mTextColor != 0) {
text.setTextColor(mTextColor);
}
// If background color set
if (mBackgroundColor != 0) {
convertView.setBackgroundColor(mBackgroundColor);
}
bindView(convertView, mContext, mCursor);
return(convertView);
}
Теперь я получаю ClassCastException в следующем упражнении (при нажатии на элемент списка). Ничто не было изменено в следующем упражнении; это работало при использовании SimpleListAdapter для списка, в котором были записи (при котором нажатие привело бы к Activity2), поэтому я думаю, что в этом расширенном классе все еще что-то не так.