android - 尝试从 Fragment 解析 Listview 中的 JSON 文件

标签 android mysql json fragment

刚刚在这里和其他地方找到了很多在 Android 上使用 PHP 进行 JSON 解析的示例,并尝试在我的项目中使用。在Activity中是可以的,但是换成Fragment就不行了。我认为我犯了一个愚蠢的错误。

fragment 代码:

package com.example.waitersoriginal;

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

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

import android.app.ListFragment;
import android.app.ProgressDialog;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.SimpleAdapter;

public class ListaFragment extends ListFragment {

private ProgressDialog pDialog;

 private static final String URL_SELECT ="http://localhost/waiters/select_bebidas.php";   

//JSONTAGS
private static final String TAG_NOME = "NOME";
private static final String TAG_BEBIDAS = "bebidas";
private static final String TAG_DESCR = "DESCR";

private JSONArray mProdutos = null;
private ArrayList<HashMap<String, String>> mProdutosList;


public ListaFragment(){}

@Override public View onCreateView(LayoutInflater inflater, ViewGroup container,  Bundle savedInstanceState) 
{ 
  return inflater.inflate(R.layout.lista_fragment, container, false); 
}

@Override
public void onResume() {
    // TODO Auto-generated method stub
    super.onResume();
    //loading the comments via AsyncTask
    new LoadEvents().execute();

  }
  public void updateJSONdata() {

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


    JSONParser jParser = new JSONParser();

    JSONObject json = jParser.getJSONFromUrl(URL_SELECT);

    try {


        mProdutos = json.getJSONArray(TAG_BEBIDAS);


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

            String nome = c.getString(TAG_NOME);
            String descr = c.getString(TAG_DESCR);

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

            map.put(TAG_NOME, nome);
            map.put(TAG_DESCR, descr);

            mProdutosList.add(map);

        }

    } catch (JSONException e) {
        e.printStackTrace();
    }
}
private void updateList() {


ListAdapter adapter = new SimpleAdapter(getActivity(), mProdutosList,
        R.layout.list_item, 
        new String[] { TAG_NOME, TAG_DESCR}, 
        new int[] { R.id.pid, R.id.name});

            setListAdapter(adapter);

            ListView lv = getListView();    
            lv.setOnItemClickListener(new OnItemClickListener() {

                @Override
                public void onItemClick(AdapterView<?> parent, View view,
                        int position, long id) {
                    }            
                });
}

public class LoadEvents extends AsyncTask<Void, Void, Boolean> {

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        pDialog = new ProgressDialog(getActivity());
        pDialog.setMessage("Loading Events...");
        pDialog.setIndeterminate(false);
        pDialog.setCancelable(true);
        pDialog.show();
    }
    @Override
    protected Boolean doInBackground(Void... arg0) {

        updateJSONdata();
        return null;
    }

    @Override
    protected void onPostExecute(Boolean result) {
        super.onPostExecute(result);
        pDialog.dismiss();

        updateList();
        }
      }
   }

Logcat 错误:

    10-22 22:41:40.814: E/AndroidRuntime(2513): FATAL EXCEPTION: main
    10-22 22:41:40.814: E/AndroidRuntime(2513): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.waitersoriginal/com.example.waitersoriginal.BebidaActivity}: android.view.InflateException: Binary XML file line #15: Error inflating class fragment
    10-22 22:41:40.814: E/AndroidRuntime(2513):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2211)
    10-22 22:41:40.814: E/AndroidRuntime(2513):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2261)
    10-22 22:41:40.814: E/AndroidRuntime(2513):     at android.app.ActivityThread.access$600(ActivityThread.java:141)
    10-22 22:41:40.814: E/AndroidRuntime(2513):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1256)
    10-22 22:41:40.814: E/AndroidRuntime(2513):     at android.os.Handler.dispatchMessage(Handler.java:99)
    10-22 22:41:40.814: E/AndroidRuntime(2513):     at android.os.Looper.loop(Looper.java:137)
    10-22 22:41:40.814: E/AndroidRuntime(2513):     at android.app.ActivityThread.main(ActivityThread.java:5103)
    10-22 22:41:40.814: E/AndroidRuntime(2513):     at java.lang.reflect.Method.invokeNative(Native Method)
    10-22 22:41:40.814: E/AndroidRuntime(2513):     at java.lang.reflect.Method.invoke(Method.java:525)
    10-22 22:41:40.814: E/AndroidRuntime(2513):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
    10-22 22:41:40.814: E/AndroidRuntime(2513):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
    10-22 22:41:40.814: E/AndroidRuntime(2513):     at dalvik.system.NativeStart.main(Native Method)
    10-22 22:41:40.814: E/AndroidRuntime(2513): Caused by: android.view.InflateException: Binary XML file line #15: Error inflating class fragment
    10-22 22:41:40.814: E/AndroidRuntime(2513):     at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:713)
    10-22 22:41:40.814: E/AndroidRuntime(2513):     at android.view.LayoutInflater.rInflate(LayoutInflater.java:755)
    10-22 22:41:40.814: E/AndroidRuntime(2513):     at android.view.LayoutInflater.inflate(LayoutInflater.java:492)
    10-22 22:41:40.814: E/AndroidRuntime(2513):     at android.view.LayoutInflater.inflate(LayoutInflater.java:397)
    10-22 22:41:40.814: E/AndroidRuntime(2513):     at android.view.LayoutInflater.inflate(LayoutInflater.java:353)
    10-22 22:41:40.814: E/AndroidRuntime(2513):     at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:267)
    10-22 22:41:40.814: E/AndroidRuntime(2513):     at android.app.Activity.setContentView(Activity.java:1895)
    10-22 22:41:40.814: E/AndroidRuntime(2513):     at com.example.waitersoriginal.BebidaActivity.onCreate(BebidaActivity.java:19)
    10-22 22:41:40.814: E/AndroidRuntime(2513):     at android.app.Activity.performCreate(Activity.java:5133)
    10-22 22:41:40.814: E/AndroidRuntime(2513):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
    10-22 22:41:40.814: E/AndroidRuntime(2513):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2175)
    10-22 22:41:40.814: E/AndroidRuntime(2513):     ... 11 more
    10-22 22:41:40.814: E/AndroidRuntime(2513): Caused by: java.lang.RuntimeException: Content has view with id attribute 'android.R.id.list' that is not a ListView class
    10-22 22:41:40.814: E/AndroidRuntime(2513):     at android.app.ListFragment.ensureList(ListFragment.java:402)
    10-22 22:41:40.814: E/AndroidRuntime(2513):     at android.app.ListFragment.onViewCreated(ListFragment.java:203)
    10-22 22:41:40.814: E/AndroidRuntime(2513):     at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:866)
    10-22 22:41:40.814: E/AndroidRuntime(2513):     at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1035)
    10-22 22:41:40.814: E/AndroidRuntime(2513):     at android.app.FragmentManagerImpl.addFragment(FragmentManager.java:1137)
    10-22 22:41:40.814: E/AndroidRuntime(2513):     at android.app.Activity.onCreateView(Activity.java:4746)
    10-22 22:41:40.814: E/AndroidRuntime(2513):     at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:689)
    10-22 22:41:40.814: E/AndroidRuntime(2513):     ... 21 more

有什么想法吗?

谢谢大家。

编辑:

lista_fragment.xml

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical" >

        <ListView
            android:id="@+id/listView1"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" >
        </ListView>

    </LinearLayout>

编辑2:

Logcat 错误:

10-22 23:46:11.842: W/System.err(2729): org.apache.http.conn.HttpHostConnectException: Connection to http://localhost refused
10-22 23:46:12.062: W/System.err(2729):     at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:183)
10-22 23:46:12.192: W/System.err(2729):     at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164)
10-22 23:46:12.212: W/System.err(2729):     at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119)
10-22 23:46:12.262: W/System.err(2729):     at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:360)
10-22 23:46:12.292: W/System.err(2729):     at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555)
10-22 23:46:12.342: W/System.err(2729):     at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487)
10-22 23:46:12.352: W/System.err(2729):     at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465)
10-22 23:46:12.362: W/System.err(2729):     at com.example.waitersoriginal.JSONParser.getJSONFromUrl(JSONParser.java:30)
10-22 23:46:12.362: W/System.err(2729):     at com.example.waitersoriginal.ListaFragment.updateJSONdata(ListaFragment.java:60)
10-22 23:46:12.392: W/System.err(2729):     at com.example.waitersoriginal.ListaFragment$LoadEvents.doInBackground(ListaFragment.java:122)
10-22 23:46:12.392: W/System.err(2729):     at com.example.waitersoriginal.ListaFragment$LoadEvents.doInBackground(ListaFragment.java:1)
10-22 23:46:12.412: W/System.err(2729):     at android.os.AsyncTask$2.call(AsyncTask.java:287)
10-22 23:46:12.422: W/System.err(2729):     at java.util.concurrent.FutureTask.run(FutureTask.java:234)
10-22 23:46:12.442: W/System.err(2729):     at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
10-22 23:46:12.462: W/System.err(2729):     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080)
10-22 23:46:12.462: W/System.err(2729):     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573)
10-22 23:46:12.472: W/System.err(2729):     at java.lang.Thread.run(Thread.java:841)
10-22 23:46:12.492: W/System.err(2729): Caused by: java.net.ConnectException: failed to connect to /127.0.0.1 (port 80): connect failed: ECONNREFUSED (Connection refused)
10-22 23:46:12.512: W/System.err(2729):     at libcore.io.IoBridge.connect(IoBridge.java:114)
10-22 23:46:12.512: W/System.err(2729):     at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:192)
10-22 23:46:12.512: W/System.err(2729):     at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:459)
10-22 23:46:12.552: W/System.err(2729):     at java.net.Socket.connect(Socket.java:842)
10-22 23:46:12.562: W/System.err(2729):     at org.apache.http.conn.scheme.PlainSocketFactory.connectSocket(PlainSocketFactory.java:119)
10-22 23:46:12.562: W/System.err(2729):     at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:144)
10-22 23:46:12.562: W/System.err(2729):     ... 16 more
10-22 23:46:12.562: W/System.err(2729): Caused by: libcore.io.ErrnoException: connect failed: ECONNREFUSED (Connection refused)
10-22 23:46:12.592: W/System.err(2729):     at libcore.io.Posix.connect(Native Method)
10-22 23:46:12.652: W/System.err(2729):     at libcore.io.BlockGuardOs.connect(BlockGuardOs.java:85)
10-22 23:46:12.652: W/System.err(2729):     at libcore.io.IoBridge.connectErrno(IoBridge.java:127)
10-22 23:46:12.662: W/System.err(2729):     at libcore.io.IoBridge.connect(IoBridge.java:112)
10-22 23:46:12.662: W/System.err(2729):     ... 21 more
10-22 23:46:12.662: E/Buffer Error(2729): Error converting result java.lang.NullPointerException: lock == null
10-22 23:46:12.702: E/JSON Parser(2729): Error parsing data org.json.JSONException: End of input at character 0 of 
10-22 23:46:12.702: W/dalvikvm(2729): threadid=11: thread exiting with uncaught exception (group=0xb2f30648)
10-22 23:46:12.712: E/AndroidRuntime(2729): FATAL EXCEPTION: AsyncTask #1
10-22 23:46:12.712: E/AndroidRuntime(2729): java.lang.RuntimeException: An error occured while executing doInBackground()
10-22 23:46:12.712: E/AndroidRuntime(2729):     at android.os.AsyncTask$3.done(AsyncTask.java:299)
10-22 23:46:12.712: E/AndroidRuntime(2729):     at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:352)
10-22 23:46:12.712: E/AndroidRuntime(2729):     at java.util.concurrent.FutureTask.setException(FutureTask.java:219)
10-22 23:46:12.712: E/AndroidRuntime(2729):     at java.util.concurrent.FutureTask.run(FutureTask.java:239)
10-22 23:46:12.712: E/AndroidRuntime(2729):     at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
10-22 23:46:12.712: E/AndroidRuntime(2729):     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080)
10-22 23:46:12.712: E/AndroidRuntime(2729):     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573)
10-22 23:46:12.712: E/AndroidRuntime(2729):     at java.lang.Thread.run(Thread.java:841)
10-22 23:46:12.712: E/AndroidRuntime(2729): Caused by: java.lang.NullPointerException
10-22 23:46:12.712: E/AndroidRuntime(2729):     at com.example.waitersoriginal.ListaFragment.updateJSONdata(ListaFragment.java:65)
10-22 23:46:12.712: E/AndroidRuntime(2729):     at com.example.waitersoriginal.ListaFragment$LoadEvents.doInBackground(ListaFragment.java:122)
10-22 23:46:12.712: E/AndroidRuntime(2729):     at com.example.waitersoriginal.ListaFragment$LoadEvents.doInBackground(ListaFragment.java:1)
10-22 23:46:12.712: E/AndroidRuntime(2729):     at android.os.AsyncTask$2.call(AsyncTask.java:287)
10-22 23:46:12.712: E/AndroidRuntime(2729):     at java.util.concurrent.FutureTask.run(FutureTask.java:234)
10-22 23:46:12.712: E/AndroidRuntime(2729):     ... 4 more
10-22 23:46:13.412: W/EGL_emulation(2729): eglSurfaceAttrib not implemented
10-22 23:46:14.142: E/WindowManager(2729): Activity com.example.waitersoriginal.BebidaActivity has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView{b320ffd0 V.E..... R......D 0,0-576,96} that was originally added here
10-22 23:46:14.142: E/WindowManager(2729): android.view.WindowLeaked: Activity com.example.waitersoriginal.BebidaActivity has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView{b320ffd0 V.E..... R......D 0,0-576,96} that was originally added here
10-22 23:46:14.142: E/WindowManager(2729):  at android.view.ViewRootImpl.<init>(ViewRootImpl.java:345)
10-22 23:46:14.142: E/WindowManager(2729):  at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:239)
10-22 23:46:14.142: E/WindowManager(2729):  at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:69)
10-22 23:46:14.142: E/WindowManager(2729):  at android.app.Dialog.show(Dialog.java:281)
10-22 23:46:14.142: E/WindowManager(2729):  at com.example.waitersoriginal.ListaFragment$LoadEvents.onPreExecute(ListaFragment.java:117)
10-22 23:46:14.142: E/WindowManager(2729):  at android.os.AsyncTask.executeOnExecutor(AsyncTask.java:586)
10-22 23:46:14.142: E/WindowManager(2729):  at android.os.AsyncTask.execute(AsyncTask.java:534)
10-22 23:46:14.142: E/WindowManager(2729):  at com.example.waitersoriginal.ListaFragment.onResume(ListaFragment.java:50)
10-22 23:46:14.142: E/WindowManager(2729):  at android.app.Fragment.performResume(Fragment.java:1738)
10-22 23:46:14.142: E/WindowManager(2729):  at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:919)
10-22 23:46:14.142: E/WindowManager(2729):  at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1057)
10-22 23:46:14.142: E/WindowManager(2729):  at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1039)
10-22 23:46:14.142: E/WindowManager(2729):  at android.app.FragmentManagerImpl.dispatchResume(FragmentManager.java:1850)
10-22 23:46:14.142: E/WindowManager(2729):  at android.app.Activity.performResume(Activity.java:5221)
10-22 23:46:14.142: E/WindowManager(2729):  at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2780)
10-22 23:46:14.142: E/WindowManager(2729):  at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:2819)
10-22 23:46:14.142: E/WindowManager(2729):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2266)
10-22 23:46:14.142: E/WindowManager(2729):  at android.app.ActivityThread.access$600(ActivityThread.java:141)
10-22 23:46:14.142: E/WindowManager(2729):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1256)
10-22 23:46:14.142: E/WindowManager(2729):  at android.os.Handler.dispatchMessage(Handler.java:99)
10-22 23:46:14.142: E/WindowManager(2729):  at android.os.Looper.loop(Looper.java:137)
10-22 23:46:14.142: E/WindowManager(2729):  at android.app.ActivityThread.main(ActivityThread.java:5103)
10-22 23:46:14.142: E/WindowManager(2729):  at java.lang.reflect.Method.invokeNative(Native Method)
10-22 23:46:14.142: E/WindowManager(2729):  at java.lang.reflect.Method.invoke(Method.java:525)
10-22 23:46:14.142: E/WindowManager(2729):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
10-22 23:46:14.142: E/WindowManager(2729):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
10-22 23:46:14.142: E/WindowManager(2729):  at dalvik.system.NativeStart.main(Native Method)

最佳答案

你已经提到你的类是ListFragment,这意味着你的xml应该只有一个listview,而你里面有一个LinearLayout和一个ListView。你的 xml 应该是这样的......

<ListView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/listview"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" /> 

如果您不想更改 xml,请将类更改为 Fragment

public class ListaFragment extends Fragment 

手动查找 ListView

    ListView listView;
    @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                Bundle savedInstanceState){
            ctx=getActivity();
            LayoutInflater m_inflater = LayoutInflater.from(getActivity());
            rootView = m_inflater.inflate(R.layout.lista_fragment, null);
listView=rootView.findViewById(R.id.listView1);
            return rootView;
    }

然后从那里拿走它。

关于android - 尝试从 Fragment 解析 Listview 中的 JSON 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26520590/

相关文章:

javascript - Linnworks 的 AJAX 请求

java - Firebase CurrentUser Null,如何保持用户登录所有 Activity ?

java - Realm 中的@LinkingObjects 注解是如何工作的

android - 如何从 GCM 获取规范 ID

python - Django 更新该行(如果存在)

javascript - 如何从 Express.js 发布到 api

java - Android 中 Web API 的异常处理

c++ - MySQL C++ 连接器 - 链接错误

java - MySQL语法错误异常 : Unknown database - JDBC - Java EE

java - 缺少 JSON 数据