【问题标题】:android, asyntaskloader, simpleadapterandroid, asyntaskloader, simpleadapter
【发布时间】:2014-03-23 02:53:20
【问题描述】:

我对 AsynctaskLoader 很困惑。我使用 Asynctaskloader 使用 PHP 从服务器加载 JSON 数据,但仍然收到错误。

这是我的代码:

public class ProdukListFragment2 extends ListFragment implements LoaderCallbacks<ArrayList<HashMap<String, String>>>{

private static final String proUrl = "http://bsamon.com/salesmonitoring/list_produk2.php";

private EditText searchprod;

private static final int LOADER_LOAD_DATA = 0;

// Creating JSON Parser object
static JSONHelper jParser = new JSONHelper();

//static ArrayList<HashMap<String, String>> productsList;

// products JSONArray
static JSONArray products = null;

ListAdapter adapter;

private ListView listView;

// JSON Node names
private static final String TAG_SUCCESS = "success";
private static final String TAG_PRODUK = "tb_barang";
private static final String TAG_KODE_PRODUK = "kode_barang";
private static final String TAG_TIPE_PRODUK = "tipe_barang";

String kodepro;

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

@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onViewCreated(view, savedInstanceState);
    getListView();
    listView = (ListView) view.findViewById(android.R.id.list);
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    View view = inflater.inflate(R.layout.list_prod_layout, container, false);
    view.setBackgroundColor(Color.parseColor("#e16505"));
return view;
}
}

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

    getLoaderManager().initLoader(LOADER_LOAD_DATA, null, this);
}

@Override
public Loader<ArrayList<HashMap<String, String>>> onCreateLoader(int arg0, Bundle arg1) {
    // TODO Auto-generated method stub
    ProdukLoader loader = new ProdukLoader(getActivity());

    return loader;
}

@Override
public void onLoadFinished(Loader<ArrayList<HashMap<String, String>>> loader, ArrayList<HashMap<String, String>> produk) {
    // TODO Auto-generated method stub
    String[] from = new String[]
            {
                TAG_TIPE_PRODUK,
                TAG_KODE_PRODUK
            };

    int[] to = new int[]
            {
                R.id.listnamaprod,
                R.id.listkodeprod
            };

    adapter = new SimpleAdapter(getActivity(), produk, R.layout.list_prod, from, to);

    listView.setAdapter(adapter);
}

@Override
public void onLoaderReset(Loader<ArrayList<HashMap<String, String>>> loader) {
    // TODO Auto-generated method stub
    listView.setAdapter(null);
}

// ---------- Loader --------------
public static class ProdukLoader extends AsyncTaskLoader<ArrayList<HashMap<String, String>>> {

    ArrayList<HashMap<String, String>> produk;

    public ProdukLoader(Context context) {
        super(context);
        // TODO Auto-generated constructor stub
    }

    @Override
    public ArrayList<HashMap<String, String>> loadInBackground() {
        // TODO Auto-generated method stub
        List<NameValuePair> params = new ArrayList<NameValuePair>();

        JSONObject json = jParser.makeHttpRequest(proUrl, "GET", params);

        try {
            // Checking for SUCCESS TAG
            int success = json.getInt(TAG_SUCCESS);

            if (success == 1)
            {
                products = json.getJSONArray(TAG_PRODUK);

                // Storing each json item in variable
                for (int i = 0; i < products.length(); i++)
                {
                    JSONObject jObj = products.getJSONObject(i);

                    String kodePro = jObj.getString(TAG_KODE_PRODUK);
                    String tipePro = jObj.getString(TAG_TIPE_PRODUK);

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

                    // adding each child node to HashMap key => value
                    map.put(TAG_KODE_PRODUK, kodePro);
                    map.put(TAG_TIPE_PRODUK, tipePro);

                    produk.add(map);
                }
            } else
            {
                //trhtrh
            }
        } catch (Exception e) {
            // TODO: handle exception
            e.printStackTrace();
        }

        return produk;
    }

    @Override
    protected void onStopLoading() {
        // TODO Auto-generated method stub
        cancelLoad();
    }

    @Override
    protected void onReset() {
        // TODO Auto-generated method stub
        super.onReset();
        produk = null;
        onStopLoading();
    }

    @Override
    public void onCanceled(ArrayList<HashMap<String, String>> data) {
        // TODO Auto-generated method stub
        super.onCanceled(data);
    }

    @Override
    protected void onStartLoading() {
        // TODO Auto-generated method stub
        super.onStartLoading();
        if (produk !=null)
        {
            deliverResult(produk);
        } else
        {
            forceLoad();
        }
    }

    @Override
    public void deliverResult(ArrayList<HashMap<String, String>> data) {
        // TODO Auto-generated method stub
        super.deliverResult(data);
    }
}
}

Logcat 的结果:

03-25 22:15:21.975: E/AndroidRuntime(21478): FATAL EXCEPTION: main
03-25 22:15:21.975: E/AndroidRuntime(21478): java.lang.NullPointerException
03-25 22:15:21.975: E/AndroidRuntime(21478):    at android.widget.SimpleAdapter.getCount(SimpleAdapter.java:93)
03-25 22:15:21.975: E/AndroidRuntime(21478):    at android.widget.ListView.setAdapter(ListView.java:466)
03-25 22:15:21.975: E/AndroidRuntime(21478):    at android.app.ListFragment.setListAdapter(ListFragment.java:240)
03-25 22:15:21.975: E/AndroidRuntime(21478):    at com.bimasakti.samon.ProdukListFragment2.onLoadFinished(ProdukListFragment2.java:149)
03-25 22:15:21.975: E/AndroidRuntime(21478):    at com.bimasakti.samon.ProdukListFragment2.onLoadFinished(ProdukListFragment2.java:1)
03-25 22:15:21.975: E/AndroidRuntime(21478):    at android.app.LoaderManagerImpl$LoaderInfo.callOnLoadFinished(LoaderManager.java:483)
03-25 22:15:21.975: E/AndroidRuntime(21478):    at android.app.LoaderManagerImpl$LoaderInfo.onLoadComplete(LoaderManager.java:451)
03-25 22:15:21.975: E/AndroidRuntime(21478):    at android.content.Loader.deliverResult(Loader.java:143)
03-25 22:15:21.975: E/AndroidRuntime(21478):    at com.bimasakti.samon.ProdukListFragment2$ProdukLoader.deliverResult(ProdukListFragment2.java:255)
03-25 22:15:21.975: E/AndroidRuntime(21478):    at com.bimasakti.samon.ProdukListFragment2$ProdukLoader.deliverResult(ProdukListFragment2.java:1)
03-25 22:15:21.975: E/AndroidRuntime(21478):    at android.content.AsyncTaskLoader.dispatchOnLoadComplete(AsyncTaskLoader.java:254)
03-25 22:15:21.975: E/AndroidRuntime(21478):    at android.content.AsyncTaskLoader$LoadTask.onPostExecute(AsyncTaskLoader.java:91)
03-25 22:15:21.975: E/AndroidRuntime(21478):    at android.os.AsyncTask.finish(AsyncTask.java:631)
03-25 22:15:21.975: E/AndroidRuntime(21478):    at android.os.AsyncTask.access$600(AsyncTask.java:177)
03-25 22:15:21.975: E/AndroidRuntime(21478):    at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:644)
03-25 22:15:21.975: E/AndroidRuntime(21478):    at android.os.Handler.dispatchMessage(Handler.java:99)
03-25 22:15:21.975: E/AndroidRuntime(21478):    at android.os.Looper.loop(Looper.java:153)
03-25 22:15:21.975: E/AndroidRuntime(21478):    at android.app.ActivityThread.main(ActivityThread.java:5293)
03-25 22:15:21.975: E/AndroidRuntime(21478):    at java.lang.reflect.Method.invokeNative(Native Method)
03-25 22:15:21.975: E/AndroidRuntime(21478):    at java.lang.reflect.Method.invoke(Method.java:511)
03-25 22:15:21.975: E/AndroidRuntime(21478):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:833)
03-25 22:15:21.975: E/AndroidRuntime(21478):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600)
03-25 22:15:21.975: E/AndroidRuntime(21478):    at dalvik.system.NativeStart.main(Native Method)

list_prod_layout.xml 的代码 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" >
<EditText
   android:id="@+id/edsearchprod"
   android:layout_width="match_parent"
   android:layout_height="45dp"
   android:inputType="textFilter|textAutoComplete"
   android:singleLine="true"
   android:hint="Cari Produk"
   android:ems="10" >

   <requestFocus />
</EditText>

<ListView android:id="@android:id/list"
         android:layout_width="match_parent"
         android:layout_height="match_parent"
         android:choiceMode="singleChoice"
         android:listSelector="@color/color_bluecompat"
         android:gravity="center" >
</ListView>

</LinearLayout>

请给我一些答案。谢谢。

【问题讨论】:

  • ProdukListFragment2.java 第 149 行中的代码是什么?只是一个建议,你的 xml 文件中的 listView id 是否等于android:id="@android:id/list" ??
  • 第 149 行:listView.setAdapter(adapter);
  • 你的 listView 是 null ,所以请添加包含你的 ListView 的 xml 布局文件的代码,我认为问题是你没有用正确的 id 检索 listView

标签: android json android-asynctask loader listadapter


【解决方案1】:

错误的原因是'produk'在传递给适配器构造函数时为空:

adapter = new SimpleAdapter(getActivity(), produk, R.layout.list_prod, from, to);

然后,当调用尝试返回“produk”大小的 getCount() 方法时,适配器会失败并出现 NullPointerException。 'produk' 为 null 的原因在于您的 ProdukLoader 类。您声明返回变量“produk”,但从不实例化它。你的声明应该是:

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

您的加载器将始终返回一个非空的 List 对象,即使该列表恰好为空。

顺便说一句,您在 loadInBackground() 中的 JSON 请求没有返回任何数据(如果是,那么当您执行“produk.add(map);”时,您将在那里得到 NullPointerException),但这确实是一个单独的问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多