Android Weather App Get Hourly Report Part (3/3)

By | March 12, 2015

In the previous series of tutorial we have seen how to how to get current weather report and forecast report of any specified place , in this post we will see how to get hourly weather report for each forecast , as you can see in the previous tutorial in forecast activity on click of items of listview ,we are starting a new activity by passing date and jsonobject through intent object , in the newly launched activity we will parse the json object and show the 3hours interval weather report on listview .

XML Layout

 Create forecast.xml file inside layout directory , add TextView and ListView to it .

file :interval.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:background=”@drawable/w6″
    android:orientation=”vertical” >

    <TextView
        android:id=”@+id/idate_tv”
        android:layout_width=”match_parent”
        android:layout_height=”wrap_content”
        android:layout_marginRight=”15dp”
        android:gravity=”right”
        android:padding=”10dp”
        android:text=”2015-03-06″
        android:textColor=”#ffffff”
        android:textSize=”22sp” />

    <ListView
        android:id=”@+id/ilv”
        android:layout_width=”match_parent”
        android:layout_height=”match_parent” >
    </ListView>

</LinearLayout>

 Create list_item.xml file inside layout directory , this layout represents the rows of the listview .

file :list_item.xml

<?xml version=”1.0″ encoding=”utf-8″?>
<RelativeLayout xmlns:android=”http://schemas.android.com/apk/res/android”
    android:layout_width=”fill_parent”
    android:layout_height=”fill_parent”
    android:padding=”5dp” >

    <TextView
        android:id=”@+id/fmin_max”
        android:layout_width=”wrap_content”
        android:layout_height=”wrap_content”
        android:layout_alignLeft=”@+id/ftemp”
        android:layout_below=”@+id/ftemp”
        android:textColor=”#ffffff”
        android:textSize=”20sp” />

    <com.android.volley.toolbox.NetworkImageView
        android:id=”@+id/ficon”
        android:layout_width=”100dp”
        android:layout_height=”100dp”
        android:layout_alignParentLeft=”true”
        android:layout_alignParentTop=”true”
        android:layout_marginLeft=”5dp”
        android:contentDescription=”desc”
        android:src=”@drawable/ic_launcher” />

    <TextView
        android:id=”@+id/ftemp”
        android:layout_width=”wrap_content”
        android:layout_height=”wrap_content”
        android:layout_alignTop=”@+id/ficon”
        android:layout_marginLeft=”8dp”
        android:layout_marginTop=”15dp”
        android:layout_toRightOf=”@+id/ficon”
        android:textColor=”#ffffff”
        android:textSize=”43sp” />

    <TextView
        android:id=”@+id/fdesc”
        android:layout_width=”wrap_content”
        android:layout_height=”wrap_content”
        android:layout_alignLeft=”@+id/ficon”
        android:layout_below=”@+id/ficon”
        android:layout_marginLeft=”10dp”
        android:textColor=”#ffffff”
        android:textSize=”20sp” />

    <TextView
        android:id=”@+id/fdate”
        android:layout_width=”wrap_content”
        android:layout_height=”wrap_content”
        android:layout_alignParentRight=”true”
        android:layout_alignTop=”@+id/ficon”
        android:background=”@drawable/textborder”
        android:paddingRight=”3dp”
        android:textColor=”#ffffff”
        android:textSize=”18sp” />

</RelativeLayout>

 Java Bean

Create a Bean Class RowItem which is used for setting and getting row data’s of each items in ListView.

file : RowItem.java

package com.example.weatherapp;

public class RowItem {

    int temp, temp_max, temp_min;
    String mdate, description, icon;

    public RowItem(int temp, int temp_max, int temp_min, String description,
            String icon, String mdate) {

        this.temp = temp;
        this.temp_max = temp_max;
        this.temp_min = temp_min;
        this.description = description;
        this.icon = icon;
        this.mdate = mdate;
    }

    public String getMdate() {
        return mdate;
    }

    public void setMdate(String mdate) {
        this.mdate = mdate;
    }

    public int getTemp() {
        return temp;
    }

    public void setTemp(int temp) {
        this.temp = temp;
    }

    public int getTemp_max() {
        return temp_max;
    }

    public void setTemp_max(int temp_max) {
        this.temp_max = temp_max;
    }

    public int getTemp_min() {
        return temp_min;
    }

    public void setTemp_min(int temp_min) {
        this.temp_min = temp_min;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }

    public String getIcon() {
        return icon;
    }

    public void setIcon(String icon) {
        this.icon = icon;
    }

}

Adapter

Create a custom adapter which extends BaseAdapter , this is used for inflating each row items of the listview .

file :CustomAdapter.java

package com.example.weatherapp;

import java.util.List;
import com.android.volley.toolbox.ImageLoader;
import com.android.volley.toolbox.NetworkImageView;
import android.app.Activity;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;

public class CustomAdapter extends BaseAdapter {

    Context context;
    List<RowItem> rowItems;
    ImageLoader imageLoader = MyApplication.getInstance().getImageLoader();

    public CustomAdapter(Context context, List<RowItem> rowItems) {

        this.context = context;
        this.rowItems = rowItems;

    }

    @Override
    public int getCount() {

        return rowItems.size();
    }

    @Override
    public Object getItem(int position) {

        return rowItems.get(position);
    }

    @Override
    public long getItemId(int position) {

        return rowItems.indexOf(getItem(position));
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {

        LayoutInflater mInflater = (LayoutInflater) context
                .getSystemService(Activity.LAYOUT_INFLATER_SERVICE);

        if (convertView == null) {
            convertView = mInflater.inflate(R.layout.list_item, null);
        }

        TextView temp_tv, minmax_tv, desc_tv, date_tv;

        NetworkImageView niv;

        temp_tv = (TextView) convertView.findViewById(R.id.ftemp);
        minmax_tv = (TextView) convertView.findViewById(R.id.fmin_max);
        desc_tv = (TextView) convertView.findViewById(R.id.fdesc);
        date_tv = (TextView) convertView.findViewById(R.id.fdate);
        niv = (NetworkImageView) convertView.findViewById(R.id.ficon);

        RowItem item = rowItems.get(position);

        temp_tv.setText(item.getTemp() + “u2103”);
        minmax_tv.setText(item.getTemp_min() + “u2103” + “\”
                + item.getTemp_min() + “u2103”);
        desc_tv.setText(item.getDescription() + “”);
        date_tv.setText(item.getMdate() + “”);

        String icon_url = “http://openweathermap.org/img/w/” + item.getIcon()
                + “.png”;

        niv.setImageUrl(icon_url, imageLoader);

        return convertView;
    }

}

MainActivity

  1. Create a class MainActivity and extend this class to Activity class and set the content of this activity with above defined XML Layout (forecast.xml) .
  2.  Set the listview with above defined custom adapter .
  3.  Inside the onCreate Method through intent object get the “date” and “jsonobject” data which are set during the start of this activity .
  4.  Parse the json object and then set the parsed json data on to UI . 

file :Interval.java

package com.example.weatherapp;

import java.util.ArrayList;
import java.util.List;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.widget.ListView;
import android.widget.TextView;

public class Interval extends Activity {

    TextView tv;
    ListView lv;
    CustomAdapter adapter;
    List<RowItem> rowItems = new ArrayList<RowItem>();

    String place_id, place_name, mDate;

    @SuppressLint(“NewApi”)
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.interval);

        tv = (TextView) findViewById(R.id.idate_tv);
        lv = (ListView) findViewById(R.id.ilv);

        adapter = new CustomAdapter(getApplicationContext(), rowItems);
        lv.setAdapter(adapter);

        Intent i = getIntent();

        place_id = i.getExtras().getString(“placeid”);
        place_name = i.getExtras().getString(“name”);
        mDate = i.getExtras().getString(“mDate”);
        String jo = i.getExtras().getString(“jo”);

        getActionBar().setSubtitle(place_name);
        tv.setText(mDate);
        parseJson(jo, mDate);

    }

    private void parseJson(String jo, String mDate) {

        try {
            JSONObject jjo = new JSONObject(jo);

            JSONArray jlist = jjo.getJSONArray(“list”);

            // tv.append(ja.length() + “”);

            for (int i = 0; i < jlist.length(); i++) {

                String dt_txt = jlist.getJSONObject(i).getString(“dt_txt”);

                String jDate = dt_txt.substring(0, 10);

                if (mDate.equals(jDate)) {

                    JSONObject main = jlist.getJSONObject(i).getJSONObject(
                            “main”);

                    int temp, temp_max, temp_min;

                    temp = (int) (main.getDouble(“temp”) – 273.15);
                    temp_max = (int) (main.getDouble(“temp_max”) – 273.15);
                    temp_min = (int) (main.getDouble(“temp_min”) – 273.15);

                    JSONArray weather = jlist.getJSONObject(i).getJSONArray(
                            “weather”);

                    String icon = weather.getJSONObject(0).getString(“icon”);
                    String description = weather.getJSONObject(0).getString(
                            “description”);

                    String mtime = dt_txt.substring(11, 16);

                    RowItem rItem = new RowItem(temp, temp_max, temp_min,
                            description, icon, mtime);

                    rowItems.add(rItem);

                } // if end

            } // for end

            adapter.notifyDataSetChanged();

        } catch (JSONException e) {

            e.printStackTrace();
        }

    }

}