当我按下刷新按钮时,android sun app实时数据未加载到列表中

时间:2018-04-12 07:15:52

标签: android

嗨我一直在关注android阳光Udacity课程,但我被困在加载来自互联网i日志的实时数据,我看到数据,但它没有加载在listView上提前感谢。

package com.example.ali.ican;

public class MainActivity extends ActionBarActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    if (savedInstanceState == null) {
        getSupportFragmentManager().beginTransaction()
            .add(R.id.container, new ForcastFragment())
                .commit();
    }
}
}

ForcastFragment

/**
 * A placeholder fragment containing a simple view.
 */
 public  class ForcastFragment extends android.support.v4.app.Fragment {

private static ArrayAdapter<String> ForcastIncoming;
public ForcastFragment() {
}

//---------------------------------------------------------

@Override
public void onCreate(Bundle savedInstanceState){

    super.onCreate(savedInstanceState);

    setHasOptionsMenu(true);

}

@Override
public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
    new FetchWeatherTask().execute("London");
}

@Override
public void onCreateOptionsMenu(Menu menu,MenuInflater inflater) {
    // Inflate the menu; this adds items to the action bar if it is present.
        inflater.inflate(R.menu.forcastfragment, menu);

}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle action bar item clicks here. The action bar will
    // automatically handle clicks on the Home/Up button, so long
    // as you specify a parent activity in AndroidManifest.xml.
    int id = item.getItemId();

    //noinspection SimplifiableIfStatement
    if (id == R.id.action_refresh) {

        FetchWeatherTask fetchWeatherTask = new FetchWeatherTask();

        fetchWeatherTask.execute("119505");

        Log.v("Action_refresh","works");

        return true;
    }

    return super.onOptionsItemSelected(item);
}

  //---------------------------------------------------------




@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    View rootView = inflater.inflate(R.layout.fragment_main, container, false);

//            api.openweathermap.org/data/2.5/forecast?q=Qazvin,Iran&mode=Json
//            api.openweathermap.org/data/2.5/forecast/daily?q=Qazvin,Iran&mode=Json&units=metric&cnt=7

    String [] wheather ={

            "Today - sunny 88/66",

            "Tommorow - foggy 65/66",

            "Sunday - windy  55/63",

            "Monday - cloudy 89/66"



    };

    List<String> WeekForecast =new ArrayList<String>(
            Arrays.asList(wheather)
    );




    ForcastIncoming =
            new ArrayAdapter<String>
                    (getActivity()
                    ,R.layout.list_item_forcast,
                     R.id._list_item_forecast_textView,
                     WeekForecast);

    ListView firstlist =(ListView) rootView.findViewById(R.id.list_view_foreccast);

    firstlist.setAdapter(ForcastIncoming);


      return rootView;
}




public class FetchWeatherTask extends AsyncTask<String ,Void, String[]>{

    private final String LOG_TAG =FetchWeatherTask.class.getCanonicalName();






    @Override
    protected String[] doInBackground(String... params) {

                  Log.v("CityID",""+params);
        // These two need to be declared outside the try/catch
        // so that they can be closed in the finally block.
        HttpURLConnection urlConnection = null;
        BufferedReader reader = null;
        int numDays =7;

        // Will contain the raw JSON response as a string.
        String forecastJsonStr = null;

        try {
            // Construct the URL for the OpenWeatherMap query
            // Possible parameters are avaiable at OWM's forecast API page, at
            // http://openweathermap.org/API#forecast
//                final String FORCAST_BASE_URL ="http://api.openweathermap.org/data/2.5/forecast?id=119505&APPID=2a1ca9cdf8fa6bece6558112664c02ab";

           final String FORCAST_BASE_URL ="http://api.openweathermap.org/data/2.5/forecast?id=119505&APPID=2a1ca9cdf8fa6bece6558112664c02ab";
           final String QUERY_PARAM ="id";
           final String QUERY_AAPID = "APPID";
           final String APPID = "2a1ca9cdf8fa6bece6558112664c02ab";
           final String QUERY_CNT = "cnt";

            Uri uriBuilder = Uri.parse(FORCAST_BASE_URL).buildUpon()
                    .appendQueryParameter(QUERY_PARAM,params[0])
                    .appendQueryParameter(QUERY_AAPID,APPID)
                    .appendQueryParameter(QUERY_CNT,Integer.toString(numDays))
                    .build();


//                URL url = new URL("http://api.openweathermap.org/data/2.5/forecast?id=119505&APPID=2a1ca9cdf8fa6bece6558112664c02ab");
             URL url = new URL(uriBuilder.toString());
            Log.v("Uri_builder",""+uriBuilder);
            // Create the request to OpenWeatherMap, and open the connection

            urlConnection = (HttpURLConnection) url.openConnection();
            urlConnection.setRequestMethod("GET");
//                    urlConnection.setRequestProperty("User-Agent","Mozilla/5.0 ( compatible ) ");
//                    urlConnection.setRequestProperty("Accept","*/*");
//                    urlConnection.setRequestProperty("API_KEY", "2a1ca9cdf8fa6bece6558112664c02ab");
//                urlConnection.setDoInput(true);
//                urlConnection.setDoOutput(false);
            urlConnection.connect();



            // Read the input stream into a String
            InputStream inputStream = urlConnection.getInputStream();
            StringBuffer buffer = new StringBuffer();

            if (inputStream == null) {
                // Nothing to do.
                 Log.e("inputstreamshouting","yesssssssssnullllllllll");
                return null;
            }


            reader = new BufferedReader(new InputStreamReader(inputStream));

            String line;
            while ((line = reader.readLine()) != null) {
                // Since it's JSON, adding a newline isn't necessary (it won't affect parsing)
                // But it does make debugging a *lot* easier if you print out the completed
                // buffer for debugging.
                buffer.append(line + "\n");
            }

            if (buffer.length() == 0) {
                // Stream was empty.  No point in parsing.
                return null;
            }
            forecastJsonStr = buffer.toString();

            Log.v("MAhdi","forcastJsonStr:" +forecastJsonStr);
        } catch (IOException e) {
            Log.e("PlaceholderFragment", "Error ", e);
            // If the code didn't successfully get the weather data, there's no point in attemping
            // to parse it.
            return null;
        } finally{
            if (urlConnection != null) {
                urlConnection.disconnect();
            }
            if (reader != null) {
                try {
                    reader.close();
                } catch (final IOException e) {
                    Log.e("PlaceholderFragment", "Error closing stream", e);
                }
            }
        }


        try {
            return getWeatherDataFromJson(forecastJsonStr,numDays);
        } catch (JSONException e) {
            e.printStackTrace();

        }


        return null;
    }


         @Override
         protected void onPostExecute(String[] res) {
             super.onPostExecute(res);

             Log.v("From_onPost",""+res);

             if (res !=null)
                 {
                       ForcastIncoming.clear();
                             for(String dayForcastTR :res){

                                     ForcastIncoming.add(dayForcastTR);

                            }
                         }
                                  ForcastIncoming.notifyDataSetChanged();

               }

















    /* The date/time conversion code is going to be moved outside the asynctask later,
 * so for convenience we're breaking it out into its own method now.
 */
    private String getReadableDateString(long time){
        // Because the API returns a unix timestamp (measured in seconds),
        // it must be converted to milliseconds in order to be converted to valid date.
        Date date = new Date(time * 1000);
        SimpleDateFormat format = new SimpleDateFormat("E, MMM d");
        return format.format(date).toString();
    }

    /**
     * Prepare the weather high/lows for presentation.
     */
    private String formatHighLows(double high, double low) {
        // For presentation, assume the user doesn't care about tenths of a degree.
        long roundedHigh = Math.round(high);
        long roundedLow = Math.round(low);

        String highLowStr = roundedHigh + "/" + roundedLow;
        return highLowStr;
    }

    /**
     * Take the String representing the complete forecast in JSON Format and
     * pull out the data we need to construct the Strings needed for the wireframes.
     *
     * Fortunately parsing is easy:  constructor takes the JSON string and converts it
     * into an Object hierarchy for us.
     */
    private String[] getWeatherDataFromJson(String forecastJsonStr, int numDays)
            throws JSONException {

        Log.v("Testing_arg","this is the ::"+ forecastJsonStr);
        // These are the names of the JSON objects that need to be extracted.
        final String OWM_LIST = "list";
        final String OWM_WEATHER = "weather";
        final String OWM_TEMPERATURE = "temp";
        final String OWM_MAX = "temp_max";
        final String OWM_MIN = "temp_min";
        final String OWM_DATETIME = "dt";
        final String OWM_DESCRIPTION = "main";

        JSONObject forecastJson = new JSONObject(forecastJsonStr);
        JSONArray weatherArray = forecastJson.getJSONArray(OWM_LIST);

        String[] resultStrs = new String[numDays];
        Log.v("here_weatherArray","works ::"+ weatherArray);
        for(int i = 0; i < weatherArray.length(); i++) {
            // For now, using the format "Day, description, hi/low"
            String day;
            String description;
            String highAndLow;

            // Get the JSON object representing the day
            JSONObject dayForecast = weatherArray.getJSONObject(i);
            Log.v("here_dayForecast","works ::"+dayForecast);
            // The date/time is returned as a long.  We need to convert that
            // into something human-readable, since most people won't read "1400356800" as
            // "this saturday".
            long dateTime = dayForecast.getLong(OWM_DATETIME);
            day = getReadableDateString(dateTime);

            // description is in a child array called "weather", which is 1 element long.
            JSONObject weatherObject = dayForecast.getJSONArray(OWM_WEATHER).getJSONObject(0);
            description = weatherObject.getString(OWM_DESCRIPTION);

                            Log.v("herewat","worksk ::" + weatherObject);

            // Temperatures are in a child object called "temp".  Try not to name variables
            // "temp" when working with temperature.  It confuses everybody.
            JSONObject temperatureObject = dayForecast.getJSONObject(OWM_DESCRIPTION);
            double high = temperatureObject.getDouble(OWM_MAX);
            double low = temperatureObject.getDouble(OWM_MIN);

            Log.v("high","temperatureObject ::"+high);

            highAndLow = formatHighLows(high, low);
            resultStrs[i] = day + " - " + description + " - " + highAndLow;
            Log.v("_resultStrs","works ::"+resultStrs);


//                Log.v("resultStrs[i]","this is the ::"+ resultStrs[i]);


//                for(int ii=0;ii<resultStrs.length;i++){
//
//                    Log.v("_Parsing", "Forcast entry: "  + resultStrs[ii]);
//
//
//                }




            return resultStrs;


        }



        return resultStrs;
    }



}

}

我希望有人可以提前再次感谢我

布局结构

my XML files

1 个答案:

答案 0 :(得分:1)

将您的List<String> WeekForecast设为全局,并在onPostExecute中添加新项目,如

         @Override
         protected void onPostExecute(String[] res) {
             super.onPostExecute(res);
             Log.v("From_onPost",""+res);
             if (res !=null)
             {
                WeekForecast.clear();
                WeekForecast.addAll(Arrays.asList(res));       
                ForcastIncoming.notifyDataSetChanged();
             }
       }