findviewbyid() возвращает null в пользовательском адаптере в Eclipse

Добро пожаловать на еще один findviewbyid() returns null вопрос!

Я написал класс адаптера для отображения массива в ListView. И угадайте, что findviewbyid() возвращает null. (Я проверил все остальные вопросы по этой теме, но они не связаны с моей проблемой).

Итак, вот мой класс адаптера:

package de.kosmowski.discogs.wants;

import java.util.ArrayList;

import android.content.Context;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.TextView;
import de.kosmowski.discogs.model.Want;

public class WantAdapter extends ArrayAdapter<Want> {

private ArrayList<Want> items;

public WantAdapter(Context context, int textViewResourceId, ArrayList<Want> items) {
        super(context, textViewResourceId, items);
        this.items = items;
}


public View getView(int position, View convertView, ViewGroup parent) {
        View v = convertView;    

        Want w = items.get(position);
        Log.d("WantAdapter", "want:" + w);

        if (v == null) {
             LayoutInflater vi = (LayoutInflater)this.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
             if(w != null && w.getType()!= null && (w.getType().equals(Want.TYPE_RELEASE) || w.getType().equals(Want.TYPE_MASTER)))
             {
                 Log.d(this.getClass().getCanonicalName(), "Choosing Release List Item");
                 v = vi.inflate(R.layout.releaselistitem, null);
             }
             else
             {
                 v = vi.inflate(R.layout.lplistitem, null);
             }

        }

        if (w != null) {

                ImageView icon = (ImageView) v.findViewById(R.id.typeicon); //Returns NULL at this line

                TextView tt = (TextView) v.findViewById(R.id.text1);

                if(w.getType() != null)
                {
                    if(w.getType().equals(Want.TYPE_ARTIST))
                    {
                        icon.setImageResource(R.drawable.resulttype_artist);
                    }
                    else if(w.getType().equals(Want.TYPE_RELEASE))
                    {
                        icon.setImageResource(R.drawable.resulttype_lp);
                    }
                    else if(w.getType().equals(Want.TYPE_MASTER))
                    {
                        icon.setImageResource(R.drawable.resulttype_lp_master);
                    }
                    else
                    {
                        icon.setImageResource(R.drawable.defaultresult);
                    }
                }
                else
                {
                    icon.setImageResource(R.drawable.defaultresult);
                }



                if (tt != null) {
                      tt.setText(w.getName());                            }                    
        }
        return v;
}


}

Я отметил строку, в которой возвращается null.

А вот раздутый xml-файл (и lplistitem, и releaselistitem в настоящее время точно такие же):

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent"
  android:orientation="horizontal">

  <ImageView android:scaleType="center" android:layout_gravity="center_vertical" android:src="@drawable/defaultresult" android:id="@+id/typeicon" android:layout_width="wrap_content" android:layout_height="wrap_content"></ImageView>

  <TextView xmlns:android="http://schemas.android.com/apk/res/android"
   android:id="@+id/text1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:textAppearance="?android:attr/textAppearanceLarge"
    android:gravity="center_vertical"
    android:paddingLeft="6dip"
    android:textSize="16px"
    android:minHeight="?android:attr/listPreferredItemHeight"
/> 


</LinearLayout>

Вы видите явные ошибки? Мне все кажется правильным.


person Chris    schedule 05.03.2011    source источник


Ответы (3)


Так что проблема была действительно связана с затмением. После того, как я сделал все, что вы упомянули, и погуглил мои руки до костей, я подумал, что было бы неплохо проверить, правильно ли работает eclipse.

Поэтому по какой-то причине отображаемое мне затмение файла макета не было файлом, который компилировался. Поэтому в eclipse все выглядело нормально.

Затем я просмотрел тот же файл непосредственно в файловой системе, и он все еще был старым. Итак, я только что обновил свой проект eclipse, и вуаля, старый файл появился в eclipse, и я снова его отредактировал. Это было ist. Я не знаю, почему это произошло, и это пугает меня, что может быть больше этих непрозрачных проблем с затмением.

У меня была проблема несколько дней назад, которая была чем-то похожа на нее.

см. RuntimeException с Android OptionsMenu

Проблема заключалась в том, что файл R.java не перекомпилировался автоматически после добавления нового ресурса id.

Сейчас я собираюсь очистить свою установку eclipse и установить все с нуля, просто чтобы убедиться, что во время моей установки не произошло серьезной ошибки.

Спасибо за ваши ответы!

person Chris    schedule 05.03.2011
comment
Крис, вы используете проекты в качестве библиотек? У меня похожие проблемы с «обновлением» в Eclipse. Ооо Затмение! - person pjama; 06.03.2011
comment
Да, у меня есть несколько библиотек, которые я написал как проект. - person Chris; 06.03.2011

Попробуйте завершить XML-запись ImageView с помощью /> вместо ...>‹ / ImageView>

Если это не так, попробуйте удалить каждый из атрибутов один за другим (например, layout_gravity и т. д.)

Удачи.

person pjama    schedule 05.03.2011

У меня возникло бы искушение не пытаться использовать переменную LayoutInflater, а попытаться раздуть макет в одну строку. Также у меня возникнет соблазн сохранить контекст как частную переменную, чтобы убедиться, что используется правильный контекст. Итак, вот что я бы попробовал сделать по-другому в вашем коде:

public class WantAdapter extends ArrayAdapter<Want> {

  private ArrayList<Want> items;
  private Context mContext;

public WantAdapter(Context context, int textViewResourceId, ArrayList<Want> items) {
        super(context, textViewResourceId, items);
        this.items = items;
        mContext = context;
}

public View getView(int position, View convertView, ViewGroup parent) {
    View v = convertView;    

    Want w = items.get(position);
    Log.d("WantAdapter", "want:" + w);

    if (v == null) {
         if(w != null && w.getType()!= null && (w.getType().equals(Want.TYPE_RELEASE) || w.getType().equals(Want.TYPE_MASTER)))
         {
             Log.d(this.getClass().getCanonicalName(), "Choosing Release List Item");
             v = LayoutInflater.from(mContext).inflate(R.layout.releaselistitem, null);
         }
         else
         {
             v = LayoutInflater.from(mContext).inflate(R.layout.lplistitem, null);
         }

    }

Я бы оставил остальную часть кода ниже этих строк одинаковыми. Попробуйте!

person Hakan Ozbay    schedule 05.03.2011
comment
Спасибо за этот ответ! Это не решило мою проблему, но это действительно хорошая идея, потому что она аккуратная. - person Chris; 05.03.2011