Android NPE自定义ListView适配器

Android NPE自定义ListView适配器,android,listview,fragment,adapter,android-arrayadapter,Android,Listview,Fragment,Adapter,Android Arrayadapter,我的ListViewAdapter类中出现NPE错误。我制作了一个自定义ListViewAdapter,但它不工作。为什么? 以下是代码和日志错误文件: 12-13 15:57:53.859: E/AndroidRuntime(22065): FATAL EXCEPTION: main 12-13 15:57:53.859: E/AndroidRuntime(22065): java.lang.NullPointerException 12-13 15:57:53.859: E/AndroidR

我的ListViewAdapter类中出现NPE错误。我制作了一个自定义ListViewAdapter,但它不工作。为什么?

以下是代码和日志错误文件:

12-13 15:57:53.859: E/AndroidRuntime(22065): FATAL EXCEPTION: main
12-13 15:57:53.859: E/AndroidRuntime(22065): java.lang.NullPointerException
12-13 15:57:53.859: E/AndroidRuntime(22065):    at android.view.LayoutInflater.from(LayoutInflater.java:211)
12-13 15:57:53.859: E/AndroidRuntime(22065):    at android.view.View.inflate(View.java:16803)
12-13 15:57:53.859: E/AndroidRuntime(22065):    at com.prjma.lovertech.adapter.ListViewAdapter.getView(ListViewAdapter.java:60)
12-13 15:57:53.859: E/AndroidRuntime(22065):    at android.widget.AbsListView.obtainView(AbsListView.java:2177)
12-13 15:57:53.859: E/AndroidRuntime(22065):    at android.widget.ListView.measureHeightOfChildren(ListView.java:1247)
12-13 15:57:53.859: E/AndroidRuntime(22065):    at android.widget.ListView.onMeasure(ListView.java:1159)
12-13 15:57:53.859: E/AndroidRuntime(22065):    at android.view.View.measure(View.java:15848)
12-13 15:57:53.859: E/AndroidRuntime(22065):    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5008)
12-13 15:57:53.859: E/AndroidRuntime(22065):    at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1404)
12-13 15:57:53.859: E/AndroidRuntime(22065):    at android.widget.LinearLayout.measureVertical(LinearLayout.java:695)
12-13 15:57:53.859: E/AndroidRuntime(22065):    at android.widget.LinearLayout.onMeasure(LinearLayout.java:588)
12-13 15:57:53.859: E/AndroidRuntime(22065):    at android.view.View.measure(View.java:15848)
12-13 15:57:53.859: E/AndroidRuntime(22065):    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5008)
12-13 15:57:53.859: E/AndroidRuntime(22065):    at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
12-13 15:57:53.859: E/AndroidRuntime(22065):    at android.view.View.measure(View.java:15848)
12-13 15:57:53.859: E/AndroidRuntime(22065):    at android.support.v4.widget.DrawerLayout.onMeasure(DrawerLayout.java:651)
12-13 15:57:53.859: E/AndroidRuntime(22065):    at android.view.View.measure(View.java:15848)
12-13 15:57:53.859: E/AndroidRuntime(22065):    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5008)
12-13 15:57:53.859: E/AndroidRuntime(22065):    at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
12-13 15:57:53.859: E/AndroidRuntime(22065):    at android.view.View.measure(View.java:15848)
12-13 15:57:53.859: E/AndroidRuntime(22065):    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5008)
12-13 15:57:53.859: E/AndroidRuntime(22065):    at com.android.internal.widget.ActionBarOverlayLayout.onMeasure(ActionBarOverlayLayout.java:302)
12-13 15:57:53.859: E/AndroidRuntime(22065):    at android.view.View.measure(View.java:15848)
12-13 15:57:53.859: E/AndroidRuntime(22065):    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5008)
12-13 15:57:53.859: E/AndroidRuntime(22065):    at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
12-13 15:57:53.859: E/AndroidRuntime(22065):    at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2189)
12-13 15:57:53.859: E/AndroidRuntime(22065):    at android.view.View.measure(View.java:15848)
12-13 15:57:53.859: E/AndroidRuntime(22065):    at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:1905)
12-13 15:57:53.859: E/AndroidRuntime(22065):    at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1104)
12-13 15:57:53.859: E/AndroidRuntime(22065):    at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1284)
12-13 15:57:53.859: E/AndroidRuntime(22065):    at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1004)
12-13 15:57:53.859: E/AndroidRuntime(22065):    at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5481)
12-13 15:57:53.859: E/AndroidRuntime(22065):    at android.view.Choreographer$CallbackRecord.run(Choreographer.java:749)
12-13 15:57:53.859: E/AndroidRuntime(22065):    at android.view.Choreographer.doCallbacks(Choreographer.java:562)
12-13 15:57:53.859: E/AndroidRuntime(22065):    at android.view.Choreographer.doFrame(Choreographer.java:532)
12-13 15:57:53.859: E/AndroidRuntime(22065):    at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:735)
12-13 15:57:53.859: E/AndroidRuntime(22065):    at android.os.Handler.handleCallback(Handler.java:730)
12-13 15:57:53.859: E/AndroidRuntime(22065):    at android.os.Handler.dispatchMessage(Handler.java:92)
12-13 15:57:53.859: E/AndroidRuntime(22065):    at android.os.Looper.loop(Looper.java:137)
12-13 15:57:53.859: E/AndroidRuntime(22065):    at android.app.ActivityThread.main(ActivityThread.java:5103)
12-13 15:57:53.859: E/AndroidRuntime(22065):    at java.lang.reflect.Method.invokeNative(Native Method)
12-13 15:57:53.859: E/AndroidRuntime(22065):    at java.lang.reflect.Method.invoke(Method.java:525)
12-13 15:57:53.859: E/AndroidRuntime(22065):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
12-13 15:57:53.859: E/AndroidRuntime(22065):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
12-13 15:57:53.859: E/AndroidRuntime(22065):    at dalvik.system.NativeStart.main(Native Method)
ListViewAdapter类:

package com.prjma.lovertech.adapter;

import java.util.ArrayList;
import java.util.HashMap;

import android.content.Context;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.TextView;

import com.prjma.lovertech.R;
import com.prjma.lovertech.model.Item;

public class ListViewAdapter extends ArrayAdapter<String>  {

    private static LayoutInflater inflater = null;

    public Context context; 
    public int layoutResourceId;
    public ArrayList<HashMap<String, String>> items;

    //public ImageLoader imageLoader;


    public ListViewAdapter(Context context, int layoutResourceId) {
        super(context, layoutResourceId);
        // TODO Auto-generated constructor stub
        Log.i("ListViewAdapter", "1");
    }

    public ListViewAdapter(Context context, int listviewItemRow, ArrayList<HashMap<String, String>> items) {
        // TODO Auto-generated constructor stub
        super(context, listviewItemRow);
        this.items = items;
        Log.i("ListViewAdapter constructor Context ", "Context1");
    }

    public int getCount() {
        return items.size();
    }

    public Item getItem(Item position) {
        return position;
    }

    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View row = convertView;
        Log.i("getView", "getView");

        if (row == null) {

            inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            row = inflater.inflate(R.layout.listview_item_row, null);
        }

        Log.i("1", Boolean.toString(items.isEmpty()));

        HashMap<String, String> p = items.get(position);

        if (p != null) {

            //ImageView listImage = (ImageView)row.findViewById(R.id.list_image);
            TextView scadenza = (TextView)row.findViewById(R.id.tvScadenza);
            TextView prezzo = (TextView)row.findViewById(R.id.tvPrezzo);
            TextView followers = (TextView)row.findViewById(R.id.tvFollowers);

            /*
            if (listImage != null) {
                listImage.animate();
            }
            */
            if (scadenza != null) {
                scadenza.setText(p.get("scadenza"));
            }
            if (prezzo != null) {
                prezzo.setText(p.get("prezzo"));
            }
            if (followers != null) {
                followers.setText(p.get("followers"));
            }
        }
        return row;
    }
}
package com.prjma.lovertech.adapter;
导入java.util.ArrayList;
导入java.util.HashMap;
导入android.content.Context;
导入android.util.Log;
导入android.view.LayoutInflater;
导入android.view.view;
导入android.view.ViewGroup;
导入android.widget.ArrayAdapter;
导入android.widget.ImageView;
导入android.widget.TextView;
导入com.prjma.lovertech.R;
导入com.prjma.lovertech.model.Item;
公共类ListViewAdapter扩展了ArrayAdapter{
专用静态充气机=空;
公共语境;
公共内部布局资源;
公共阵列列表项;
//公共图像加载器;
公共ListViewAdapter(上下文上下文,int-layoutResourceId){
超级(上下文、布局资源ID);
//TODO自动生成的构造函数存根
Log.i(“ListViewAdapter”、“1”);
}
公共ListViewAdapter(上下文上下文、int listviewItemRow、ArrayList项){
//TODO自动生成的构造函数存根
超级(上下文,listviewItemRow);
这个项目=项目;
Log.i(“ListViewAdapter构造函数上下文”、“Context1”);
}
public int getCount(){
返回items.size();
}
公共项目getItem(项目位置){
返回位置;
}
公共长getItemId(int位置){
返回位置;
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
视图行=转换视图;
Log.i(“getView”、“getView”);
if(行==null){
充气器=(LayoutFlater)context.getSystemService(context.LAYOUT\u充气器\u服务);
行=充气机。充气(R.layout.listview\u item\u行,空);
}
Log.i(“1”,Boolean.toString(items.isEmpty());
HashMap p=items.get(位置);
如果(p!=null){
//ImageView listImage=(ImageView)row.findViewById(R.id.list\u image);
TextView scadenza=(TextView)row.findViewById(R.id.tvScadenza);
TextView prezzo=(TextView)row.findViewById(R.id.tvPrezzo);
TextView followers=(TextView)row.findViewById(R.id.tvFollowers);
/*
if(listImage!=null){
listImage.animate();
}
*/
if(scadenza!=null){
scadenza.setText(p.get(“scadenza”);
}
if(prezzo!=null){
prezzo.setText(p.get(“prezzo”);
}
if(followers!=null){
followers.setText(p.get(“followers”);
}
}
返回行;
}
}
片段类:

package com.prjma.lovertech.fragment;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import org.apache.http.NameValuePair;
import org.apache.http.message.BasicNameValuePair;
import org.json.JSONException;
import org.json.JSONObject;

import android.app.Fragment;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ListView;

import com.prjma.lovertech.R;
import com.prjma.lovertech.adapter.ListViewAdapter;
import com.prjma.lovertech.util.JSONParser;


public class VendiFragment extends Fragment {


    public ListView listView;
    public ListViewAdapter adapter;

    /**
     * Keep track of the login task to ensure we can cancel it if requested.
     */
    private DownloadTask mDownloadTask = null;

    public ArrayList<HashMap<String, String>> items;

    private static String URL = ".......";

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

        View rootView = inflater.inflate(R.layout.fragment_vendi, container, false); 

        // now you must initialize your list view
        listView = (ListView) rootView.findViewById(R.id.listViewVendi);

        items = new ArrayList<HashMap<String, String>>();

        mDownloadTask = new DownloadTask();
        mDownloadTask.execute((Void) null);     

        return rootView;
    }


    /**
     * Represents an asynchronous login/registration task used to authenticate
     * the user.
     */
    public class DownloadTask extends AsyncTask<Void, Void, Boolean> {
        @Override
        protected Boolean doInBackground(Void... params) {
            // TODO: attempt authentication against a network service.

            //prendi tutti gli id dal webserver
            ArrayList<Long> ids = search();
            //per ogni id prendi l'elemento
            for(int i=0; i < ids.size() - 1; i++){
                getItem(ids.get(i));
            }

            return true;
        }

        @Override
        protected void onPostExecute(final Boolean success) {
            mDownloadTask = null;

            // dismiss the dialog after getting all products
            //showProgress(false);

            // updating UI from Background Thread
            getActivity().runOnUiThread(new Runnable() {
                public void run() {
                     //Updating parsed JSON data into ListView

                    Log.i("onPostExecute items size", Integer.toString(items.size()));
                    ListViewAdapter adapter = new ListViewAdapter(getActivity(),R.layout.listview_item_row, items);
                    // updating listview
                    //adapter.notifyDataSetChanged();
                    listView.setAdapter(adapter);
                }
            });

        }

        @Override
        protected void onCancelled() {
            mDownloadTask = null;
            //showProgress(false);
        }

        public ArrayList<Long> search(){
            // Building Parameters for search
            List<NameValuePair> parameters = new ArrayList<NameValuePair>();
            parameters.add(new BasicNameValuePair("secret", "......"));
            parameters.add(new BasicNameValuePair("category", ""));
            parameters.add(new BasicNameValuePair("latitude", ""));
            parameters.add(new BasicNameValuePair("longitude", ""));
            parameters.add(new BasicNameValuePair("radius", ""));
            parameters.add(new BasicNameValuePair("keywords", ""));
            parameters.add(new BasicNameValuePair("order", ""));
            parameters.add(new BasicNameValuePair("state", "2"));

            JSONObject obj = JSONParser.getJSONFromUrl(URL + "search", parameters);

            ArrayList<Long> ids = new ArrayList<Long>();

            // check for service response
            try {
                String firstItem = obj.getString("items");
                String[] values = firstItem.split("\\|");

                ArrayList<Long> longs = new ArrayList<Long>();

                for(int i=0; i < values.length; i++){
                    longs.add(Long.parseLong(values[i]));
                }

                String status = obj.getString("status");
                Log.i("status", status);
                if (status.equals("0")){
                    for (int i = 0; i < longs.size() - 1; i++) {
                        if (i == 0) {
                            ids.add(longs.get(i));
                        }
                        ids.add(longs.get(0) - longs.get(i + 1));
                    }

                } else {
                     Log.e("error in search", "status = " + status);
                }               
            } catch (JSONException e) {
                e.printStackTrace();
            }
            return ids;
        }


        public void getItem(long ids){
            // Building Parameters for search
            Log.i("itemid", Long.toString(ids));
            List<NameValuePair> parameters = new ArrayList<NameValuePair>();
            parameters.add(new BasicNameValuePair("secret", "......"));
            parameters.add(new BasicNameValuePair("itemid", Long.toString(ids)));
            parameters.add(new BasicNameValuePair("details", "4"));

            JSONObject obj = JSONParser.getJSONFromUrl(URL + "getitem", parameters);

            // check for service response
            try {
                String status = obj.getString("status");
                Log.i("status", status);
                if (status.equals("0")){
                    String price = obj.getString("price");

                    // creating new HashMap
                    HashMap<String, String> map = new HashMap<String, String>();

                    // adding each child node to HashMap key => value
                    map.put("scadenza", obj.getString("sec2end"));
                    map.put("prezzo", obj.getString("price"));
                    map.put("followers", obj.getString("pop"));

                    // adding HashList to ArrayList
                    items.add(map);

                    Log.i("price", price);
                } else {
                    Log.e("error in getItem", "status = " + status);
                }               
            } catch (JSONException e) {
                e.printStackTrace();
            }
        }
    }
}
package com.prjma.lovertech.fragment;
导入java.util.ArrayList;
导入java.util.HashMap;
导入java.util.List;
导入org.apache.http.NameValuePair;
导入org.apache.http.message.BasicNameValuePair;
导入org.json.JSONException;
导入org.json.JSONObject;
导入android.app.Fragment;
导入android.os.AsyncTask;
导入android.os.Bundle;
导入android.util.Log;
导入android.view.LayoutInflater;
导入android.view.view;
导入android.view.ViewGroup;
导入android.widget.ListView;
导入com.prjma.lovertech.R;
导入com.prjma.lovertech.adapter.ListViewAdapter;
导入com.prjma.lovertech.util.JSONParser;
公共类VendiFragment扩展了片段{
公共列表视图列表视图;
公共ListViewAdapter适配器;
/**
*跟踪登录任务,确保我们可以根据请求取消它。
*/
私有下载任务mDownloadTask=null;
公共阵列列表项;
私有静态字符串URL=“……”;
@凌驾
CreateView上的公共视图(布局、充气机、视图组容器、捆绑包保存状态){
视图根视图=充气机。充气(R.layout.fragment\u vendi,container,false);
//现在必须初始化列表视图
listView=(listView)rootView.findViewById(R.id.listViewVendi);
items=newarraylist();
mDownloadTask=new DownloadTask();
mDownloadTask.execute((Void)null);
返回rootView;
}
/**
*表示用于身份验证的异步登录/注册任务
*用户。
*/
公共类DownloadTask扩展了AsyncTask{
@凌驾
受保护的布尔doInBackground(Void…params){
//TODO:尝试对网络服务进行身份验证。
//prendi tutti gli id dal Web服务器
ArrayList ID=search();
//根据ogni id prendi l'elemento
对于(int i=0;ithis.context=context;
    inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    row = inflater.inflate(R.layout.listview_item_row, null);