2014-02-21 31 views
0

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

这是我的代码:

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) 

此代码XML进行list_prod_layout.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> 

,请给我一些答案。谢谢。

+0

什么是ProdukListFragment2.java 149行代码的ligne?只是一个建议,你有xml文件中的listView id等于'android:id =“@ android:id/list”'? – Houcine

+0

第149行:listView.setAdapter(adapter); –

+0

你的listView是空的,所以PLZ添加包含你的ListView的XML布局文件的代码,我认为问题是你没有检索到具有正确ID的listView – Houcine

回答

0

错误的原因是“produk”为空时,将它传递给适配器的构造:

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

调用它试图返回其getCount将()方法时,该适配器失败,则与一个NullPointerException 'produk'的大小。 'produk'为null的原因在于你的ProdukLoader类。你声明返回变量'produk',但从不实例化它。您的声明应该是:

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

然后,您的加载器将始终返回一个非null的List对象,即使该列表恰好为空。另一方面,loadInBackground()中的JSON请求没有返回任何数据(如果是这样的话,那么当您执行“produk.add(map);”时,您会得到一个NullPointerException,但这是真是一个单独的问题。