Android: получение NullPointerException для ImageView imag = (ImageView) findViewById(R.id.image)

Я получаю исключение нулевого указателя для ImageView imag = (ImageView) findViewById(R.id.image). У меня есть макет обычного, объявленный в R.layout.screen3 со списком обычного, объявленным в R.layout.custom_row_screen3. В каждом ряду есть несколько задач, и в зависимости от их статуса изображение отображается справа от каждого ряда.

Пожалуйста, помогите мне решить эту проблему, поскольку я новичок в Android.

вот мой код ниже:::

public class screen3 extends ListActivity{
final ArrayList<HashMap<String, String>> list = new ArrayList<HashMap<String, String>>();
...
...
...
TextView tv;
ImageView imag;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.screen3);   
    System.out.println("Screen3");
    ...
    ...
    ...
    SimpleAdapter adapter = new SimpleAdapter(this, list,
            R.layout.custom_row_screen3,
            new String[] { "tname","schedule", "note", "time"}, new int[] { R.id.text1Screen3task,
                    R.id.text2Screen3task, R.id.text3Screen3task, R.id.text4Screen3task});
    populateList();
    setListAdapter(adapter);
}

public void populateList() {
    for(int i = 0; i <numberOfTasks; i++)
    {
        HashMap<String, String> h = new HashMap<String, String>();
        HashMap<String, String> hm = new HashMap<String, String>();
        h = tasks.get(i);
            ...
            ...     
        hm.put("tname", h.get("taskName"));
        hm.put("schedule", h.get("STime")+" - "+h.get("ETime"));

        if(h.get("taskStatus").trim().equals("1")){

            imag = (ImageView) findViewById(R.id.image);//   <<---- NULL RETURNED
            imag.setImageResource(R.drawable.done);
            ...
            ...
        }
        else{
            imag = (ImageView) findViewById(R.id.image);//  <<---- NULL RETURNED
            imag.setImageResource(R.drawable.not);
            ...
            ...
        }
        list.add(hm);
    }
    ...
    ... 
}

screen3 xml

<ListView android:id="@id/android:list" android:layout_width="fill_parent"
    android:layout_height="wrap_content" android:background="#000000"
    android:drawSelectorOnTop="false">
</ListView>

custom_row_screen3 xml

<LinearLayout android:orientation="vertical"
    android:layout_width="0dip" android:layout_weight="1"
    android:layout_height="wrap_content">

    <TextView android:id="@+id/text1Screen3task"
        android:layout_width="wrap_content" android:layout_height="0dip"
        android:layout_weight="1" android:textSize="21sp" android:textStyle="bold"
        android:gravity="clip_horizontal" />

    <TextView android:id="@+id/text2Screen3task"
        android:layout_width="wrap_content" android:layout_height="0dip"
        android:layout_weight="1" android:textSize="16sp" android:gravity="clip_horizontal" />

    <TextView android:id="@+id/text3Screen3task"
        android:layout_width="wrap_content" android:layout_height="0dip"
        android:layout_weight="1" android:textSize="16sp" android:gravity="clip_horizontal" />

    <TextView android:id="@+id/text4Screen3task"
        android:layout_width="wrap_content" android:layout_height="0dip"
        android:layout_weight="1" android:textSize="16sp" android:gravity="clip_horizontal" />
</LinearLayout>
<ImageView android:id="@+id/image" android:layout_width="wrap_content" android:paddingBottom="51dip"
    android:layout_height="wrap_content" android:layout_marginRight="16dip"
    />

Спасибо Абхинав Тяги

5 ответов

Решение

Спасибо всем вам. Вы все указали мне в правильном направлении, что мой просмотр изображений не указывает на мой адаптер. Я выполнил шаги, как в http://devblogs.net/2011/01/04/custom-listview-with-image-using-simpleadapter/ и это работало!!! просто нужно было поместить мое изображение в hashmap... Я бился головой об стену!!!

Вкратце: вы должны написать ListAdapter, который рисует представления в списке. Вы, кажется, используете findViewById() на неправильный вид / контекст (на макете screen3 xml). Пример, содержащий ListAdapter, доступен на сайте разработчика Android.

getView() Метод должен выглядеть примерно так:

public View getView(int position, View convertView, ViewGroup parent) {
    View v = convertView;
    if (convertView == null) {
        v = LayoutInflater.from(parent.getContext()).inflate(R.layout.row, null);
    }
    h = tasks.get(i);
    if(h.get("taskStatus").trim().equals("1")){
        imag = (ImageView) v.findViewById(R.id.image);
        imag.setImageResource(R.drawable.done);
    } else { 
        // ...
    }
    return v;
}

Похоже, что вы не указали android:id="@+id/image" в просмотре изображений внутри макета

Изменить: Я думаю, что проблема в том, что вы используете findViewById до того, как ListView в вашем ListActivity содержит ваш custom_row, который имеет, кто имеет ImageView.

Попробуйте сделать setListAdapter перед populateList()

Проверьте, доступен ли ресурс, который вы загружаете, в вашей папке res или нет.

populateList() запускается до отображения ListView на экране, поэтому custom_row_screen3 не существует в Activity.

Вы можете создать подкласс SimpleAdapter и переопределить getView() или setViewImage (), но я часто нахожу проще анонимно реализовать SimpleAdapter.ViewBinder и назначить его с помощью SimpleAdapter # setViewBinder ().

В ViewBinder верните false, если переданное представление не является ImageView. Если это так, вы можете использовать карту данных (переданную как объект), чтобы проверить значение ключа "taskStatus".

Обязательно сделайте это перед вызовом setListAdapter().

adapter.setViewBinder(new SimpleAdapter.ViewBinder () {
  @Override
  boolean setViewValue(View view, Object data, String textRepresentation) {
    if (!(view instanceof ImageView)) return false;

    String taskStatus = ((Map<String, String>) data).get("taskStatus").trim();
    ((ImageView) view).setImageResource(taskStatus.equals("1") ? R.drawable.done :
                                                               R.drawable.not);
  }
});
Другие вопросы по тегам