Java 使用Customarrayadapter的自定义listview出错
我正在学习一个自定义的listview教程,我不确定是什么原因造成的。logcat是:Java 使用Customarrayadapter的自定义listview出错,java,android,listview,custom-adapter,Java,Android,Listview,Custom Adapter,我正在学习一个自定义的listview教程,我不确定是什么原因造成的。logcat是: 02-13 14:00:51.346: E/AndroidRuntime(26969): FATAL EXCEPTION: main 02-13 14:00:51.346: E/AndroidRuntime(26969): Process: com.skateconnect, PID: 26969 02-13 14:00:51.346: E/AndroidRuntime(26969): java.lang.N
02-13 14:00:51.346: E/AndroidRuntime(26969): FATAL EXCEPTION: main
02-13 14:00:51.346: E/AndroidRuntime(26969): Process: com.skateconnect, PID: 26969
02-13 14:00:51.346: E/AndroidRuntime(26969): java.lang.NullPointerException
02-13 14:00:51.346: E/AndroidRuntime(26969): at com.skateconnect.android.adapters.CustomBaseAdapter.getView(CustomBaseAdapter.java:57)
02-13 14:00:51.346: E/AndroidRuntime(26969): at android.widget.AbsListView.obtainView(AbsListView.java:2263)
02-13 14:00:51.346: E/AndroidRuntime(26969): at android.widget.ListView.measureHeightOfChildren(ListView.java:1263)
02-13 14:00:51.346: E/AndroidRuntime(26969): at android.widget.ListView.onMeasure(ListView.java:1175)
02-13 14:00:51.346: E/AndroidRuntime(26969): at android.view.View.measure(View.java:16573)
02-13 14:00:51.346: E/AndroidRuntime(26969): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5147)
02-13 14:00:51.346: E/AndroidRuntime(26969): at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1404)
02-13 14:00:51.346: E/AndroidRuntime(26969): at android.widget.LinearLayout.measureVertical(LinearLayout.java:695)
02-13 14:00:51.346: E/AndroidRuntime(26969): at android.widget.LinearLayout.onMeasure(LinearLayout.java:588)
02-13 14:00:51.346: E/AndroidRuntime(26969): at android.view.View.measure(View.java:16573)
02-13 14:00:51.346: E/AndroidRuntime(26969): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5147)
02-13 14:00:51.346: E/AndroidRuntime(26969): at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
02-13 14:00:51.346: E/AndroidRuntime(26969): at android.view.View.measure(View.java:16573)
02-13 14:00:51.346: E/AndroidRuntime(26969): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5147)
02-13 14:00:51.346: E/AndroidRuntime(26969): at com.android.internal.widget.ActionBarOverlayLayout.onMeasure(ActionBarOverlayLayout.java:327)
02-13 14:00:51.346: E/AndroidRuntime(26969): at android.view.View.measure(View.java:16573)
02-13 14:00:51.346: E/AndroidRuntime(26969): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5147)
02-13 14:00:51.346: E/AndroidRuntime(26969): at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
02-13 14:00:51.346: E/AndroidRuntime(26969): at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2289)
02-13 14:00:51.346: E/AndroidRuntime(26969): at android.view.View.measure(View.java:16573)
02-13 14:00:51.346: E/AndroidRuntime(26969): at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:2064)
02-13 14:00:51.346: E/AndroidRuntime(26969): at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1191)
02-13 14:00:51.346: E/AndroidRuntime(26969): at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1400)
02-13 14:00:51.346: E/AndroidRuntime(26969): at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1078)
02-13 14:00:51.346: E/AndroidRuntime(26969): at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5861)
02-13 14:00:51.346: E/AndroidRuntime(26969): at android.view.Choreographer$CallbackRecord.run(Choreographer.java:749)
02-13 14:00:51.346: E/AndroidRuntime(26969): at android.view.Choreographer.doCallbacks(Choreographer.java:562)
02-13 14:00:51.346: E/AndroidRuntime(26969): at android.view.Choreographer.doFrame(Choreographer.java:532)
02-13 14:00:51.346: E/AndroidRuntime(26969): at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:735)
02-13 14:00:51.346: E/AndroidRuntime(26969): at android.os.Handler.handleCallback(Handler.java:733)
02-13 14:00:51.346: E/AndroidRuntime(26969): at android.os.Handler.dispatchMessage(Handler.java:95)
02-13 14:00:51.346: E/AndroidRuntime(26969): at android.os.Looper.loop(Looper.java:137)
02-13 14:00:51.346: E/AndroidRuntime(26969): at android.app.ActivityThread.main(ActivityThread.java:5083)
02-13 14:00:51.346: E/AndroidRuntime(26969): at java.lang.reflect.Method.invokeNative(Native Method)
02-13 14:00:51.346: E/AndroidRuntime(26969): at java.lang.reflect.Method.invoke(Method.java:515)
02-13 14:00:51.346: E/AndroidRuntime(26969): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:777)
02-13 14:00:51.346: E/AndroidRuntime(26969): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:593)
02-13 14:00:51.346: E/AndroidRuntime(26969): at dalvik.system.NativeStart.main(Native Method)
其中custombaseadapter.java看起来像:
public class CustomBaseAdapter extends BaseAdapter {
Context context;
List<RowItem> rowItems;
public CustomBaseAdapter(Context context, List<RowItem> items) {
this.context = context;
this.rowItems = items;
}
/*private view holder class*/
private class ViewHolder {
TextView pid;
ImageView image;
TextView name;
TextView distance;
TextView date;
TextView time;
}
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder = null;
LayoutInflater mInflater = (LayoutInflater)
context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
if (convertView == null) {
convertView = mInflater.inflate(R.layout.list_item, null);
holder = new ViewHolder();
holder.pid = (TextView) convertView.findViewById(R.id.pid);
holder.image = (ImageView) convertView.findViewById(R.id.list_image);
holder.name = (TextView) convertView.findViewById(R.id.name);
holder.distance = (TextView) convertView.findViewById(R.id.distance);
holder.date = (TextView) convertView.findViewById(R.id.date);
holder.time = (TextView) convertView.findViewById(R.id.time);
convertView.setTag(holder);
}
else {
holder = (ViewHolder) convertView.getTag();
}
RowItem rowItem = (RowItem) getItem(position);
holder.pid.setText(rowItem.getpid());
holder.image.setImageResource(rowItem.getimage());
holder.name.setText(rowItem.getname());
holder.distance.setText(rowItem.getdisp_dist());
holder.date.setText(rowItem.getdate());
holder.time.setText(rowItem.gettime());
/*
*/
return convertView;
}
@Override
public int getCount() {
return rowItems.size();
}
@Override
public Object getItem(int position) {
return rowItems.get(position);
}
@Override
public long getItemId(int position) {
return rowItems.indexOf(getItem(position));
}
}
我仍然习惯于定制适配器,因此任何帮助都将不胜感激
先谢谢你
泰勒
编辑:行项目为空
编辑2:如何填充:
for (int i = 0; i < spots.length(); i++) {
JSONObject c = spots.getJSONObject(i);
search_trig=0;
// Storing each json item in variable
String strlong = c.getString(TAG_LONG);
double elong = Double.parseDouble(strlong);
String strlat = c.getString(TAG_LAT);
double elat = Double.parseDouble(strlat);
double dist = getDistance(slat, slong, elat, elong);
String distance = String.format("%.1f", dist);
String id = c.getString(TAG_PID);
String pave = c.getString(TAG_PAVEMENT);
String traffic = c.getString(TAG_TRAFFIC);
String enviro = c.getString(TAG_ENVIRONMENT);
String name = c.getString(TAG_NAME);
String image_B64 = c.getString(TAG_IMAGE_B64);
String dist_display = distance+ " Mi";
String timeAway=".";
type=".";
date=".";
time=".";
//EVENT STUFF
if(add.equals("Event")){
//need to add other stuff too
type = c.getString(TAG_TYPE);
date = c.getString(TAG_DATE);
time = c.getString(TAG_TIME);
timeAway = String.valueOf(getTimeAWAY(date));
}
image = getDispImage(type,enviro);
if(search_bp==1){
//checks distance
if(str_dist.equals("Any")==false){
if((dist>Double.parseDouble(str_dist))){
search_trig=1;
}
}
if(str_pavement.equals("Any")==false){
if((str_pavement.equals(pave)==false)){
search_trig=1;
}
}
if(str_traffic.equals("Any")==false){
if((str_traffic.equals(traffic)==false)){
search_trig=1;
}
}
if(str_enviro.equals("Any")==false){
if((str_enviro.equals(enviro)==false)){
search_trig=1;
}
}
//EVENT STUFF
if(add.equals("Event")){
if(str_type.equals("Any")==false){
if((str_type.equals(type)==false)){
search_trig=1;
}
}
}
item = new RowItem(id,image,name,distance,date,time,dist_display,timeAway);
shr_spots.put(id, new SHARE(id, name,strlong,strlat,pave,traffic,enviro,image_B64,date,time,type));
if(search_trig == 0){
//spotsList.add(map);
rowItems.add(item);
n=1;
}
}else{
//spotsList.add(map);
rowItems.add(item);
n=1;
}
}
在这方面:
RowItem rowItem = (RowItem) getItem(position);
可能getItem(position)返回null。然后,尝试对其调用getpid()=>NPE
在此行放置一个断点并检查调试器中的值,或者将值输出到logcat以确认。然后在调用方法之前,调整代码以检查空值
更新:通过填充列表的for循环,我在最后看到了以下部分:
}else{
//spotsList.add(map);
rowItems.add(item);
n=1;
}
因此,您将“item”添加到列表中,但从未在if语句中为else设置它
只有在(search_bp==1)的情况下才设置项,但在不设置项的情况下不设置项
因此,最后,在将for循环输入到列表之前,您将添加来自的项值
尝试为此情况分配适当的项目值,可能如下所示:
}else{
//spotsList.add(map);
item = new RowItem(id,image, //etc.
rowItems.add(item);
}
或者,在这种情况下,完全不要将项目添加到列表中。取决于您想要什么;-)
我希望我的猜测是正确的,并有助于解决您的问题。您的填充函数(尽管有点复杂)似乎还可以,您的构造函数似乎还可以,因此,由于stacktrace引用了测量错误,所以这可能只是一个布局问题
充气时,您正在呼叫:
convertView = mInflater.inflate(R.layout.list_item, null);
尝试将此行替换为:
convertView = mInflater.inflate(R.layout.list_item, parent, false);
更改您的返回声明 改变 返回视图 与 返回视图
这里的视图将是您的膨胀视图。您是否确保这一行:
(TextView)convertView.findViewById(R.id.pid)
是否返回非空对象?此对象也是如此:RowItem RowItem=(RowItem)getItem(position)代码>其中一个正在返回null,并且该赋值正在设置null
对象上的某个值。使用调试器查看哪些值为null。确保行的xml布局正确。调试非常简单。rowItem为null,因此getItem(position)返回null@TylerMgetItem
对内部“数据副本”执行操作,即调用构造函数时设置的第三个参数。可能您做了一些额外的操作(主要是删除),但没有更新该数据结构?rowItem返回null。是什么原因造成的?然后getItem(位置)
可能会为该位置返回null。查看如何在代码中设置项。无论如何,在调用itokay上的.getpid()之前,检查if(rowItem!=null){…}
,检查一切正常,因为它不会显示任何内容,但不会崩溃。可能是因为我在公共类RowItem{}中有更多的项是用holder命名的。?请检查CustomBaseAdapter的构造函数。它有一个列表项参数。检查列表中用于构造它的值。您的意思是:CustomBaseAdapter=new CustomBaseAdapter(AllSpotsActivity.this,rowItems);?可能是因为rowItem有pid、image、name、distance、date、time、time\u away、disp\u dist。而自定义适配器只处理最后2个以外的所有项目吗?如果您只是从适配器开始,我建议扩展ArrayAdapter
,而不是BaseAdapter
。在后一种情况下,你必须意识到要超越一些我不知道你是的事情。尝试扩展ArrayAdapter
,理解后,尝试使用BaseAdapter
。如果尝试使用ArrayAdapter,是否有任何需要更改/删除的内容?我强烈推荐此参考资料,因为它一步一步地进行:
}else{
//spotsList.add(map);
item = new RowItem(id,image, //etc.
rowItems.add(item);
}
convertView = mInflater.inflate(R.layout.list_item, null);
convertView = mInflater.inflate(R.layout.list_item, parent, false);