Học liệu

LẬP TRÌNH ỨNG DỤNG CSDL VỚI SQLITE TRONG ANDROID

  • 15/05/2019
  • Học liệu

I. Mục tiêu

Giúp sinh viên hiểu rõ và lập trình với các thành phần

1)    Ôn lại Costum ListView, Intent

2)    Parse XLM với phương pháp DOM, SAX

3)    Làm quen với WEBVIEW

II. Nội dung

1. Viết chương trình Đọc báo VNEXPRESS.NET có giao diện như sau:

 undefined

 

Mỗi dòng trong ListView sẽ có 3 đối tượng: ImageView (Chứa hình ảnh) và 2 TextView (chứa tiêu đề và Tóm tắt bài báo). Khi chúng ta click vào một dòng trong ListView, chương trình sẽ gọi đến một Activity mới có dạng như sau:

 undefined

            Để xây dựng được ListView có hai đối tượng trở lên trong mỗi dòng như trên, thì ta phải kế thừa từ ArrayAdapter và override phương thức getView.

            Xem cấu trúc chương trình:

           undefined

 

Các bước thực hiện:

1. Tạo thêm thư mục Drawable và copy các file Image background.jpg vào

2. Xây dựng Layout cho main.xml, Layout đơn giản, chỉ gồm 1 ListView, tham khảo code XML:

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

    android:background="@drawable/background"

    android:layout_width="fill_parent"

    android:layout_height="fill_parent"

    android:orientation="vertical">

    <ListView

        android:id="@+id/listView1"

        android:layout_width="match_parent"

        android:layout_height="wrap_content" >

    </ListView>

</LinearLayout>

3. Trong thư mục layout: Tạo thêm layout_listview.xml dùng để Custom lại ListView, dưới đây là cấu trúc XML của nó:

 undefined

Ta sẽ dựa vào các id trong này để xử lý trong hàm getView của class mà ta kế thừa từ ArrayAdapter (các id trên là img1 chứa ảnh, name dùng để hiển thị tiêu đề bài báo, desciption để hiển thị tóm tắt bài báo)

4. Xây dựng Layout single_list_item.xml, Layout này sẽ được gọi đến khi ta click vào một hàng trong ListView, layout này sẽ chứa webview để hiển thị nội dung bài báo:

undefined

5. Dưới đây là các class h tr x lý nghip v:

undefined

- Class List dùng để khởi tạo các đối tượng Img, Nametitle, Des và các phương thức set, get tương ứng của chúng

- Class MyArrayAdapter kế thừa từ ArrayAdapter, mục đích của nó là giúp chúng ta Custom lại layout cho ListView.

- Class SingleMenuItemActivity để xử lý code cho Layout single_list_item.xml

- Class XMLParser dùng để Parse dữ liệu từ file web xml theo phương pháp DOM

- Cuối cùng class chính AndroidXMLParsingActivity

- Bây giờ ta vào chi tiết từng class:

a) Class List:

package com.androidhive.xmlparsing;

 

import android.graphics.Bitmap;

 

publicclass List {

private Bitmap Img;

private String Nametitle;

private String Des;

public Bitmap getImg() {

       returnImg;

}

publicvoid setImg(Bitmap Img) {

       this.Img = Img;

}

public String getNametitle() {

       returnNametitle;

}

publicvoid setNametitle(String Nametitle) {

       this.Nametitle = Nametitle;

}

public String getDes() {

       returnDes;

}

publicvoid setDes(String Des) {

       this.Des = Des;

}

}

Lưu ý: Mỗi biến đối tượng ta đều có hai phương thức get và set tương ứng để đưa đối tượng vào hoặc lấy đối tượng ra.

b) class MyArrayAdapter:

package com.androidhive.xmlparsing;

import java.util.ArrayList;

import android.app.Activity;

import android.view.LayoutInflater;

import android.view.View;

import android.view.ViewGroup;

import android.widget.ArrayAdapter;

import android.widget.ImageView;

import android.widget.TextView;

publicclass MyArrayAdapter extends ArrayAdapter<List>{

Activity context = null;

ArrayList<List>myArray = null;

intLayoutId;

public MyArrayAdapter(Activity context, int LayoutId,ArrayList<List>arr) {

       super(context, LayoutId,arr);

       // TODO Auto-generated constructor stub

       this.context = context;

       this.LayoutId = LayoutId;

       this.myArray = arr;

}

@Override

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

             // TODO Auto-generated method stub

       LayoutInflater inflater = context.getLayoutInflater();

       convertView = inflater.inflate(LayoutId, null);

       final List myList= myArray.get(position);

       final ImageView imgitem = (ImageView)convertView.findViewById(R.id.img1);

       //imgitem.setImageResource(myList.getImg());

       imgitem.setImageBitmap(myList.getImg());

       final TextView mynametitle = (TextView)convertView.findViewById(R.id.name);

       mynametitle.setText(myList.getNametitle());

       final TextView mydes = (TextView)convertView.findViewById(R.id.desciption);

       mydes.setText(myList.getDes());

       return convertView;

       }

}

- Đây là class quan trọng nhất, mới nhất; dùng  để custom layout.

c) Class XMLParser để get dữ liệu từ file xml đưa về từ web

package com.androidhive.xmlparsing;

 

import java.io.IOException;

import java.io.StringReader;

import java.io.UnsupportedEncodingException;

import javax.xml.parsers.DocumentBuilder;

import javax.xml.parsers.DocumentBuilderFactory;

import javax.xml.parsers.ParserConfigurationException;

import org.apache.http.HttpEntity;

import org.apache.http.HttpResponse;

import org.apache.http.client.ClientProtocolException;

import org.apache.http.client.methods.HttpPost;

import org.apache.http.impl.client.DefaultHttpClient;

import org.apache.http.util.EntityUtils;

import org.w3c.dom.Document;

import org.w3c.dom.Element;

import org.w3c.dom.Node;

import org.w3c.dom.NodeList;

import org.xml.sax.InputSource;

import org.xml.sax.SAXException;

import android.util.Log;

publicclass XMLParser {

 

       // constructor

       public XMLParser() {

 

       }

 

       /**

        * Getting XML from URL making HTTP request

        * @param url string

        * */

       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;

       }

      

       /**

        * Getting XML DOM element

        * @param XML string

        * */

       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());

                          returnnull;

                    } catch (SAXException e) {

                          Log.e("Error: ", e.getMessage());

                   returnnull;

                    } catch (IOException e) {

                          Log.e("Error: ", e.getMessage());

                          returnnull;

                    }

 

               return doc;

       }

      

       /** Getting node value

         * @param elem element

         */

        publicfinal 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 || child.getNodeType() == Node.CDATA_SECTION_NODE   ){

                            return child.getNodeValue();

                        }

                    }

                }

            }

            return"";

        }

        

        /**

         * Getting node value

         * @param Element node

         * @param key string

         * */

        public String getValue(Element item, String str) {       

                    NodeList n = item.getElementsByTagName(str);        

                    returnthis.getElementValue(n.item(0));

             }

}

d) Xây dựng Class AndroidXMLParsingActivity

publicclass AndroidXMLParsingActivity extends Activity {

 

       // All static variables

       staticfinal String URL = "http://vnexpress.net/rss/tin-moi-nhat.rss";

       // XML node keys

       staticfinal String KEY_ITEM = "item"; // parent node

       staticfinal String KEY_NAME = "title";

       staticfinal String KEY_LINK = "link";

       staticfinal String KEY_DESC = "description";

       String urlStr;

       private ListView listViewDemo;

       private MyArrayAdapter adapterDanhSach;

       protectedvoid onCreate(Bundle savedInstanceState) {

             super.onCreate(savedInstanceState);

             setContentView(R.layout.main);

             // Adapters

             listViewDemo = (ListView) findViewById(R.id.listView1);

             ArrayList<List>Mylist =  new ArrayList<List>();

             adapterDanhSach = new MyArrayAdapter(AndroidXMLParsingActivity.this,R.layout.list_item,Mylist);

             listViewDemo.setAdapter(adapterDanhSach);

             //---------

             final XMLParser parser = new XMLParser();

             String xml = parser.getXmlFromUrl(URL); // getting XML

             Document doc = parser.getDomElement(xml); // getting DOM element

             final 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_NAME, parser.getValue(e, KEY_NAME));

                    //     map.put(KEY_LINK, parser.getValue(e, KEY_LINK));

                    String xml1 = parser.getValue(e, KEY_DESC);

                    String[] parts = xml1.split("</br>");

                    //map.put(KEY_DESC, parts[1]);

String regex = "\\(?\\b(http://|www[.])[-A-Za-z0-9+&@#/%?=~_()|!:,.;]*[-A-Za-z0-9+&@#/%=~_()|]";

                    Pattern p = Pattern.compile(regex);

                    Matcher m = p.matcher(xml1);

                    while(m.find()) {

                          urlStr = m.group();

                          if (urlStr.startsWith("(") && urlStr.endsWith(")"))

                          {

                                 char[] stringArray = urlStr.toCharArray();

                                 char[] newArray = newchar[stringArray.length-2];

                                 System.arraycopy(stringArray, 1, newArray, 0, stringArray.length-2);

                                 urlStr = new String(newArray);

                                 System.out.println("Finally Url ="+newArray.toString());

 

                          }

                    }

                    //Toast.makeText(this,urlStr, Toast.LENGTH_LONG).show();

                    URL newurl = null;

                    try {

                          newurl = new URL(urlStr);

                    } catch (MalformedURLException e2) {

                          // TODO Auto-generated catch block

                          e2.printStackTrace();

                    }

                    Bitmap mIcon_val = null;

                    try {

                          mIcon_val = BitmapFactory.decodeStream(newurl.openConnection() .getInputStream());

                    } catch (IOException e1) {

                          // TODO Auto-generated catch block

                          e1.printStackTrace();

                    }

                    // adding HashList to ArrayList

                    List mylist1 = new List();

                    mylist1.setImg(mIcon_val);

                    mylist1.setNametitle(parser.getValue(e, KEY_NAME));

                    mylist1.setDes(parts[1]);

                    Mylist.add(mylist1);

                    adapterDanhSach.notifyDataSetChanged();

             }

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

 

       listViewDemo.setOnItemClickListener(new OnItemClickListener() {

            

             @Override

       publicvoid onItemClick(AdapterView<?> parent, View view,

              int position, long id) {

             Element e1 = (Element) nl.item(position);

             Intent in = new Intent(getApplicationContext(), SingleMenuItemActivity.class);

             in.putExtra("link", parser.getValue(e1, KEY_LINK));

             startActivity(in);

             }

             });

       }

}

e) Xây dựng Class SingleMenuItemActivity 

publicclass SingleMenuItemActivity  extends Activity {

      

       // XML node keys

       staticfinal String KEY_LINK = "link";

       @Override

    publicvoid 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 link = in.getStringExtra(KEY_LINK);

       

        // Displaying all values on the screen

        WebView web= (WebView)findViewById(R.id.webView1);

        web.loadUrl(link);

 

    }

}

 

---------------------END -----------------

Các tin khác