2016-08-11 89 views
0

目前我想填充我的自定義列表視圖用JSON自定義列表視圖適配器尺寸空

它正常工作與虛擬數據,和我的JSON請求是罰款。

所有這些代碼都在onCreate視圖中,我知道我們應該使用異步任務或某種排序來產生一個新的線程來提取數據,但是我只想把它放在這裏用於測試目的,所以我知道我可以拉數據第一。

OkHttpClient client = new OkHttpClient.Builder().addInterceptor(new BasicAuthInterceptor()).addNetworkInterceptor(new StethoInterceptor()).build(); 

    String url = "http://10.0.2.2:3000/response"; 

    Request request = new Request.Builder().url(url) 
      .build(); 


    client.newCall(request).enqueue(new Callback() { 
     @Override 
     public void onFailure(Call call, IOException e) { 
      Log.i(TAG, "call api error"); 
      Log.e("Volley", e.toString()); 
     } 

     @Override 
     public void onResponse(Call call, okhttp3.Response response) { 

      try { 
       if (!response.isSuccessful()) 
        throw new IOException("Unexpected code " + response); 
       final String body = response.body().string(); 

       JSONObject Jobject = new JSONObject(body); 


       JSONArray Jarray = Jobject.getJSONArray("inboxMsgList"); 

       Log.e("Array", String.valueOf(Jarray.length())); 
//Initializing my ArrayLis here I already defined it where I have my other variables defined. 
        arrMessageData = new ArrayList<>(); 

       JSONObject object = Jarray.getJSONObject(0); 

       MessageData msg3 = new MessageData(); 
       msg3.setName((String) object.get("fromUser")); 
       msg3.setMessage((String) object.get("message")); 
       msg3.setImage(R.drawable.msgone); 
       msg3.setRead(true); 
       msg3.setSubject((String) object.get("subject")); 

       arrMessageData.add(msg3); 

       Log.e("DetailObject", msg3.getName()); 


       // Log.e("FullJsonReply", body.toString()); 
      } catch (Exception e){ 
       Log.e("Volley2", e.toString()); 
      } 

     } 

    }); 


    adapter = new CustomAdapterReferral(getActivity().getBaseContext(), arrMessageData); 
    usersListView.setAdapter(adapter); 

我得到的錯誤是:

顯示java.lang.NullPointerException:嘗試在玉米上的空對象引用 調用虛擬方法 'INT java.util.ArrayList.size()' .adilpatel.vitalengine.ListAdapters.CustomAdapterReferral.getCount(CustomAdapterReferral.java:40)

第40行是我getCount將在我的適配器

public int getCount() { 
    return arrMessageData.size(); 
} 

我把它返回的大小

enter image description here

貌似大小爲1,但它仍然給空指針異常一個破發點的權利。是否因爲適配器爲空?什麼是適配器?

編輯:這是我的CustomAdapterReferral:

public class CustomAdapterReferral extends BaseAdapter { 

    ArrayList<MessageData> arrMessageData; 
    Context context; 
    private static LayoutInflater inflater = null; 

    public CustomAdapterReferral(Context mainActivity, ArrayList<MessageData> arrMessageData){ 


     this.arrMessageData = arrMessageData; 

     context = mainActivity; 


     inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    } 



    public int getCount() { 
     return arrMessageData.size(); 
    } 

    @Override 
    public Object getItem(int position) { 
     return position; 
    } 

    @Override 
    public long getItemId(int position) { 
     return position; 
    } 

    public class ViewHolder { 
     TextView referralName; 
     ImageView referralImage; 
     TextView referralMessage; 


    } 
    @Override 
    public View getView(final int position, View convertView, ViewGroup parent) { 
     ViewHolder holder=new ViewHolder(); 

     View rootView = inflater.inflate(R.layout.list_item_referral, null); 


     holder.referralName = (TextView) rootView.findViewById(R.id.referralName); 
     holder.referralImage =(ImageView) rootView.findViewById(R.id.referralImage); 
     holder.referralMessage= (TextView) rootView.findViewById(R.id.referralMessage); 

     holder.referralMessage.setText("" + arrMessageData.get(position).getMessage()); 
     holder.referralName.setText("" + arrMessageData.get(position).getName()); 
     holder.referralImage.setImageResource(arrMessageData.get(position).getImage()); 

     return rootView; 
    } 
} 
+0

你能編輯你的問題來顯示「CustomAdapterReferral」類嗎? – Bill

+0

@quidproquo更新 – Adilp

回答

1

使用處理器

private Handler handler = new Handler() { 
     @Override 
     public void handleMessage(Message msg) { 
      switch (msg.what) { 
       case 1: 
        adapter = new CustomAdapterReferral(getActivity().getBaseContext(), arrMessageData); 
        usersListView.setAdapter(adapter); 
        break; 
       default: 
        Log.d("TAG", msg.what + " ? "); 
        break; 
      } 
     } 
    }; 

和OkHttpClient使用

@Override 
     public void onResponse(Call call, okhttp3.Response response) { 
    //YOUR CODE 
//END 
handler.sendEmptyMessage(1); 

} 
+0

作品!但是,你能解釋一下爲什麼它沒有按照我的方式工作。它似乎甚至應該通過調試器。 – Adilp

+0

由於使用@ARH提出的方法,請確保在獲取請求響應後執行代碼。 –

+0

你的代碼沒有工作,因爲這個var「arrMessageData」在你想使用它的時候還沒有準備好(導致異步線程),所以這個方法等待它準備好然後使用它。 – Quickcoding

1

您通過Callback接口enqueue()。您的arrMessageData已在回調的onResponse()中初始化 - 但在創建適配器後調用此回調方法,因此傳遞給構造函數的ArrayList爲null:這會導致NullPointerException。

相關問題