2013-09-04 2 views
2

Мой список просмотров разбивается на getView. Когда приложение сначала загружает его, он работает хорошо, но как только я как-то уйду от него, или сделаю снимок экрана и попытаюсь разделить сбой приложений. Это пользовательский адаптер.ImageView сбойный пользовательский адаптер в getView()

public class CustomAdapter extends BaseAdapter 
{ 
private List<AlarmItem> alarms; 
private Context context; 

public CustomAdapter(List<AlarmItem> alarms,Context context) 
{ 
    this.context = context; 
    this.alarms = alarms; 
} 


@Override 
public int getCount() { 
    return alarms.size(); 
} 

@Override 
public AlarmItem getItem(int position) { 
    return alarms.get(position); 
} 

@Override 
public long getItemId(int position) { 
    return position; 
} 

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

    final AlarmItem item = getItem(position); 
    Holder holder; 

    if(convertView==null) 
    { 
     LayoutInflater layoutInflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     convertView = layoutInflater.inflate(R.layout.my_alarm_row,parent,false); 
     holder = new Holder(); 
     holder.image= (RoundedImageView)convertView.findViewById(R.id.picture); 
     holder.wakeText =(RobotoLight)convertView.findViewById(R.id.waketext); 
     holder.name =(RobotoRegular)convertView.findViewById(R.id.name); 
     holder.period = (RobotoLight)convertView.findViewById(R.id.period); 
     holder.time = (RobotoRegular)convertView.findViewById(R.id.time); 
     holder.day1 =(RobotoLight)convertView.findViewById(R.id.day1); 
     holder.day2 =(RobotoLight)convertView.findViewById(R.id.day2); 
     holder.day3 =(RobotoLight)convertView.findViewById(R.id.day3); 
     holder.day4 =(RobotoLight)convertView.findViewById(R.id.day4); 
     holder.day5 =(RobotoLight)convertView.findViewById(R.id.day5); 
     holder.day6 =(RobotoLight)convertView.findViewById(R.id.day6); 
     holder.day7 =(RobotoLight)convertView.findViewById(R.id.day7); 
    } 
    else 
    { 
     holder = (Holder)convertView.getTag(); 
    } 


    UrlImageViewHelper.setUrlDrawable(holder.image, "http://graph.facebook.com/" + item.getProfileId().trim() + "/picture?style=large"); 


    holder.wakeText.setText(context.getString(R.string.wake_message)); 
    holder.name.setText(item.getName()+" "); 
    holder.period.setText(item.getPeriod()); 
    holder.time.setText(item.getTime()); 

    /** 
    * This block code places sets the color of the particular day. If its active 
    * It sets it to a particular colour if not then the inactive colour remains. 
    */ 
    List<RobotoLight> dayList = new ArrayList<RobotoLight>(); 
    dayList.add(holder.day1); 
    dayList.add(holder.day2); 
    dayList.add(holder.day3); 
    dayList.add(holder.day4); 
    dayList.add(holder.day5); 
    dayList.add(holder.day6); 
    dayList.add(holder.day7); 


    for(int x=0;x<7;x++) 
    { 
     /** 
     * if the day at a particular point in the string is equal to one that means its active 
     * therefore set active color. 
     */ 
     if(item.getDays().charAt(x) == '1') 
     { 
      dayList.get(x).setTextColor(R.color.alarm_day_active); 
     } 
     else 
     { 
      dayList.get(x).setTextColor(R.color.alarm_day_inactive); 
     } 
    } 


    return convertView; 
} 

public static class Holder 
{ 

    RoundedImageView image; 
    RobotoLight wakeText; 
    RobotoRegular name; 
    RobotoLight period; 
    RobotoRegular time; 
    RobotoLight day1; 
    RobotoLight day2; 
    RobotoLight day3; 
    RobotoLight day4; 
    RobotoLight day5; 
    RobotoLight day6; 
    RobotoLight day7; 
} 



} 

Это мой журнал кот

09-04 08:02:45.948: ERROR/AndroidRuntime(9402): FATAL EXCEPTION: main 
    java.lang.NullPointerException 
    at com.wake.friend.adapter.AlarmAdapter.getView(AlarmAdapter.java:82) 
    at android.widget.AbsListView.obtainView(AbsListView.java:2334) 
    at android.widget.ListView.makeAndAddView(ListView.java:1937) 
    at android.widget.ListView.fillSpecific(ListView.java:1483) 
    at android.widget.ListView.layoutChildren(ListView.java:1765) 
    at android.widget.AbsListView.onLayout(AbsListView.java:2178) 
    at android.view.View.layout(View.java) 
    at android.view.ViewGroup.layout(ViewGroup.java:4380) 
    at android.widget.RelativeLayout.onLayout(RelativeLayout.java:948) 
    at android.view.View.layout(View.java) 
    at android.view.ViewGroup.layout(ViewGroup.java:4380) 
    at android.widget.FrameLayout.onLayout(FrameLayout.java:448) 
    at android.view.View.layout(View.java) 
    at android.view.ViewGroup.layout(ViewGroup.java:4380) 
    at android.support.v4.view.ViewPager.onLayout(ViewPager.java:1141) 
    at android.view.View.layout(View.java) 

И линия 82, что они говорят, нулевой указатель исключение выбрасывают на это.

UrlImageViewHelper.setUrlDrawable(holder.image, "http://graph.facebook.com/" + item.getProfileId().trim() + "/picture?style=large"); 

Я использую помощник по загрузке изображений для извлечения изображений из Интернета.

+0

Ошибка должна быть в этом фрагменте item.getProfileId(). Дифферент() –

+0

это еще не вызывает ошибку. –

+0

Используете ли вы Log.d (String, String), чтобы проверить его значение не null? –

ответ

1

Причина, по которой происходит эта ошибка, заключается в том, что вы обращаетесь к элементам своего класса-держателя за пределами оператора if, который проверял, был ли преобразованный код равным null. Поэтому он работает в первый раз, но когда просмотр списка снова вызван, а convertView не равен нулю, то к владельцу нельзя получить доступ таким же образом. Поэтому лучше всего, если вы поместите все назначения внутри, если функция будет такой.

public class CustomAdapter extends BaseAdapter 
{ 
private List<AlarmItem> alarms; 
private Context context; 

public CustomAdapter(List<AlarmItem> alarms,Context context) 
{ 
this.context = context; 
this.alarms = alarms; 
} 


@Override 
public int getCount() { 
return alarms.size(); 
} 

@Override 
public AlarmItem getItem(int position) { 
return alarms.get(position); 
} 

@Override 
public long getItemId(int position) { 
return position; 
} 

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

final AlarmItem item = getItem(position); 
Holder holder; 

if(convertView==null) 
{ 
    LayoutInflater layoutInflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    convertView = layoutInflater.inflate(R.layout.my_alarm_row,parent,false); 
    holder = new Holder(); 
    holder.image= (RoundedImageView)convertView.findViewById(R.id.picture); 
    holder.wakeText =(RobotoLight)convertView.findViewById(R.id.waketext); 
    holder.name =(RobotoRegular)convertView.findViewById(R.id.name); 
    holder.period = (RobotoLight)convertView.findViewById(R.id.period); 
    holder.time = (RobotoRegular)convertView.findViewById(R.id.time); 
    holder.day1 =(RobotoLight)convertView.findViewById(R.id.day1); 
    holder.day2 =(RobotoLight)convertView.findViewById(R.id.day2); 
    holder.day3 =(RobotoLight)convertView.findViewById(R.id.day3); 
    holder.day4 =(RobotoLight)convertView.findViewById(R.id.day4); 
    holder.day5 =(RobotoLight)convertView.findViewById(R.id.day5); 
    holder.day6 =(RobotoLight)convertView.findViewById(R.id.day6); 
    holder.day7 =(RobotoLight)convertView.findViewById(R.id.day7); 

    UrlImageViewHelper.setUrlDrawable(holder.image, "http://graph.facebook.com/" + item.getProfileId().trim() + "/picture?style=large"); 


    holder.wakeText.setText(context.getString(R.string.wake_message)); 
    holder.name.setText(item.getName()+" "); 
    holder.period.setText(item.getPeriod()); 
    holder.time.setText(item.getTime()); 

    /** 
    * This block code places sets the color of the particular day. If its active 
    * It sets it to a particular colour if not then the inactive colour remains. 
    */ 
    List<RobotoLight> dayList = new ArrayList<RobotoLight>(); 
    dayList.add(holder.day1); 
    dayList.add(holder.day2); 
    dayList.add(holder.day3); 
    dayList.add(holder.day4); 
    dayList.add(holder.day5); 
    dayList.add(holder.day6); 
    dayList.add(holder.day7); 


    for(int x=0;x<7;x++) 
    { 
     /** 
     * if the day at a particular point in the string is equal to one that means its active 
     * therefore set active color. 
     */ 
     if(item.getDays().charAt(x) == '1') 
     { 
      dayList.get(x).setTextColor(R.color.alarm_day_active); 
     } 
     else 
     { 
      dayList.get(x).setTextColor(R.color.alarm_day_inactive); 
     } 
    } 
} 
else 
{ 
    holder = (Holder)convertView.getTag(); 
} 





return convertView; 
} 

public static class Holder 
{ 

RoundedImageView image; 
RobotoLight wakeText; 
RobotoRegular name; 
RobotoLight period; 
RobotoRegular time; 
RobotoLight day1; 
RobotoLight day2; 
RobotoLight day3; 
RobotoLight day4; 
RobotoLight day5; 
RobotoLight day6; 
RobotoLight day7; 
} 



} 
+0

ooohhhhh, какая ошибка хаха, спасибо, это работает! –

0

возможно item.getProfileId() возвращение null.