自定义列表适配器不能正常工作JSON到Android清单 [英] Custom List adapter not working JSON to android list

查看:121
本文介绍了自定义列表适配器不能正常工作JSON到Android清单的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图按照此教程。我在遇到麻烦时,我的对象从我的JSON数据得到的物品,并将其添加到列表中的时候。我已经能够用简单的列表适配器和一个哈希映射。我想获得从简单的列表适配器和哈希映射了。这里是我的堆栈跟踪:

  10-31 13:17:19.985:E / AndroidRuntime(15047):致命异常:主要
10-31 13:17:19.985:E / AndroidRuntime(15047):显示java.lang.NullPointerException
。10-31 13:17:19.985:E / AndroidRuntime(15047):在com.almyz125.ammobot.MainActivity $ ViewHolder<&初始化GT;(MainActivity.java:62)
10-31 13:17:19.985:E / AndroidRuntime(15047):在com.almyz125.ammobot.MainActivity $ FancyAdapter.getView(MainActivity.java:44)
10-31 13:17:19.985:E / AndroidRuntime(15047):在android.widget.AbsListView.obtainView(AbsListView.java)
10-31 13:17:19.985:E / AndroidRuntime(15047):在android.widget.ListView.measureHeightOfChildren(ListView.java)
10-31 13:17:19.985:E / AndroidRuntime(15047):在android.widget.ListView.onMeasure(ListView.java)
10-31 13:17:19.985:E / AndroidRuntime(15047):在android.view.View.measure(View.java)
10-31 13:17:19.985:E / AndroidRuntime(15047):在android.widget.RelativeLayout.measureChild(RelativeLayout.java)
10-31 13:17:19.985:E / AndroidRuntime(15047):在android.widget.RelativeLayout.onMeasure(RelativeLayout.java)
10-31 13:17:19.985:E / AndroidRuntime(15047):在android.view.View.measure(View.java)
10-31 13:17:19.985:E / AndroidRuntime(15047):在android.view.ViewGroup.measureChildWithMargins(ViewGroup.java)
10-31 13:17:19.985:E / AndroidRuntime(15047):在android.widget.FrameLayout.onMeasure(FrameLayout.java)
10-31 13:17:19.985:E / AndroidRuntime(15047):在android.view.View.measure(View.java)
10-31 13:17:19.985:E / AndroidRuntime(15047):在android.view.ViewGroup.measureChildWithMargins(ViewGroup.java)
10-31 13:17:19.985:E / AndroidRuntime(15047):在com.android.internal.widget.ActionBarOverlayLayout.onMeasure(ActionBarOverlayLayout.java)
10-31 13:17:19.985:E / AndroidRuntime(15047):在android.view.View.measure(View.java)
10-31 13:17:19.985:E / AndroidRuntime(15047):在android.view.ViewGroup.measureChildWithMargins(ViewGroup.java)
10-31 13:17:19.985:E / AndroidRuntime(15047):在android.widget.FrameLayout.onMeasure(FrameLayout.java)
10-31 13:17:19.985:E / AndroidRuntime(15047):在com.android.internal.policy.impl.PhoneWindow $ DecorView.onMeasure(PhoneWindow.java)
10-31 13:17:19.985:E / AndroidRuntime(15047):在android.view.View.measure(View.java)
10-31 13:17:19.985:E / AndroidRuntime(15047):在android.view.ViewRootImpl.performMeasure(ViewRootImpl.java)
10-31 13:17:19.985:E / AndroidRuntime(15047):在android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java)
10-31 13:17:19.985:E / AndroidRuntime(15047):在android.view.ViewRootImpl.performTraversals(ViewRootImpl.java)
10-31 13:17:19.985:E / AndroidRuntime(15047):在android.view.ViewRootImpl.doTraversal(ViewRootImpl.java)
10-31 13:17:19.985:E / AndroidRuntime(15047):在android.view.ViewRootImpl $ TraversalRunnable.run(ViewRootImpl.java)
10-31 13:17:19.985:E / AndroidRuntime(15047):在android.view.Choreographer $ CallbackRecord.run(Choreographer.java)
10-31 13:17:19.985:E / AndroidRuntime(15047):在android.view.Choreographer.doCallbacks(Choreographer.java)
10-31 13:17:19.985:E / AndroidRuntime(15047):在android.view.Choreographer.doFrame(Choreographer.java)
10-31 13:17:19.985:E / AndroidRuntime(15047):在android.view.Choreographer $ FrameDisplayEventReceiver.run(Choreographer.java)
10-31 13:17:19.985:E / AndroidRuntime(15047):在android.os.Handler.handleCallback(Handler.java)
10-31 13:17:19.985:E / AndroidRuntime(15047):在android.os.Handler.dispatchMessage(Handler.java)
10-31 13:17:19.985:E / AndroidRuntime(15047):在android.os.Looper.loop(Looper.java)
10-31 13:17:19.985:E / AndroidRuntime(15047):在android.app.ActivityThread.main(ActivityThread.java)
10-31 13:17:19.985:E / AndroidRuntime(15047):在java.lang.reflect.Method.invokeNative(本机方法)
10-31 13:17:19.985:E / AndroidRuntime(15047):在java.lang.reflect.Method.invoke(Method.java)
10-31 13:17:19.985:E / AndroidRuntime(15047):在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java)
10-31 13:17:19.985:E / AndroidRuntime(15047):在com.android.internal.os.ZygoteInit.main(ZygoteInit.java)
10-31 13:17:19.985:E / AndroidRuntime(15047):在de.robv.android.xposed.XposedBridge.main(XposedBridge.java:115)
10-31 13:17:19.985:E / AndroidRuntime(15047):在dalvik.system.NativeStart.main(本机方法)

下面是我的main_activity:

 包com.almyz125.ammobot;进口的java.util.ArrayList;进口org.json.JSONArray;
进口org.json.JSONObject;进口android.app.Activity;
进口android.app.ProgressDialog;
进口android.os.AsyncTask;
进口android.os.Bundle;
进口android.util.Log;
进口android.view.LayoutInflater;
进口android.view.Menu;
进口android.view.View;
进口android.view.ViewGroup;
进口android.widget.ArrayAdapter;
进口android.widget.ListView;
进口android.widget.TextView;公共类MainActivity延伸活动{    私人字符串apiURLBase,ammoCat;
    私人ProgressDialog pDialog;
    ArrayList的<&弹药GT; arrayJSONList =新的ArrayList<&弹药GT;();
    私人JSONArray Ammos的;
    私人FancyAdapter FA = NULL;    公共类弹药{
        公共字符串的href;
        公共字符串说明;
        公共字符串的股票;
        公共字符串的价格;
        公共字符串RD;
    }    公共类FancyAdapter扩展ArrayAdapter<&弹药GT; {
        FancyAdapter(){
            超(MainActivity.this,android.R.layout.simple_list_item_1,
                    arrayJSONList);
        }        公共查看getView(INT位置,查看convertView,父母的ViewGroup){
            ViewHolder持有人=新ViewHolder(convertView);            如果(convertView == NULL){
                LayoutInflater吹气= getLayoutInflater();
                convertView = inflater.inflate(R.layout.row,NULL);
            }其他{
                支架=(ViewHolder)convertView.getTag();
            }
            holder.populateFrom(arrayJSONList.get(位置));
            回报(convertView);
        }
    }    公共类ViewHolder {
        公众的TextView DESC = NULL,HREF = NULL,圆= NULL,
                股票= NULL,价格= NULL;        ViewHolder(查看行){
            DESC =(TextView中)row.findViewById(R.id.desc);
            HREF =(TextView中)row.findViewById(R.id.href);
            圆=(TextView中)row.findViewById(R.id.rd);
            股票=(TextView中)row.findViewById(R.id.stock);
            价格=(TextView中)row.findViewById(R.id.price);
        }        无效populateFrom(弹药R){
            desc.setText(r.desc);
            href.setText(r.href);
            round.setText(r.rd);
            stock.setText(r.stock);
            price.setText(r.price);
        }    }    @覆盖
    保护无效的onCreate(捆绑savedInstanceState){
        super.onCreate(savedInstanceState);
        的setContentView(R.layout.activity_main);        apiURLBase =的getString(R.string.api_base_url);
        ammoCat =22LR;        新GetJSONTask()执行();
    }    @覆盖
    公共布尔onCreateOptionsMenu(菜单菜单){
        //充气菜单;如果是present这增加了项目操作栏。
        。getMenuInflater()膨胀(R.menu.main,菜单);
        返回true;
    }    私有类GetJSONTask扩展的AsyncTask<弦乐,无效的ArrayList<&弹药GT;> {
        @覆盖
        在preExecute保护无效(){
            如果(pDialog!= NULL){
                pDialog.dismiss();
            }            pDialog =新ProgressDialog(MainActivity.this);
            pDialog.setMessage(请稍候...);
            pDialog.setIndeterminate(真);
            pDialog.setCancelable(假);
            pDialog.show();
        }        @覆盖
        保护无效onPostExecute(ArrayList的<&弹药GT;有效){
            如果(pDialog!= NULL){
                pDialog.dismiss();
            }                            LV的ListView =(ListView控件)findViewById(R.id.mainList);
            FA =新FancyAdapter();
            lv.setAdapter(FA);        }        @覆盖
        保护的ArrayList<&弹药GT; doInBackground(字符串...为arg0){            尝试{
                JSONParser jParser =新JSONParser();
                JSONObject的JSON = jParser.getJSONFromUrl(apiURLBase + ammoCat);
                Ammos的= json.getJSONArray(ammoCat);                //System.out.println(ammos.toString());                的for(int i = 0; I< ammos.length();我++){
                    JSONObject的json_data = ammos.getJSONObject(I)                    弹药resultRow =新弹药();
                    resultRow.desc = json_data.getString(DESC);
                    resultRow.href = json_data.getString(HREF);
                    resultRow.price = json_data.getString(价格);
                    resultRow.stock = json_data.getString(股票);
                    resultRow.rd = json_data.getString(RD);                    arrayJSONList.add(resultRow);
                }            }赶上(例外五){
                Log.e(ammoCat,错误,E);
            }            返回arrayJSONList;
        }    }}

下面是我的JSON解析器类:

 包com.almyz125.ammobot;进口java.io.BufferedReader中;
进口java.io.IOException异常;
进口的java.io.InputStream;
进口java.io.InputStreamReader中;
进口java.io.UnsupportedEncodingException;进口org.apache.http.HttpEntity;
进口org.apache.http.Htt presponse;
进口org.apache.http.client.ClientProtocolException;
进口org.apache.http.client.methods.HttpPost;
进口org.apache.http.impl.client.DefaultHttpClient;
进口org.json.JSONException;
进口org.json.JSONObject;进口android.util.Log;公共类JSONParser {    静态InputStream为= NULL;
    静态的JSONObject jObj = NULL;
    静态JSON字符串=;    //构造
    公共JSONParser(){    }    公众的JSONObject getJSONFromUrl(字符串URL){        //使HTTP请求
        尝试{
            // defaultHttpClient
            DefaultHttpClient的HttpClient =新DefaultHttpClient();
            HttpPost httpPost =新HttpPost(URL);            HTT presponse HTT presponse = httpClient.execute(httpPost);
            HttpEntity httpEntity = HTT presponse.getEntity();
            是= httpEntity.getContent();        }赶上(UnsupportedEncodingException五){
            e.printStackTrace();
        }赶上(ClientProtocolException E){
            e.printStackTrace();
        }赶上(IOException异常五){
            e.printStackTrace();
        }        尝试{
            读者的BufferedReader =新的BufferedReader(新的InputStreamReader(
                    是,ISO-8859-1),8);
            StringBuilder的SB =新的StringBuilder();
            串线= NULL;
            而((行= reader.readLine())!= NULL){
                sb.append(行+\\ n);
            }
            is.close();
            JSON = sb.toString();
        }赶上(例外五){
            Log.e(缓冲区错误,错误转换结果+ e.toString());
        }        //尝试分析字符串到一个JSON对象
        尝试{
            jObj =新的JSONObject(JSON);
        }赶上(JSONException E){
            Log.e(JSON解析器,错误分析数据+ e.toString());
        }        //返回JSON字符串
        返回jObj;    }
}

该错误是由线62来为这个类:

 公共类ViewHolder {
    公众的TextView DESC = NULL,HREF = NULL,圆= NULL,
            股票= NULL,价格= NULL;    ViewHolder(查看行){
        DESC =(TextView中)row.findViewById(R.id.desc);
        HREF =(TextView中)row.findViewById(R.id.href);
        圆=(TextView中)row.findViewById(R.id.rd);
        股票=(TextView中)row.findViewById(R.id.stock);
        价格=(TextView中)row.findViewById(R.id.price);
    }    无效populateFrom(弹药R){
        desc.setText(r.desc);
        href.setText(r.href);
        round.setText(r.rd);
        stock.setText(r.stock);
        price.setText(r.price);
    }}

和这一行:

  DESC =(TextView中)row.findViewById(R.id.desc);

新的适配器类:

 公共类FancyAdapter扩展ArrayAdapter<&弹药GT; {
    FancyAdapter(){
        超(MainActivity.this,android.R.layout.simple_list_item_1,
                arrayJSONList);
    }    公共查看getView(INT位置,查看convertView,父母的ViewGroup){
        ViewHolder持有人;        如果(convertView == NULL){
            LayoutInflater吹气= getLayoutInflater();
            convertView = inflater.inflate(R.layout.row,NULL);
            持有人=新ViewHolder(convertView);
        }其他{
            支架=(ViewHolder)convertView.getTag();
        }
        holder.populateFrom(arrayJSONList.get(位置));
        回报(convertView);
    }
}

我现在得到这个堆栈:

  10-31 13:30:​​27.065:E / AndroidRuntime(16085):致命异常:主要
10-31 13:30:​​27.065:E / AndroidRuntime(16085):显示java.lang.NullPointerException
10-31 13:30:​​27.065:E / AndroidRuntime(16085):在com.almyz125.ammobot.MainActivity $ FancyAdapter.getView(MainActivity.java:53)
10-31 13:30:​​27.065:E / AndroidRuntime(16085):在android.widget.AbsListView.obtainView(AbsListView.java)
10-31 13:30:​​27.065:E / AndroidRuntime(16085):在android.widget.ListView.measureHeightOfChildren(ListView.java)
10-31 13:30:​​27.065:E / AndroidRuntime(16085):在android.widget.ListView.onMeasure(ListView.java)
10-31 13:30:​​27.065:E / AndroidRuntime(16085):在android.view.View.measure(View.java)
10-31 13:30:​​27.065:E / AndroidRuntime(16085):在android.widget.RelativeLayout.measureChild(RelativeLayout.java)
10-31 13:30:​​27.065:E / AndroidRuntime(16085):在android.widget.RelativeLayout.onMeasure(RelativeLayout.java)
10-31 13:30:​​27.065:E / AndroidRuntime(16085):在android.view.View.measure(View.java)
10-31 13:30:​​27.065:E / AndroidRuntime(16085):在android.view.ViewGroup.measureChildWithMargins(ViewGroup.java)
10-31 13:30:​​27.065:E / AndroidRuntime(16085):在android.widget.FrameLayout.onMeasure(FrameLayout.java)
10-31 13:30:​​27.065:E / AndroidRuntime(16085):在android.view.View.measure(View.java)
10-31 13:30:​​27.065:E / AndroidRuntime(16085):在android.view.ViewGroup.measureChildWithMargins(ViewGroup.java)
10-31 13:30:​​27.065:E / AndroidRuntime(16085):在com.android.internal.widget.ActionBarOverlayLayout.onMeasure(ActionBarOverlayLayout.java)
10-31 13:30:​​27.065:E / AndroidRuntime(16085):在android.view.View.measure(View.java)
10-31 13:30:​​27.065:E / AndroidRuntime(16085):在android.view.ViewGroup.measureChildWithMargins(ViewGroup.java)
10-31 13:30:​​27.065:E / AndroidRuntime(16085):在android.widget.FrameLayout.onMeasure(FrameLayout.java)
10-31 13:30:​​27.065:E / AndroidRuntime(16085):在com.android.internal.policy.impl.PhoneWindow $ DecorView.onMeasure(PhoneWindow.java)
10-31 13:30:​​27.065:E / AndroidRuntime(16085):在android.view.View.measure(View.java)
10-31 13:30:​​27.065:E / AndroidRuntime(16085):在android.view.ViewRootImpl.performMeasure(ViewRootImpl.java)
10-31 13:30:​​27.065:E / AndroidRuntime(16085):在android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java)
10-31 13:30:​​27.065:E / AndroidRuntime(16085):在android.view.ViewRootImpl.performTraversals(ViewRootImpl.java)
10-31 13:30:​​27.065:E / AndroidRuntime(16085):在android.view.ViewRootImpl.doTraversal(ViewRootImpl.java)
10-31 13:30:​​27.065:E / AndroidRuntime(16085):在android.view.ViewRootImpl $ TraversalRunnable.run(ViewRootImpl.java)
10-31 13:30:​​27.065:E / AndroidRuntime(16085):在android.view.Choreographer $ CallbackRecord.run(Choreographer.java)
10-31 13:30:​​27.065:E / AndroidRuntime(16085):在android.view.Choreographer.doCallbacks(Choreographer.java)
10-31 13:30:​​27.065:E / AndroidRuntime(16085):在android.view.Choreographer.doFrame(Choreographer.java)
10-31 13:30:​​27.065:E / AndroidRuntime(16085):在android.view.Choreographer $ FrameDisplayEventReceiver.run(Choreographer.java)
10-31 13:30:​​27.065:E / AndroidRuntime(16085):在android.os.Handler.handleCallback(Handler.java)
10-31 13:30:​​27.065:E / AndroidRuntime(16085):在android.os.Handler.dispatchMessage(Handler.java)
10-31 13:30:​​27.065:E / AndroidRuntime(16085):在android.os.Looper.loop(Looper.java)
10-31 13:30:​​27.065:E / AndroidRuntime(16085):在android.app.ActivityThread.main(ActivityThread.java)
10-31 13:30:​​27.065:E / AndroidRuntime(16085):在java.lang.reflect.Method.invokeNative(本机方法)
10-31 13:30:​​27.065:E / AndroidRuntime(16085):在java.lang.reflect.Method.invoke(Method.java)
10-31 13:30:​​27.065:E / AndroidRuntime(16085):在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java)
10-31 13:30:​​27.065:E / AndroidRuntime(16085):在com.android.internal.os.ZygoteInit.main(ZygoteInit.java)
10-31 13:30:​​27.065:E / AndroidRuntime(16085):在de.robv.android.xposed.XposedBridge.main(XposedBridge.java:115)
10-31 13:30:​​27.065:E / AndroidRuntime(16085):在dalvik.system.NativeStart.main(本机方法)

的错误似乎在这里:

  holder.populateFrom(arrayJSONList.get(位置));

仍然在上面的线得到一个错误。

这是我获取视图现在:

 公共查看getView(INT位置,查看convertView,父母的ViewGroup){
        ViewHolder支架=无效;        如果(convertView == NULL){
            LayoutInflater吹气= getLayoutInflater();
            convertView = inflater.inflate(R.layout.row,NULL);
            convertView.setTag(保持器);
            持有人=新ViewHolder(convertView);
        }其他{
            支架=(ViewHolder)convertView.getTag();
        }
        holder.populateFrom(arrayJSONList.get(位置));
        回报(convertView);
    }


作为njzk2说你必须移动 ViewHolder持有人=新ViewHolder(convertView); 创作的后视图。

和则还必须设置 convertView.setTag(持有人); ,否则就会有越来越当 NullPointerException异常 =持有人(ViewHolder)convertView.getTag();

 公共查看getView(INT位置,查看convertView,父母的ViewGroup)
    {
        如果(convertView == NULL){
            LayoutInflater吹气= getLayoutInflater();
            convertView = inflater.inflate(R.layout.row,NULL);
        }其他{
            支架=(ViewHolder)convertView.getTag();
        }        ViewHolder持有人=新ViewHolder(convertView);
        convertView.setTag(保持器);        holder.populateFrom(arrayJSONList.get(位置));
        回报(convertView);
    }

I am trying to make a custom list adapter by following this tutorial. I'm having trouble when when my object gets items from my JSON data and adds it to the list. I've been able to use the simple list adapter and a hash map. I'd like to get away from the simple list adapter and hash maps. Here is my stack trace:

10-31 13:17:19.985: E/AndroidRuntime(15047): FATAL EXCEPTION: main
10-31 13:17:19.985: E/AndroidRuntime(15047): java.lang.NullPointerException
10-31 13:17:19.985: E/AndroidRuntime(15047):    at com.almyz125.ammobot.MainActivity$ViewHolder.<init>(MainActivity.java:62)
10-31 13:17:19.985: E/AndroidRuntime(15047):    at com.almyz125.ammobot.MainActivity$FancyAdapter.getView(MainActivity.java:44)
10-31 13:17:19.985: E/AndroidRuntime(15047):    at android.widget.AbsListView.obtainView(AbsListView.java)
10-31 13:17:19.985: E/AndroidRuntime(15047):    at android.widget.ListView.measureHeightOfChildren(ListView.java)
10-31 13:17:19.985: E/AndroidRuntime(15047):    at android.widget.ListView.onMeasure(ListView.java)
10-31 13:17:19.985: E/AndroidRuntime(15047):    at android.view.View.measure(View.java)
10-31 13:17:19.985: E/AndroidRuntime(15047):    at android.widget.RelativeLayout.measureChild(RelativeLayout.java)
10-31 13:17:19.985: E/AndroidRuntime(15047):    at android.widget.RelativeLayout.onMeasure(RelativeLayout.java)
10-31 13:17:19.985: E/AndroidRuntime(15047):    at android.view.View.measure(View.java)
10-31 13:17:19.985: E/AndroidRuntime(15047):    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java)
10-31 13:17:19.985: E/AndroidRuntime(15047):    at android.widget.FrameLayout.onMeasure(FrameLayout.java)
10-31 13:17:19.985: E/AndroidRuntime(15047):    at android.view.View.measure(View.java)
10-31 13:17:19.985: E/AndroidRuntime(15047):    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java)
10-31 13:17:19.985: E/AndroidRuntime(15047):    at com.android.internal.widget.ActionBarOverlayLayout.onMeasure(ActionBarOverlayLayout.java)
10-31 13:17:19.985: E/AndroidRuntime(15047):    at android.view.View.measure(View.java)
10-31 13:17:19.985: E/AndroidRuntime(15047):    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java)
10-31 13:17:19.985: E/AndroidRuntime(15047):    at android.widget.FrameLayout.onMeasure(FrameLayout.java)
10-31 13:17:19.985: E/AndroidRuntime(15047):    at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java)
10-31 13:17:19.985: E/AndroidRuntime(15047):    at android.view.View.measure(View.java)
10-31 13:17:19.985: E/AndroidRuntime(15047):    at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java)
10-31 13:17:19.985: E/AndroidRuntime(15047):    at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java)
10-31 13:17:19.985: E/AndroidRuntime(15047):    at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java)
10-31 13:17:19.985: E/AndroidRuntime(15047):    at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java)
10-31 13:17:19.985: E/AndroidRuntime(15047):    at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java)
10-31 13:17:19.985: E/AndroidRuntime(15047):    at android.view.Choreographer$CallbackRecord.run(Choreographer.java)
10-31 13:17:19.985: E/AndroidRuntime(15047):    at android.view.Choreographer.doCallbacks(Choreographer.java)
10-31 13:17:19.985: E/AndroidRuntime(15047):    at android.view.Choreographer.doFrame(Choreographer.java)
10-31 13:17:19.985: E/AndroidRuntime(15047):    at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java)
10-31 13:17:19.985: E/AndroidRuntime(15047):    at android.os.Handler.handleCallback(Handler.java)
10-31 13:17:19.985: E/AndroidRuntime(15047):    at android.os.Handler.dispatchMessage(Handler.java)
10-31 13:17:19.985: E/AndroidRuntime(15047):    at android.os.Looper.loop(Looper.java)
10-31 13:17:19.985: E/AndroidRuntime(15047):    at android.app.ActivityThread.main(ActivityThread.java)
10-31 13:17:19.985: E/AndroidRuntime(15047):    at java.lang.reflect.Method.invokeNative(Native Method)
10-31 13:17:19.985: E/AndroidRuntime(15047):    at java.lang.reflect.Method.invoke(Method.java)
10-31 13:17:19.985: E/AndroidRuntime(15047):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java)
10-31 13:17:19.985: E/AndroidRuntime(15047):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java)
10-31 13:17:19.985: E/AndroidRuntime(15047):    at de.robv.android.xposed.XposedBridge.main(XposedBridge.java:115)
10-31 13:17:19.985: E/AndroidRuntime(15047):    at dalvik.system.NativeStart.main(Native Method)

Here is my main_activity:

package com.almyz125.ammobot;

import java.util.ArrayList;

import org.json.JSONArray;
import org.json.JSONObject;

import android.app.Activity;
import android.app.ProgressDialog;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.TextView;

public class MainActivity extends Activity {

    private String apiURLBase, ammoCat;
    private ProgressDialog pDialog;
    ArrayList<Ammo> arrayJSONList = new ArrayList<Ammo>();
    private JSONArray ammos;
    private FancyAdapter fa = null;

    public class Ammo {
        public String href;
        public String desc;
        public String stock;
        public String price;
        public String rd;
    }

    public class FancyAdapter extends ArrayAdapter<Ammo> {
        FancyAdapter() {
            super(MainActivity.this, android.R.layout.simple_list_item_1,
                    arrayJSONList);
        }

        public View getView(int position, View convertView, ViewGroup parent) {
            ViewHolder holder = new ViewHolder(convertView);

            if (convertView == null) {
                LayoutInflater inflater = getLayoutInflater();
                convertView = inflater.inflate(R.layout.row, null);
            } else {
                holder = (ViewHolder) convertView.getTag();
            }
            holder.populateFrom(arrayJSONList.get(position));
            return (convertView);
        }
    }

    public class ViewHolder {
        public TextView desc = null, href = null, round = null,
                stock = null, price = null;

        ViewHolder(View row) {
            desc = (TextView) row.findViewById(R.id.desc);
            href = (TextView) row.findViewById(R.id.href);
            round = (TextView) row.findViewById(R.id.rd);
            stock = (TextView) row.findViewById(R.id.stock);
            price = (TextView) row.findViewById(R.id.price);
        }

        void populateFrom(Ammo r) {
            desc.setText(r.desc);
            href.setText(r.href);
            round.setText(r.rd);
            stock.setText(r.stock);
            price.setText(r.price);
        }

    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        apiURLBase = getString(R.string.api_base_url);
        ammoCat = "22lr";

        new GetJSONTask().execute();
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    private class GetJSONTask extends AsyncTask<String, Void, ArrayList<Ammo>> {


        @Override
        protected void onPreExecute() {
            if (pDialog != null) {
                pDialog.dismiss();
            }

            pDialog = new ProgressDialog(MainActivity.this);
            pDialog.setMessage("Please wait..");
            pDialog.setIndeterminate(true);
            pDialog.setCancelable(false);
            pDialog.show();
        }

        @Override
        protected void onPostExecute(ArrayList<Ammo> valid) {
            if (pDialog != null) {
                pDialog.dismiss();
            }

                            ListView lv = (ListView)findViewById(R.id.mainList);
            fa = new FancyAdapter();
            lv.setAdapter(fa);

        }

        @Override
        protected ArrayList<Ammo> doInBackground(String... arg0) {

            try {
                JSONParser jParser = new JSONParser();
                JSONObject json = jParser.getJSONFromUrl(apiURLBase + ammoCat);
                ammos = json.getJSONArray(ammoCat);

                //System.out.println(ammos.toString());

                for (int i = 0; i < ammos.length(); i++) {
                    JSONObject json_data = ammos.getJSONObject(i);

                    Ammo resultRow = new Ammo();
                    resultRow.desc = json_data.getString("desc");
                    resultRow.href = json_data.getString("href");
                    resultRow.price = json_data.getString("price");
                    resultRow.stock = json_data.getString("stock");
                    resultRow.rd = json_data.getString("rd");

                    arrayJSONList.add(resultRow);
                }

            } catch (Exception e) {
                Log.e(ammoCat, "Error:", e);
            }

            return arrayJSONList;
        }

    }

}

Here is my JSON parser class:

    package com.almyz125.ammobot;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.json.JSONException;
import org.json.JSONObject;

import android.util.Log;

public class JSONParser {

    static InputStream is = null;
    static JSONObject jObj = null;
    static String json = "";

    // constructor
    public JSONParser() {

    }

    public JSONObject getJSONFromUrl(String url) {

        // Making HTTP request
        try {
            // defaultHttpClient
            DefaultHttpClient httpClient = new DefaultHttpClient();
            HttpPost httpPost = new HttpPost(url);

            HttpResponse httpResponse = httpClient.execute(httpPost);
            HttpEntity httpEntity = httpResponse.getEntity();
            is = httpEntity.getContent();           

        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (ClientProtocolException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

        try {
            BufferedReader reader = new BufferedReader(new InputStreamReader(
                    is, "iso-8859-1"), 8);
            StringBuilder sb = new StringBuilder();
            String line = null;
            while ((line = reader.readLine()) != null) {
                sb.append(line + "\n");
            }
            is.close();
            json = sb.toString();
        } catch (Exception e) {
            Log.e("Buffer Error", "Error converting result " + e.toString());
        }

        // try parse the string to a JSON object
        try {
            jObj = new JSONObject(json);
        } catch (JSONException e) {
            Log.e("JSON Parser", "Error parsing data " + e.toString());
        }

        // return JSON String
        return jObj;

    }
}

The error is coming from line 62 which is this class:

public class ViewHolder {
    public TextView desc = null, href = null, round = null,
            stock = null, price = null;

    ViewHolder(View row) {
        desc = (TextView) row.findViewById(R.id.desc);
        href = (TextView) row.findViewById(R.id.href);
        round = (TextView) row.findViewById(R.id.rd);
        stock = (TextView) row.findViewById(R.id.stock);
        price = (TextView) row.findViewById(R.id.price);
    }

    void populateFrom(Ammo r) {
        desc.setText(r.desc);
        href.setText(r.href);
        round.setText(r.rd);
        stock.setText(r.stock);
        price.setText(r.price);
    }

}

and this line:

desc = (TextView) row.findViewById(R.id.desc);

New adapter class:

public class FancyAdapter extends ArrayAdapter<Ammo> {
    FancyAdapter() {
        super(MainActivity.this, android.R.layout.simple_list_item_1,
                arrayJSONList);
    }

    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder;

        if (convertView == null) {
            LayoutInflater inflater = getLayoutInflater();
            convertView = inflater.inflate(R.layout.row, null);
            holder = new ViewHolder(convertView);
        } else {
            holder = (ViewHolder) convertView.getTag();
        }
        holder.populateFrom(arrayJSONList.get(position));
        return (convertView);
    }
}

I'm now getting this stack:

    10-31 13:30:27.065: E/AndroidRuntime(16085): FATAL EXCEPTION: main
10-31 13:30:27.065: E/AndroidRuntime(16085): java.lang.NullPointerException
10-31 13:30:27.065: E/AndroidRuntime(16085):    at com.almyz125.ammobot.MainActivity$FancyAdapter.getView(MainActivity.java:53)
10-31 13:30:27.065: E/AndroidRuntime(16085):    at android.widget.AbsListView.obtainView(AbsListView.java)
10-31 13:30:27.065: E/AndroidRuntime(16085):    at android.widget.ListView.measureHeightOfChildren(ListView.java)
10-31 13:30:27.065: E/AndroidRuntime(16085):    at android.widget.ListView.onMeasure(ListView.java)
10-31 13:30:27.065: E/AndroidRuntime(16085):    at android.view.View.measure(View.java)
10-31 13:30:27.065: E/AndroidRuntime(16085):    at android.widget.RelativeLayout.measureChild(RelativeLayout.java)
10-31 13:30:27.065: E/AndroidRuntime(16085):    at android.widget.RelativeLayout.onMeasure(RelativeLayout.java)
10-31 13:30:27.065: E/AndroidRuntime(16085):    at android.view.View.measure(View.java)
10-31 13:30:27.065: E/AndroidRuntime(16085):    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java)
10-31 13:30:27.065: E/AndroidRuntime(16085):    at android.widget.FrameLayout.onMeasure(FrameLayout.java)
10-31 13:30:27.065: E/AndroidRuntime(16085):    at android.view.View.measure(View.java)
10-31 13:30:27.065: E/AndroidRuntime(16085):    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java)
10-31 13:30:27.065: E/AndroidRuntime(16085):    at com.android.internal.widget.ActionBarOverlayLayout.onMeasure(ActionBarOverlayLayout.java)
10-31 13:30:27.065: E/AndroidRuntime(16085):    at android.view.View.measure(View.java)
10-31 13:30:27.065: E/AndroidRuntime(16085):    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java)
10-31 13:30:27.065: E/AndroidRuntime(16085):    at android.widget.FrameLayout.onMeasure(FrameLayout.java)
10-31 13:30:27.065: E/AndroidRuntime(16085):    at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java)
10-31 13:30:27.065: E/AndroidRuntime(16085):    at android.view.View.measure(View.java)
10-31 13:30:27.065: E/AndroidRuntime(16085):    at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java)
10-31 13:30:27.065: E/AndroidRuntime(16085):    at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java)
10-31 13:30:27.065: E/AndroidRuntime(16085):    at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java)
10-31 13:30:27.065: E/AndroidRuntime(16085):    at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java)
10-31 13:30:27.065: E/AndroidRuntime(16085):    at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java)
10-31 13:30:27.065: E/AndroidRuntime(16085):    at android.view.Choreographer$CallbackRecord.run(Choreographer.java)
10-31 13:30:27.065: E/AndroidRuntime(16085):    at android.view.Choreographer.doCallbacks(Choreographer.java)
10-31 13:30:27.065: E/AndroidRuntime(16085):    at android.view.Choreographer.doFrame(Choreographer.java)
10-31 13:30:27.065: E/AndroidRuntime(16085):    at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java)
10-31 13:30:27.065: E/AndroidRuntime(16085):    at android.os.Handler.handleCallback(Handler.java)
10-31 13:30:27.065: E/AndroidRuntime(16085):    at android.os.Handler.dispatchMessage(Handler.java)
10-31 13:30:27.065: E/AndroidRuntime(16085):    at android.os.Looper.loop(Looper.java)
10-31 13:30:27.065: E/AndroidRuntime(16085):    at android.app.ActivityThread.main(ActivityThread.java)
10-31 13:30:27.065: E/AndroidRuntime(16085):    at java.lang.reflect.Method.invokeNative(Native Method)
10-31 13:30:27.065: E/AndroidRuntime(16085):    at java.lang.reflect.Method.invoke(Method.java)
10-31 13:30:27.065: E/AndroidRuntime(16085):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java)
10-31 13:30:27.065: E/AndroidRuntime(16085):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java)
10-31 13:30:27.065: E/AndroidRuntime(16085):    at de.robv.android.xposed.XposedBridge.main(XposedBridge.java:115)
10-31 13:30:27.065: E/AndroidRuntime(16085):    at dalvik.system.NativeStart.main(Native Method)

The error seems to be here:

    holder.populateFrom(arrayJSONList.get(position));

Still getting an error at the above line.

here is my get view now:

public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder = null;

        if (convertView == null) {
            LayoutInflater inflater = getLayoutInflater();
            convertView = inflater.inflate(R.layout.row, null);
            convertView.setTag(holder);
            holder = new ViewHolder(convertView);
        } else {
            holder = (ViewHolder) convertView.getTag();
        }
        holder.populateFrom(arrayJSONList.get(position));
        return (convertView);
    }

解决方案

as njzk2 said you must move ViewHolder holder = new ViewHolder(convertView); after the creation of the view.

And you must also set convertView.setTag(holder);, otherwise you will have a NullPointerException when getting to holder = (ViewHolder) convertView.getTag();

    public View getView(int position, View convertView, ViewGroup parent) 
    {
        if (convertView == null) {
            LayoutInflater inflater = getLayoutInflater();
            convertView = inflater.inflate(R.layout.row, null);
        } else {
            holder = (ViewHolder) convertView.getTag();
        }

        ViewHolder holder = new ViewHolder(convertView);
        convertView.setTag(holder);

        holder.populateFrom(arrayJSONList.get(position));
        return (convertView);
    }

这篇关于自定义列表适配器不能正常工作JSON到Android清单的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆