Вопрос

Я использовал 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.Listext"Не сработает. Поэтому я расширил адаптер 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)"
  • Если линии с изображением обвнутрены, я получаю "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), поэтому я думаю, что это все еще то, что я делаю не так в этом расширенном классе.

Это было полезно?

Решение

Это не правда, что ConvertView всегда будет существующий экземпляр; Вы должны проверить, является ли это нулевым, а затем экземпляр его. Если нет, вы можете изменить его так же, как и вы.

Это должно быть похоже на:

public View getView(int position, View convertView, ViewGroup parent) {
    if(convertView == null)
        convertView = //inflate your row here
    View row = convertView;
    //Manipulate the row here
    return(row);
}

Другие советы

Я бы изменил метод GetView:

public View getView(int position, View convertView, ViewGroup parent) {
    convertView = View.inflate(getContext(), R.layout.myLayout, null);
    TextView text = (TextView) convertView.findViewById(R.id.listText);
    ImageView icon = (ImageView) convertView.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) {
      convertView.setBackgroundColor(mBackgroundColor);
    }

    return convertView;
}

Я думаю, что вы получаете NPE, потому что вы пытаетесь создать TextView и ImageView в представлении, где их там нет.

Если вы хотите раздуть список с помощью записей из базы данных, в своей деятельности вы определяете main.xml с линейным обзором:

<LinearLayout 
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<ListView 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:id="@+id/listView1">
</ListView>

и в методе Oncreate вы устанавливаете представление на этот XML с setContentView(R.layout.main);. Анкет Затем вы создаете свой курсор в свою базу данных и свой пользовательский адаптер:

    MySimpleCursorAdapter adapter = new MySimpleCursorAdapter(this, R.layout.entry,
                names, new String[] {Phones.NAME, Phones.NUMBER}, new int[] {
                R.id.listIcon, R.id.listText});
    startManagingCursor(cursor);
    ListView listView = (ListView) findViewById(R.id.listView1);
    listView.setAdapter(adapter);

И вы определяете entry.xml с помощью вашего списки и списка, где адаптер точек. В своем примере я запрашиваю имена и номера из списка контактов.

В вашем пользовательском адаптере вам следует получить доступ к своему текстовому обзору и ImageView Inside GetView или BindView без какой -либо проблемы.

Здесь У вас есть и пример, чтобы получить все контакты в вашем списке контактов с его изображением, именем и номером, но с использованием листиковой активности вместо активности, и только один XML с двумя текстовыми представлениями и изображением. Если вы используете Listactivity, вам не нужно использовать ListView, и вам не нужно устанавливать представление содержимого в деятельности.

Я надеюсь, что это помогает!

Не забудьте поместить: Layout_width и Mayout_heigth для каждого из ваших взглядов.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top