我正在使用自定义数据listViews和convertView来创建一个基本的listView,它可以用自定义数据填充,我一直在底部附近的代码块上获得一个空指针异常,其中包含“holder.text1.setText(X)”等。我不知道为什么以及如何解决这个问题。
(正如建议的那样,我在the语句中初始化了文本视图,它仍然抛出了相同的异常)
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)发布于 2013-02-15 17:45:07
只查看getView方法:
看起来,如果holder.text1和holder.text2不是空的,那么convertView可能是空的,因为在if语句之外,没有任何东西实际上将text1和text2初始化为TextViews。我会在其他代码块中修复这个问题。
下一次,对异常进行堆栈跟踪将很好地了解异常发生在哪一行。
发布于 2013-02-15 17:53:07
您没有将holder.text1、holder.text2或holder.avatar设置在listViewAdapter.getView()的listViewAdapter.getView块中。我建议作出类似的改变:
...
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);
...发布于 2014-09-01 07:54:15
更改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);https://stackoverflow.com/questions/14900270
复制相似问题