2013-09-25 2 views
0

Я хочу заполнить gridview данными из ссылки JSON. Как я могу заполнить gridview после извлечения данных. Это в основном приложение для погоды.Разработанные данные JSON в виде сетки

Это мой JSON парсер класс:

public class JSONWeatherParser { 

public static WeatherForecast getForecastWeather(String data) throws JSONException { 

    WeatherForecast forecast = new WeatherForecast(); 

    // We create out JSONObject from the data 
    JSONObject jObj = new JSONObject(data); 

    JSONArray jArr = jObj.getJSONArray("list"); // Here we have the forecast for every day 

    // We traverse all the array and parse the data 
    for (int i=0; i < jArr.length(); i++) { 
     JSONObject jDayForecast = jArr.getJSONObject(i); 

     // Now we have the json object so we can extract the data 
     DayForecast df = new DayForecast(); 

     // We retrieve the timestamp (dt) 
     df.timestamp = jDayForecast.getLong("dt"); 

     // Temp is an object 
     JSONObject jTempObj = jDayForecast.getJSONObject("temp"); 

     df.forecastTemp.day = (float) jTempObj.getDouble("day"); 
     df.forecastTemp.min = (float) jTempObj.getDouble("min"); 
     df.forecastTemp.max = (float) jTempObj.getDouble("max"); 
     df.forecastTemp.night = (float) jTempObj.getDouble("night"); 
     df.forecastTemp.eve = (float) jTempObj.getDouble("eve"); 
     df.forecastTemp.morning = (float) jTempObj.getDouble("morn"); 

     // Pressure & Humidity 
     df.weather.currentCondition.setPressure((float) jDayForecast.getDouble("pressure")); 
     df.weather.currentCondition.setHumidity((float) jDayForecast.getDouble("humidity")); 

     // ...and now the weather 
     JSONArray jWeatherArr = jDayForecast.getJSONArray("weather"); 
     JSONObject jWeatherObj = jWeatherArr.getJSONObject(0); 
     df.weather.currentCondition.setWeatherId(getInt("id", jWeatherObj)); 
     df.weather.currentCondition.setDescr(getString("description", jWeatherObj)); 
     df.weather.currentCondition.setCondition(getString("main", jWeatherObj)); 
     df.weather.currentCondition.setIcon(getString("icon", jWeatherObj)); 

     forecast.addForecast(df); 
    } 



    return forecast; 
} 


private static JSONObject getObject(String tagName, JSONObject jObj) throws JSONException { 
    JSONObject subObj = jObj.getJSONObject(tagName); 
    return subObj; 
} 

private static String getString(String tagName, JSONObject jObj) throws JSONException { 
    return jObj.getString(tagName); 
} 

private static float getFloat(String tagName, JSONObject jObj) throws JSONException { 
    return (float) jObj.getDouble(tagName); 
} 

private static int getInt(String tagName, JSONObject jObj) throws JSONException { 
    return jObj.getInt(tagName); 
} 

}

GridViewAdapter Класс:

public class GridViewAdapter extends BaseAdapter { 
private Context mContext; 
private int numDays; 
private WeatherForecast forecast; 
private final static SimpleDateFormat sdf = new SimpleDateFormat("E, dd-MM"); 
private DayForecast dayForecast; 
private ImageView iconWeather; 

public GridViewAdapter(int numDays, WeatherForecast forecast) { 
    this.numDays = numDays; 
    this.forecast = forecast; 
} 

public int getCount() { 
    return numDays; 
} 

public Object getItem(int position) { 
    return null; 
} 

public long getItemId(int position) { 
    return 0; 
} 

// create a new ImageView for each item referenced by the Adapter 
public View getView(int position, View convertView, ViewGroup parent) { 
    //ImageView imageView; 
    //ImageView icon; 
    TextView temp; 
    TextView date; 


    if (convertView == null) { // if it's not recycled, initialize some attributes 


     //icon = new ImageView(mContext); 
     temp = new TextView(mContext); 
     date = new TextView(mContext); 

     LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

     convertView = inflater.inflate(R.layout.grid_icon, parent, false); 

    } 



    temp=(TextView)convertView.findViewById(R.id.text); 
    temp.setText((int) (dayForecast.forecastTemp.min - 275.15) + "-" + (int) (dayForecast.forecastTemp.max - 275.15)); 
    date=(TextView)convertView.findViewById(R.id.date); 
    date.setText(DateUtils.formatDateTime(mContext, System.currentTimeMillis(), DateUtils.FORMAT_SHOW_DATE | DateUtils.FORMAT_NUMERIC_DATE)); 

    return convertView; 
    //JSONIconWeatherTask task = new JSONIconWeatherTask(); 
    //task.execute(new String[]{dayForecast.weather.currentCondition.getIcon()}); 

    /*imageView.setImageResource(mThumbIds[position]);*/ 
    //return imageView; 
} 
public void setForecast(DayForecast dayForecast) { 

    this.dayForecast = dayForecast; 

} 

Мой AsyncTask:

private class JSONForecastWeatherTask extends AsyncTask<String, Void, WeatherForecast> { 

    @Override 
    protected WeatherForecast doInBackground(String... params) { 

     String data = ((new WeatherHttpClient()).getForecastWeatherData(params[0], params[1], params[2])); 
     WeatherForecast forecast = new WeatherForecast(); 
     try { 
      forecast = JSONWeatherParser.getForecastWeather(data); 
      System.out.println("Weather ["+forecast+"]"); 

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

} 

@Override 
    protected void onPostExecute(WeatherForecast forecastWeather) {   
     super.onPostExecute(forecastWeather); 
     GridView gridView; 
     gridView = (GridView) findViewById(R.id.gridview); 

     gridView.setAdapter(new GridViewImageAdapter(Integer.parseInt(forecastDaysNum), forecastWeather)); 
    } 

} ЛОГА

09-27 00: 03: 10,132: Е/AndroidRuntime (29848): неустранимые: Основной 09-27 00: 03: 10,132: Е/AndroidRuntime (29848): java.lang .NullPointerException 09-27 00: 03: 10.132: E/AndroidRuntime (29848): at android.app.Activity.findViewById (Activity.java:1843) 09-27 00: 03: 10.132: E/AndroidRuntime (29848) : at com.example.weatherforecast.MainActivity $ JSONForecastWeatherTask.onPostExecute (MainActivity.java:205) 09-27 00: 03: 10.132: E/AndroidRuntime (29848): at com.example.weatherforecast.MainActivity $ JSONForecastWeatherTask.onPostExecute (MainActivity.java:1) 09-27 00: 03: 10.132: E/AndroidRuntime (29848): at и roid.os.AsyncTask.finish (AsyncTask.java:631) 09-27 00: 03: 10.132: E/AndroidRuntime (29848): at android.os.AsyncTask.access $ 600 (AsyncTask.java:177) 09- 27 00: 03: 10.132: E/AndroidRuntime (29848): at android.os.AsyncTask $ InternalHandler.handleMessage (AsyncTask.java:644) 09-27 00: 03: 10.132: E/AndroidRuntime (29848): у android .os.Handler.dispatchMessage (Handler.java:99) 09-27 00: 03: 10.132: E/AndroidRuntime (29848): at android.os.Looper.loop (Looper.java:137) 09-27 00 : 03: 10.132: E/AndroidRuntime (29848): at android.app.ActivityThread.main (ActivityThread.java:5234) 09-27 00: 03: 10.132: E/AndroidRuntime (29848): на java.lang.reflect .Method.invokeNative (собственный метод) 09-27 00: 03: 10.132: E/AndroidRuntime (29848): at java.lang.reflect.Method.invoke (Method.java:525) 09-27 00: 03: 10.132: E/AndroidRuntime (29848): at com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:799) 09-27 00: 03: 10.132: E/AndroidRuntime (29848): at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:566) 09-27 00: 03: 10.132: E/AndroidRuntime (29848): at dalvik.system.NativeStart.main (Родной метод)

Я все еще новичок в Java.

ответ

0

Я не вижу код вашего адаптера для GridView. Сначала вы должны написать отдельный класс-адаптер для GridView, где метод getView() должен быть переопределен (см. Аналогичные вопросы об адаптерах для GridView). Когда вы извлекаете данные, u должен вызывать метод notifyDataSetChanged() для вашего адаптера - это обновит GridView новыми данными.

Хороший пример того, как заказ GridView http://www.mkyong.com/android/android-gridview-example/

И не забудьте позвонить адаптер.notifyDataSetChanged();

+0

Я только что разместил свои асинтеты и адаптер, но приложение аварийно завершает работу и дает исключение нулевого указателя – GibranG

+0

Итак, пожалуйста, укажите строку, где происходит сбой приложения. Вы можете увидеть его в LogCat –

+0

опубликовал журнал! – GibranG

Смежные вопросы