android - ImageView 在 getView() 时崩溃自定义适配器

标签 android android-listview imageview

我的 ListView 在 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");

我正在使用图像下载助手从网络上检索图像。

最佳答案

发生此错误的原因是因为您正在检查 convertView 是否为 null 的 if 语句之外访问 holder 类的元素。因此它第一次工作,但是当再次调用 ListView 并且 convertView 不为 null 时,则无法以相同的方式访问持有者。因此,最好将所有赋值放在其中,如果功能如此。

 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;
}



}

关于android - ImageView 在 getView() 时崩溃自定义适配器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18614676/

相关文章:

Android Studio gradle 构建时间过长

android - 更改 Android 项目 SDK 级别

Android IME,在 EditText 中设置光标位置

android - 从 fragment 类主 Activity 调用自定义 ListView 适配器

java - ListView 的 Android 自定义行项目

Android:在某些设备上调用 notifyDataSetChanged 时, ListView 中的图像会闪烁

android - 在 android ImageView 上创建一个 "drag and clear mask"

Android Studio 更新后的 Android Gradle CompilationFailedException

Android GridView 多选

android - 空 ImageView 引用