Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/388.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用Customarrayadapter的自定义listview出错_Java_Android_Listview_Custom Adapter - Fatal编程技术网

Java 使用Customarrayadapter的自定义listview出错

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

我正在学习一个自定义的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.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@TylerM
getItem
对内部“数据副本”执行操作,即调用构造函数时设置的第三个参数。可能您做了一些额外的操作(主要是删除),但没有更新该数据结构?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);