Thursday 30 October 2014

Simple steps for XML Parsing (DOM) on UI Thread. (only minSdkVersion="8" )


  1. 1.       Parsing XML   result  to list view  using  DOM
  2. 2.        Network process on UI thread (sdk version <= 8)
  3. 3.       Simple click on list view 



========================================


















Requirements
1.       MainActivity  with simple list
2.       XML Parse class
3.       Save details in map using parse class
4.       Listing all items in list view using ListAdapter
5.       Put action on listview row.
6.       Show particular view on new activity.




FILES 

1.       XMLParser.java

2.       AndroidXMLParsingActivity.java

3.       SingleMenuItemActivity  .java

4.       Main.xml

5.       List_item.xml

6.       Single_list_item.xml


===========================================


public class XMLParser {

       // constructor
       public XMLParser() {
        }
       public String getXmlFromUrl(String url) {
              String xml = null;
               try {
                     // defaultHttpClient
                     DefaultHttpClient httpClient = new DefaultHttpClient();
                     HttpPost httpPost = new HttpPost(url);

                     HttpResponse httpResponse = httpClient.execute(httpPost);
                     HttpEntity httpEntity = httpResponse.getEntity();
                     xml = EntityUtils.toString(httpEntity);

              } catch (UnsupportedEncodingException e) {
                     e.printStackTrace();
              } catch (ClientProtocolException e) {
                     e.printStackTrace();
              } catch (IOException e) {
                     e.printStackTrace();
              }
              // return XML
              return xml;
       }

       public Document getDomElement(String xml){
              Document doc = null;
              DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
              try {
                     DocumentBuilder db = dbf.newDocumentBuilder();
                     InputSource is = new InputSource();
                      is.setCharacterStream(new StringReader(xml));
                      doc = db.parse(is);
                     } catch (ParserConfigurationException e) {
                           Log.e("Error: ", e.getMessage());
                           return null;
                     } catch (SAXException e) {
                            Log.e("Error: ", e.getMessage());
                   return null;
                     } catch (IOException e) {
                           Log.e("Error: ", e.getMessage());
                           return null;
                     }

               return doc;
       }
        public final String getElementValue( Node elem ) {
            Node child;
            if( elem != null){
                if (elem.hasChildNodes()){
                    for( child = elem.getFirstChild(); child != null; child =                                       child.getNextSibling() ){
                        if( child.getNodeType() == Node.TEXT_NODE  ){
                            return child.getNodeValue();
                        }
                    }
                }
            }
            return "";
        }
    
        public String getValue(Element item, String str) {          
                     NodeList n = item.getElementsByTagName(str);          
                     return this.getElementValue(n.item(0));
              }
}


===========================================





public class AndroidXMLParsingActivity extends ListActivity {

       // All static variables
       static final String URL = "http://api.androidhive.info/pizza/?format=xml";
       // XML node keys
       static final String KEY_ITEM = "item"; // parent node
       static final String KEY_ID = "id";
       static final String KEY_NAME = "name";
       static final String KEY_COST = "cost";
       static final String KEY_DESC = "description";

       @Override
       public void onCreate(Bundle savedInstanceState) {
              super.onCreate(savedInstanceState);
              setContentView(R.layout.main);

ArrayList<HashMap<String, String>> menuItems = new
 ArrayList<HashMap<String, String>>();

              XMLParser parser = new XMLParser();
              String xml = parser.getXmlFromUrl(URL); // getting XML
              Document doc = parser.getDomElement(xml); // getting DOM element

              NodeList nl = doc.getElementsByTagName(KEY_ITEM);
              // looping through all item nodes <item>
              for (int i = 0; i < nl.getLength(); i++) {
                     // creating new HashMap
                     HashMap<String, String> map = new HashMap<String, String>();
                     Element e = (Element) nl.item(i);
                     // adding each child node to HashMap key => value
                     map.put(KEY_ID, parser.getValue(e, KEY_ID));
                     map.put(KEY_NAME, parser.getValue(e, KEY_NAME));
                     map.put(KEY_COST, "Rs." + parser.getValue(e, KEY_COST));
                     map.put(KEY_DESC, parser.getValue(e, KEY_DESC));
                     // adding HashList to ArrayList
                     menuItems.add(map);
              }

              // Adding menuItems to ListView
              ListAdapter adapter = new SimpleAdapter(
this,
`             menuItems,
              R.layout.list_item,
              new String[] { KEY_NAME, KEY_DESC, KEY_COST },
new int[]    { R.id.name, R.id.desciption, R.id.cost });

              setListAdapter(adapter);
              // selecting single ListView item
              ListView lv = getListView();
              lv.setOnItemClickListener(new OnItemClickListener() {
                     @Override
                     public void onItemClick(AdapterView<?> parent, View view,
                                  int position, long id) {
                           // getting values from selected ListItem
                           String name = ((TextView) view.findViewById(R.id.name)).getText().toString();
                           String cost = ((TextView) view.findViewById(R.id.cost)).getText().toString();
                           String description = ((TextView) view.findViewById(R.id.desciption)).getText().toString();
                          
                           // Starting new intent
                           Intent in = new Intent(getApplicationContext(), SingleMenuItemActivity.class);
                           in.putExtra(KEY_NAME, name);
                           in.putExtra(KEY_COST, cost);
                           in.putExtra(KEY_DESC, description);
                           startActivity(in);

                     }
              });
       }
}



===========================================



// this activity for show single row in differ view

public class SingleMenuItemActivity  extends Activity {
      
       // XML node keys
       static final String KEY_NAME = "name";
       static final String KEY_COST = "cost";
       static final String KEY_DESC = "description";
       @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.single_list_item);
       
        // getting intent data
        Intent in = getIntent();
       
        // Get XML values from previous intent
        String name = in.getStringExtra(KEY_NAME);
        String cost = in.getStringExtra(KEY_COST);
        String description = in.getStringExtra(KEY_DESC);
       
        // Displaying all values on the screen
        TextView lblName = (TextView) findViewById(R.id.name_label);
        TextView lblCost = (TextView) findViewById(R.id.cost_label);
        TextView lblDesc = (TextView) findViewById(R.id.description_label);
       
        lblName.setText(name);
        lblCost.setText(cost);
        lblDesc.setText(description);
    }
}


**********************************************

=======================================




XML  LAYOUTS

Main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical">
        <!-- Main ListView
               Always give id value as list(@android:id/list)
        -->
    <ListView
        android:id="@android:id/list"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"/>
</LinearLayout



===========================================

List_item.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal"> 
    <LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical">
              <!-- Name Label -->
        <TextView
            android:id="@+id/name"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:textColor="#dc6800"
            android:textSize="16sp"
            android:textStyle="bold"
            android:paddingTop="6dip"
            android:paddingBottom="2dip" />
              <!-- Description label -->
        <TextView
            android:id="@+id/desciption"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:textColor="#acacac"
            android:paddingBottom="2dip">
        </TextView>
        <!-- Linear layout for cost and price Cost: Rs.100 -->
        <LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">
        <!-- Cost Label -->
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textColor="#5d5d5d"
            android:gravity="left"
            android:textStyle="bold"
            android:text="Cost: " >
        </TextView>
        <!-- Price Label -->
        <TextView
            android:id="@+id/cost"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textColor="#acacac"
            android:textStyle="bold"
            android:gravity="left">
        </TextView>
        </LinearLayout>
    </LinearLayout>

</LinearLayout>

                                  ===========================================

Single_list_item.xml


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:orientation="vertical"
  android:layout_width="match_parent"
  android:layout_height="match_parent">
  <!-- Name Label -->
          <TextView android:id="@+id/name_label"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:textSize="25dip"
            android:textStyle="bold"
            android:paddingTop="10dip"
            android:paddingBottom="10dip"
            android:textColor="#dc6800"/>
  <!-- Description Label -->
           <TextView android:id="@+id/description_label"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:textColor="#acacac"/>
  <!-- Price Label -->
            <TextView android:id="@+id/cost_label"
              android:layout_width="fill_parent"
              android:layout_height="wrap_content"
              android:textStyle="bold"/>
</LinearLayout>



How to do text writing animation?  In Android Development we do not have the option to use any other custom font in our default Tex...