Пользовательский адаптер Android getView () Исключение NullPointerException из ниоткуда!

#android

#Android

Вопрос:

У меня есть пользовательский адаптер для предоставления данных для ListView. Все работало нормально, но «внезапно» (у меня нет другого слова для того, что сейчас происходит) мое приложение начало сбоить при загрузке моей активности с помощью listview:

 W/dalvikvm(  228): threadid=3: thread exiting with uncaught exception (group=0x4001b188)

E/AndroidRuntime(  228): Uncaught handler: thread main exiting due to uncaught exception

E/AndroidRuntime(  228): java.lang.NullPointerException

E/AndroidRuntime(  228):    at AdvertisementListAdapter.getView(AdvertisementListAdapter.java:72)

E/AndroidRuntime(  228):    at android.widget.AbsListView.obtainView(AbsListView.java:1274)

E/AndroidRuntime(  228):    at android.widget.ListView.measureHeightOfChildren(ListView.java:1147)

E/AndroidRuntime(  228):    at android.widget.ListView.onMeasure(ListView.java:1060)

E/AndroidRuntime(  228):    at android.view.View.measure(View.java:7964)

E/AndroidRuntime(  228):    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3023)

E/AndroidRuntime(  228):    at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:888)

E/AndroidRuntime(  228):    at android.widget.LinearLayout.measureVertical(LinearLayout.java:350)

E/AndroidRuntime(  228):    at android.widget.LinearLayout.onMeasure(LinearLayout.java:278)

E/AndroidRuntime(  228):    at android.view.View.measure(View.java:7964)

E/AndroidRuntime(  228):    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3023)

E/AndroidRuntime(  228):    at android.widget.FrameLayout.onMeasure(FrameLayout.java:245)

E/AndroidRuntime(  228):    at android.view.View.measure(View.java:7964)

E/AndroidRuntime(  228):    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3023)

E/AndroidRuntime(  228):    at android.widget.FrameLayout.onMeasure(FrameLayout.java:245)

E/AndroidRuntime(  228):    at android.view.View.measure(View.java:7964)

E/AndroidRuntime(  228):    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3023)

E/AndroidRuntime(  228):    at android.widget.FrameLayout.onMeasure(FrameLayout.java:245)

E/AndroidRuntime(  228):    at android.view.View.measure(View.java:7964)

E/AndroidRuntime(  228):    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3023)

E/AndroidRuntime(  228):    at android.widget.FrameLayout.onMeasure(FrameLayout.java:245)

E/AndroidRuntime(  228):    at android.view.View.measure(View.java:7964)

E/AndroidRuntime(  228):    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3023)

E/AndroidRuntime(  228):    at android.widget.FrameLayout.onMeasure(FrameLayout.java:245)

E/AndroidRuntime(  228):    at android.view.View.measure(View.java:7964)

E/AndroidRuntime(  228):    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3023)

E/AndroidRuntime(  228):    at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:888)

E/AndroidRuntime(  228):    at android.widget.LinearLayout.measureVertical(LinearLayout.java:350)

E/AndroidRuntime(  228):    at android.widget.LinearLayout.onMeasure(LinearLayout.java:278)

E/AndroidRuntime(  228):    at android.view.View.measure(View.java:7964)

E/AndroidRuntime(  228):    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3023)

E/AndroidRuntime(  228):    at android.widget.FrameLayout.onMeasure(FrameLayout.java:245)

E/AndroidRuntime(  228):    at android.view.View.measure(View.java:7964)

E/AndroidRuntime(  228):    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3023)

E/AndroidRuntime(  228):    at android.widget.FrameLayout.onMeasure(FrameLayout.java:245)

E/AndroidRuntime(  228):    at android.view.View.measure(View.java:7964)

E/AndroidRuntime(  228):    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3023)

E/AndroidRuntime(  228):    at android.widget.FrameLayout.onMeasure(FrameLayout.java:245)

E/AndroidRuntime(  228):    at android.view.View.measure(View.java:7964)

E/AndroidRuntime(  228):    at android.view.ViewRoot.performTraversals(ViewRoot.java:763)

E/AndroidRuntime(  228):    at android.view.ViewRoot.handleMessage(ViewRoot.java:1633)

E/AndroidRuntime(  228):    at android.os.Handler.dispatchMessage(Handler.java:99)

E/AndroidRuntime(  228):    at android.os.Looper.loop(Looper.java:123)

E/AndroidRuntime(  228):    at android.app.ActivityThread.main(ActivityThread.java:4363)

E/AndroidRuntime(  228):    at java.lang.reflect.Method.invokeNative(Native Method)

E/AndroidRuntime(  228):    at java.lang.reflect.Method.invoke(Method.java:521)

E/AndroidRuntime(  228):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)

E/AndroidRuntime(  228):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)

E/AndroidRuntime(  228):    at dalvik.system.NativeStart.main(Native Method)
  

Мой метод getView:

 @Override
    public View getView(int position, View convertView, ViewGroup parent) {

        View view=convertView;
        ViewHolder holder;

        if(convertView==null){
            view=inflater.inflate(R.layout.list_item, null); 
            holder=new ViewHolder();
            holder.imgItemImage=(ImageView)view.findViewById(R.id.imgItemImage);
            holder.tvItemTitle=(TextView)view.findViewById(R.id.tvItemTitle);
            holder.tvItemDetails=(TextView)view.findViewById(R.id.tvItemDetails);
            view.setTag(holder);
        }else
            holder=(ViewHolder)view.getTag();

        holder.tvItemTitle.setText(data.get(position).getYear() " " data.get(position).getTitle());

        StringBuilder sb=new StringBuilder();
        sb.append(data.get(position).getPrice());
        sb.append("n");
        sb.append(data.get(position).getCity());
        holder.tvItemDetails.setText(sb.toString());


        String imageUrl="http://myuri/" data.get(position).getUrlList().get(0) "/p-t.jpeg";
        holder.imgItemImage.setTag(imageUrl);

        imageLoader.displayImage(imageUrl, activity, holder.imgItemImage);

        return view;    
    }
  

При первом вызове getView создается объект convertView=null , so ViewHolder . Но после вызова findViewById(...) все члены класса ViewHolder по-прежнему равны null. Итак, вот истоки NullPointerException . Раздувание представления успешно, как я вижу во время отладки, view объект содержит RelativeLayout своих дочерних элементов.
Хуже всего то, что я не изменил эту часть приложения до того, как оно начало сбоить!
Это сводит меня с ума!

Комментарии:

1. Показан ли класс, который выдает нулевой указатель? Если да, то какая строка равна 72?

2. 72 — это holder = (ViewHolder)view.getTag(); Но когда я отлаживаю приложение, строка 72 не достигается при первом вызове getView, потому что convertView равен нулю, поэтому во время отладки я получаю исключение после holder.tvItemTitle.setText (data.get (position).getYear() «» data.get (position).getTitle());

3. Возможно ли, что ваша переменная data устарела? Может ли следующее возвращать значение null? data.get(позиция)

4. Во время отладки я проверил это, данные не равны нулю. Я получаю нули в представлениях ViewHolder после findViewById () и я не знаю почему. Все работало нормально до завтрашнего вечера…

5. Возможно, в ваших интересах разбить ваш код и поместить каждый вызов в отдельную строку (по крайней мере, в целях отладки).

Ответ №1:

Вы пытались перестроить приложение с нуля? Проект -> Очистить

Ответ №2:

Попробуйте перестроить класс R. В eclipse это так же просто, как изменить что-то в макете XML и сохранить снова, чтобы получить R.id . * обновлен. Иногда они облажаются.

Ответ №3:

Итак, это решено. Я попытался перезапустить, очистить проект. Затем я удалил его из workspace и снова открыл — это сработало. Это ошибка Eclipse, это ужасно, я потратил пару часов впустую! Спасибо всем за ответы! Извините за беспокойство…