Я использовал 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), поэтому я думаю, что я все еще делаю что-то неправильно в этом расширенном классе.