使用片段中的json parsor获取listview

时间:2015-07-27 04:57:04

标签: android json xml android-fragments

设置片段

package com.sample.mpassbook.mpassbook_d;
import android.app.Activity;
import android.app.ProgressDialog;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.SimpleAdapter;

import com.sample.mpassbook.httpconnection.Httpmanager;

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

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

/**
 * Created by abhil on 22/07/15.
 */
public class Settingsfragment extends Fragment {
    ListView list;
    ArrayList<HashMap<String, String>> oslist;
    private ProgressDialog pDialog;
    private static String url="https://fierce-tundra-4082.herokuapp.com/transactions/?msisdn=456&account=123&from_date=2015-07-10&format=json";
    public static final String TAG_content = "content";
    public static final String TAG_bankid = "bank_id";
    public static final String TAG_status = "details";
    public static final String TAG_Date = "date";
    public static final String TAG_cval = "amount";
    //    public static final String TAG_dval = "debit_val";
    public static final String TAG_bal = "balance";
    JSONArray content = null;

    public Settingsfragment() {
        // Required empty public constructor
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.settings, container, false);


        // Inflate the layout for this fragment
        return rootView;
    }

    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
    }

    @Override
    public void onDetach() {
        super.onDetach();
    }
    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onActivityCreated(savedInstanceState);

        oslist = new ArrayList<HashMap<String, String>>();
        new getlist().execute();
    }
    private class getlist extends AsyncTask<String, String, JSONObject> {
        Httpmanager jParser = new Httpmanager();
        private JSONObject json;

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            pDialog = new ProgressDialog(getActivity());
            pDialog.setMessage("Please wait...");
            pDialog.setCancelable(false);
            pDialog.show();
        }
        @Override
        protected JSONObject doInBackground(String... args) {

            // Getting JSON from URL
            String json = jParser.makeServiceCall(url, Httpmanager.get);
           oslist = new ArrayList<HashMap<String, String>>();
            try {
                JSONObject jsonObject = new JSONObject(json);
                content = jsonObject.getJSONArray(TAG_content);


                for (int i = 0; i < content.length(); i++) {
                    JSONObject c = content.getJSONObject(i);

                    String bank_id = c.getString(TAG_bankid);
                    String details = c.getString(TAG_status);
                    String date = c.getString(TAG_Date);
                    String amount = c.getString(TAG_cval);
                    String balance = c.getString(TAG_bal);


                    HashMap<String, String> contents = new HashMap<String, String>();

                    contents.put(TAG_bankid, "TRANSACTION ID : " + bank_id);
                    contents.put(TAG_status, "" + details);
                    contents.put(TAG_Date, "" + date);
                    contents.put(TAG_cval, "" + amount);
                    oslist.add(contents);
                    list = (ListView) getView().findViewById(R.id.list_item);

                }
            } catch (JSONException e) {
                e.printStackTrace();
            }



                    return null;
                }
                @Override
                protected void onPostExecute (JSONObject json){
                    pDialog.dismiss();
       ListAdapter adapter = new SimpleAdapter(getActivity(), oslist,                     R.layout.item, new String[]{TAG_bankid, TAG_status, TAG_Date, TAG_cval},
       new int[]{R.id.bankid, R.id.status, R.id.date, R.id.cval});
                        list.setAdapter(adapter);



                }
            }

}

的settings.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.sample.mpassbook.mpassbook_d.TransactionFragment">

    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content">

    <ListView
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:id="@android:id/list"/>

    </LinearLayout>
    <!--<TextView-->
        <!--android:id="@+id/label"-->
        <!--android:layout_alignParentTop="true"-->
        <!--android:layout_marginTop="100dp"-->
        <!--android:layout_width="fill_parent"-->
        <!--android:layout_height="wrap_content"-->
        <!--android:gravity="center_horizontal"-->
        <!--android:textSize="45dp"-->
        <!--android:text="HOME"-->
        <!--android:textStyle="bold"/>-->
</RelativeLayout>

item.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical"
    android:padding="10dp"
    android:paddingLeft="10dp"
    android:paddingRight="10dp"
    android:id="@+id/item">

    <TextView
        android:id="@+id/bankid"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:paddingBottom="2dip"
        android:paddingTop="6dip"
        android:textColor="#5d5d5d"
        android:text="bankid"
        android:textSize="16sp"
        android:textStyle="bold"
        android:layout_alignParentTop="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true" />
    <TextView
        android:id="@+id/status"
        android:layout_width="67dp"
        android:layout_height="wrap_content"
        android:paddingBottom="2dip"
        android:text="status"
        android:textStyle="bold"
        android:textColor="#5d5d5d"
        android:layout_below="@+id/bankid"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true" />

    <TextView
        android:id="@+id/dval"
        android:layout_width="78dp"
        android:layout_height="wrap_content"
        android:paddingBottom="2dip"
        android:textColor="#43bd00"
        android:textStyle="bold"
        android:layout_gravity="right"
        android:layout_above="@+id/date"
        android:layout_alignRight="@+id/bankid"
        android:layout_alignEnd="@+id/bankid" />

    <TextView
        android:id="@+id/cval"
        android:layout_width="78dp"
        android:layout_height="wrap_content"
        android:paddingBottom="2dip"
        android:textStyle="bold"
        android:textColor="#FF0000"
        android:layout_gravity="right"
        android:layout_below="@+id/bankid"
        android:layout_alignRight="@+id/bankid"
        android:layout_alignEnd="@+id/bankid" />

    <TextView
        android:id="@+id/date"
        android:layout_width="71dp"
        android:layout_height="wrap_content"
        android:gravity="left"
        android:text="date"
        android:textColor="#5d5d5d"
        android:textStyle="bold"
        android:layout_below="@+id/status"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true" />

</RelativeLayout>

我已经调试了代码,我正在进行每次解析但错误是在设置片段中的第120行,其中我的列表没有附加到项目。请给我一些新的建议。这对我很有帮助。请不要将其视为否定问题。你的建议对我有价值。

Logcat messeage

07-27 10:29:30.634    2273-2289/com.sample.mpassbook.mpassbook_d E/AndroidRuntime﹕ FATAL EXCEPTION: AsyncTask #1
    Process: com.sample.mpassbook.mpassbook_d, PID: 2273
    java.lang.RuntimeException: An error occured while executing doInBackground()
            at android.os.AsyncTask$3.done(AsyncTask.java:300)
            at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355)
            at java.util.concurrent.FutureTask.setException(FutureTask.java:222)
            at java.util.concurrent.FutureTask.run(FutureTask.java:242)
            at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
            at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
            at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
            at java.lang.Thread.run(Thread.java:818)
     Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.ListView.setAdapter(android.widget.ListAdapter)' on a null object reference
            at com.sample.mpassbook.mpassbook_d.Settingsfragment$getlist.doInBackground(Settingsfragment.java:121)
            at com.sample.mpassbook.mpassbook_d.Settingsfragment$getlist.doInBackground(Settingsfragment.java:78)
            at android.os.AsyncTask$2.call(AsyncTask.java:288)
            at java.util.concurrent.FutureTask.run(FutureTask.java:237)
            at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
            at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
            at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
            at java.lang.Thread.run(Thread.java:818)
07-27 10:29:30.671    2273-2285/com.sample.mpassbook.mpassbook_d I/art﹕ Background sticky concurrent mark sweep GC freed 6004(337KB) AllocSpace objects, 0(0B) LOS objects, 18% free, 1712KB/2MB, paused 7.003ms total 27.902ms
07-27 10:29:36.604    2273-2273/com.sample.mpassbook.mpassbook_d I/Choreographer﹕ Skipped 42 frames!  The application may be doing too much work on its main thread.
07-27 10:29:36.626    2273-2273/com.sample.mpassbook.mpassbook_d E/WindowManager﹕ android.view.WindowLeaked: Activity com.sample.mpassbook.mpassbook_d.MainActivity has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView{22ccd5ff V.E..... R......D 0,0-1026,348} that was originally added here
            at android.view.ViewRootImpl.<init>(ViewRootImpl.java:363)
            at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:261)
            at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:69)
            at android.app.Dialog.show(Dialog.java:298)
            at com.sample.mpassbook.mpassbook_d.Settingsfragment$getlist.onPreExecute(Settingsfragment.java:88)
            at android.os.AsyncTask.executeOnExecutor(AsyncTask.java:587)
            at android.os.AsyncTask.execute(AsyncTask.java:535)
            at com.sample.mpassbook.mpassbook_d.Settingsfragment.onActivityCreated(Settingsfragment.java:76)
            at android.support.v4.app.Fragment.performActivityCreated(Fragment.java:1797)
            at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:979)
            at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1138)
            at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:740)
            at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1501)
            at android.support.v4.app.FragmentActivity.onStart(FragmentActivity.java:551)
            at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1220)
            at android.app.Activity.performStart(Activity.java:5953)
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2261)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2360)
            at android.app.ActivityThread.access$800(ActivityThread.java:144)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1278)
            at android.os.Handler.dispatchMessage(Handler.java:102)
            at android.os.Looper.loop(Looper.java:135)
            at android.app.ActivityThread.main(ActivityThread.java:5221)
            at java.lang.reflect.Method.invoke(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:372)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)

1 个答案:

答案 0 :(得分:0)

首先,您不应该在后台线程上执行任何UI操作。此外,您在xml文件中进行了错误的ListView声明。改为以下,

<ListView
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:id="@+id/list_item"/>

然后更改您的Fragment代码,如下所示

public class Settingsfragment extends Fragment {
    ListView list;
    ArrayList<HashMap<String, String>> oslist;
    private ProgressDialog pDialog;
    private static String url="https://fierce-tundra-4082.herokuapp.com/transactions/?msisdn=456&account=123&from_date=2015-07-10&format=json";
    public static final String TAG_content = "content";
    public static final String TAG_bankid = "bank_id";
    public static final String TAG_status = "details";
    public static final String TAG_Date = "date";
    public static final String TAG_cval = "amount";
    //    public static final String TAG_dval = "debit_val";
    public static final String TAG_bal = "balance";
    JSONArray content = null;

    public Settingsfragment() {
        // Required empty public constructor
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.settings, container, false);

 list = (ListView) rootView .findViewById(R.id.list_item);
        // Inflate the layout for this fragment
        return rootView;
    }

    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
    }

    @Override
    public void onDetach() {
        super.onDetach();
    }
    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onActivityCreated(savedInstanceState);

        oslist = new ArrayList<HashMap<String, String>>();
        new getlist().execute();
    }
     private class getlist extends AsyncTask<String, String, JSONObject> {
                Httpmanager jParser = new Httpmanager();
                private JSONObject json;

                @Override
                protected void onPreExecute() {
                    super.onPreExecute();
                    pDialog = new ProgressDialog(getActivity());
                    pDialog.setMessage("Please wait...");
                    pDialog.setCancelable(false);
                    pDialog.show();
                }
                @Override
                protected JSONObject doInBackground(String... args) {

                    // Getting JSON from URL
                    String json = jParser.makeServiceCall(url, Httpmanager.get);
                   oslist = new ArrayList<HashMap<String, String>>();
                    try {
                        JSONObject jsonObject = new JSONObject(json);
                        content = jsonObject.getJSONArray(TAG_content);


                        for (int i = 0; i < content.length(); i++) {
                            JSONObject c = content.getJSONObject(i);

                            String bank_id = c.getString(TAG_bankid);
                            String details = c.getString(TAG_status);
                            String date = c.getString(TAG_Date);
                            String amount = c.getString(TAG_cval);
                            String balance = c.getString(TAG_bal);


                            HashMap<String, String> contents = new HashMap<String, String>();

                            contents.put(TAG_bankid, "TRANSACTION ID : " + bank_id);
                            contents.put(TAG_status, "" + details);
                            contents.put(TAG_Date, "" + date);
                            contents.put(TAG_cval, "" + amount);
                            oslist.add(contents);

                        }
                    } catch (JSONException e) {
                        e.printStackTrace();
                    }



                            return null;
                        }
                        @Override
                        protected void onPostExecute (JSONObject json){
                            pDialog.dismiss();


                            ListAdapter adapter = new SimpleAdapter(getActivity(), oslist, R.layout.item, new String[]{TAG_bankid, TAG_status, TAG_Date, TAG_cval},
                                    new int[]{R.id.bankid, R.id.status, R.id.date, R.id.cval});
                            list.setAdapter(adapter);

                        }
                    }