1

我正在使用自定义数据 listViews 和一个 convertView 来创建一个可以填充自定义数据的基本 listView,我在底部附近的一段代码中得到一个空指针异常,该代码块具有“holder.text1.setText(X); " 等等。我不知道为什么以及如何解决这个问题。

(按照建议,我在 else 语句中初始化了文本视图,但仍然抛出相同的异常)

 package com.example.worksheet2;

import android.app.ListActivity;
import android.content.Context;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.TextView;

 public class D extends ListActivity {

final class DataMap {
    public String contactName = "";
    public int followerCount;


    public DataMap(String contactName, int followercount) {
        this.contactName = contactName;
        this.followerCount = followercount;
    }

}

protected LayoutInflater mLayoutInflater;
protected Context mContext = this;

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.home_list_view);
    mLayoutInflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);

    DataMap[] data = new DataMap[] {

    new DataMap("Person A", 1),
    new DataMap("Person B", 6),
    new DataMap("Person C", 6),
    new DataMap("Person D", 6),
    new DataMap("Person E", 6)

    };

    setListAdapter(new listViewAdapter(this, R.layout.home_list_view_list_item, data));

}

class ViewHolder {
    public ImageView avatar;
    public TextView text1, text2;

}

final class listViewAdapter extends ArrayAdapter<DataMap> {
    private int layoutResource;
    public DataMap[] dataObjects;

    public listViewAdapter(Context context, int resource, DataMap[] objects) {
        super(context, resource, objects);
        layoutResource = resource;
        dataObjects = objects;
    }

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

        TextView monkey = (TextView) findViewById(R.id.monkey);
        ViewHolder holder;
        if (convertView == null) {
        convertView=                                                 mLayoutInflater.inflate(layoutResource,       null, false);
            holder = (ViewHolder) convertView.getTag();
            holder = new ViewHolder();
            holder.avatar = (ImageView) findViewById(R.id.avatar);
            holder.text1 = (TextView) findViewById(R.id.title);
            holder.text2 = (TextView) findViewById(R.id.link);

            convertView.setTag(holder);
        } else {
            holder = (ViewHolder) convertView.getTag();
            holder = new ViewHolder();


        }


        DataMap data = dataObjects[position];
        holder.text1.setText(data.contactName);
        holder.text2.setText(data.followerCount);
        holder.avatar.setImageResource(R.drawable.ic_launcher);

        return convertView;
    }

}

}

编辑

这是要求的日志/堆栈跟踪:

   02-15 17:45:53.181: E/ListView(1006): null
   02-15 17:45:53.181: E/ListView(1006): java.lang.NullPointerException
   02-1517:45:53.181:E/ListView(1006):at com.example.worksheet2.D$listViewAdapter.getView(D.java:89)                                                   
02-15 17:45:53.181: E/ListView(1006):   at android.widget.AbsListView.obtainView(AbsListView.java:1449)
02-15 17:45:53.181: E/ListView(1006):   at android.widget.ListView.makeAndAddView(ListView.java:1801)
02-15 17:45:53.181: E/ListView(1006):   at android.widget.ListView.fillDown(ListView.java:671)
02-15 17:45:53.181: E/ListView(1006):   at android.widget.ListView.fillFromTop(ListView.java:728)
4

3 回答 3

4

只看 getView 方法:

如果 convertView 不为空,则 holder.text1 和 holder.text2 可能为空,因为在 if 语句之外实际上没有任何东西将 text1 和 text2 初始化为 TextViews。我会在 else 代码块中解决这个问题。

下一次,异常的堆栈跟踪会很好地查看异常发生在哪一行。

于 2013-02-15T17:45:07.883 回答
0

您没有在 listViewAdapter.getView() 的 else 块中设置 holder.text1、holder.text2 或 holder.avatar。我建议进行类似的更改:

    ...
    if (convertView == null) {
        convertView = mLayoutInflater.inflate(layoutResource,       null, false);
        holder = (ViewHolder) convertView.getTag();
        holder = new ViewHolder();

        convertView.setTag(holder);
    } else {
        holder = (ViewHolder) convertView.getTag();
        holder = new ViewHolder();
    }
    holder.avatar = (ImageView) findViewById(R.id.avatar);
    holder.text1 = (TextView) findViewById(R.id.title);
    holder.text2 = (TextView) findViewById(R.id.link);
    ...
于 2013-02-15T17:53:07.273 回答
0

更改您的 getView() 方法,如下所示:

TextView monkey = (TextView) findViewById(R.id.monkey);
        ViewHolder holder;
        if (convertView == null) {
        convertView = mLayoutInflater.inflate(layoutResource, null, false);
            holder = (ViewHolder) convertView.getTag();
            holder = new ViewHolder();
            holder.avatar = (ImageView) findViewById(R.id.avatar);
            holder.text1 = (TextView) findViewById(R.id.title);
            holder.text2 = (TextView) findViewById(R.id.link);

            convertView.setTag(holder);

        } else {
            holder = (ViewHolder) convertView.getTag();
        }

        DataMap data = dataObjects[position];
        holder.text1.setText(data.contactName);
        holder.text2.setText(data.followerCount);
        holder.avatar.setImageResource(R.drawable.ic_launcher);
于 2014-09-01T07:54:15.310 回答