设置片段
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)
答案 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);
}
}