2014-02-21 1 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); 
    } 
} 
} 

결과 : 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> 

에 대한

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은 나에게 어떤 대답을 적어주세요

내 코드입니다. 감사. 이 어댑터 생성자에 전달할 때

+0

ProdukListFragment2.java 줄 149의 코드 줄은 무엇입니까? 그리고 단지 제안, 당신은 xml 파일에있는 listView id는'android : id = "@ android : id/list"'?와 동일합니까? – Houcine

+0

라인 149 : listView.setAdapter (adapter); –

+0

귀하의 listView null입니다, 그래서 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>>(); 

로더는 비어있는 List 오브젝트가 항상 비어 있어도 항상 null이 아닌 List 오브젝트를 리턴합니다.

loadInBackground()의 JSON 요청은 데이터를 반환하지 않습니다 ("produk.add (map);"할 때 대신 NullPointerException이 발생합니다). 정말로 별개의 문제.

관련 문제