Android: получение NullPointerException для ImageView imag = (ImageView) findViewById (R.id.image) - PullRequest
1 голос
/ 02 мая 2011

Я получаю исключение нулевого указателя для 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 ]

1 голос
/ 02 мая 2011

Короче говоря: вы должны написать 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;
}
0 голосов
/ 03 мая 2011

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

0 голосов
/ 02 мая 2011

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);
  }
});
0 голосов
/ 02 мая 2011

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

0 голосов
/ 02 мая 2011

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

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

Попробуйте выполнить setListAdapter перед populateList ()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...