2016-07-29 74 views
0

我試圖從URL接收JSON。在獲得對象後,我將解析它並將其加載到我的應用程序的列表視圖中。我使用Adapter來創建列表視圖並在mainActivity上運行我的jsonTask,然後將結果傳遞給適配器。它總是拋出空指針異常。有沒有更好的方法來做到這一點?我是新來的android和json任務運行async如何使我的用戶界面加載等待jsonTask的結果。這是我的代碼;Android異步JsonTask錯誤

主要活動;

public class TvActivity extends Activity { 
    ListView lv; 
    ArrayList<TV> tvList; 

protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     context = this; 
     new JSONTask().execute(); 
     lv = (ListView) findViewById(R.id.listView); 
     lv.setAdapter(new Adapter(this, tvList)); 

    } 
} 

public class JSONTask extends AsyncTask<String, String, JSONArray> { 
     ProgressDialog pDialog; 

     @Override 
     protected JSONArray doInBackground(String... params) { 
      return Utility.getJSONArray(Constants.TV_JSON_URL); 
     } 

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

      for (int i = 0; i < result.length(); i++) { 
       try { 
        JSONObject row = result.getJSONObject(i); 
        String title = row.getString(Constants.TV_TITLE); 
        String code = row.getString(Constants.TV_CODE); 
        String image_url = row.getString(Constants.TV_IMAGE_URL); 
        tvList.add(new TV(title, image_url, code)); 

       } catch (JSONException e) { 
        e.printStackTrace(); 

       } 

      } 
     } 
    } 

My Adapter;

public class TvAdapter extends BaseAdapter { 

    String[] result; 
    Context context; 
    ArrayList<TV> tvArrayList; 
    int[] imageId; 
    private static LayoutInflater inflater = null; 

    public TvAdapter(TvActivity mainActivity, ArrayList<TV> tvList) { 
     // TODO Auto-generated constructor stub 
     //result = prgmNameList; 
     context = mainActivity; 
     tvArrayList = tvList; 
     //imageId = prgmImages; 
     inflater = (LayoutInflater) context. 
       getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    } 

    @Override 
    public int getCount() { 
     // TODO Auto-generated method stub 
     return tvArrayList.size(); 
    } 

    @Override 
    public Object getItem(int position) { 
     // TODO Auto-generated method stub 
     return tvArrayList.get(position); 
    } 

    @Override 
    public long getItemId(int position) { 
     // TODO Auto-generated method stub 
     return position; 
    } 

    public class Holder { 
     TextView tv; 
     ImageView img; 
    } 

    @Override 
    public View getView(final int position, View convertView, ViewGroup parent) { 
     // TODO Auto-generated method stub 
     TV tvItem = (TV) getItem(position); 

     Holder holder = new Holder(); 
     View rowView; 
     rowView = inflater.inflate(R.layout.tv_list, null); 
     holder.tv = (TextView) rowView.findViewById(R.id.textView1); 
     holder.img = (ImageView) rowView.findViewById(R.id.imageView1); 
     holder.tv.setText(tvItem.getTitle()); 
     // holder.img.setImageResource(imageId[position]); 
     rowView.setOnClickListener(new OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       // TODO Auto-generated method stub 
       Toast.makeText(context, "You Clicked " + tvItem[position], Toast.LENGTH_LONG).show(); 
      } 
     }); 
     return rowView; 
    } 

} 
+1

這是很難知道你的問題,而這是解決的堆棧跟蹤 –

+0

。感謝您的每一個評論和答案。 –

回答

0

您可以嘗試像下面:

new JSONTask().execute(); 
lv = (ListView) findViewById(R.id.listView); 
tvList = new ArrayList<TV>(); 
lv.setAdapter(new Adapter(this, tvList)); 

然後

@Override 
protected void onPreExecute() { 
    super.onPreExecute(); 
    pDialog = new ProgressDialog(context); 
    pDialog.setCancelable(true); 
    pDialog.setMessage("Loading..."); 
    pDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER); 
    pDialog.setProgress(0); 
    pDialog.show(); 
} 

下方的onPostExecute方法添加adapter.notifyDataSetChanged();

+0

它的工作表示感謝。 –

+0

歡迎。快樂編碼:) –

1

AsyncTask沒有問題。用在這裏lv.setAdapter(new Adapter(this, tvList))

tvList = new ArrayList<>(); 
lv.setAdapter(new Adapter(this, tvList)); 
+0

我初始化了值,但我需要填充異步任務的結果。現在它會因進度而拋出錯誤。對話框 –

+0

@FatihAktepe呃...'ProgressDialog pDialog;'...它是空的! –

+0

您再次沒有初始化進度對話框。 :) –

0

該應用程序崩潰的tvList爲空之前,初始化這個ArrayList<TV> tvList。在將它傳遞給Adapter構造函數之前對其進行初始化。 也可以通過使用可在適配器上調用的notifyDataSetChanged,在異步任務返回值後通知適配器自行刷新。 例如。 adapter.notifyDataSetChanged()