«

DOM解析XML文件3-SimpleAdapter_自定义布局

时间:2024-3-2 18:10     作者:韩俊     分类: Android


1.新建名为domxml的项目

2.新建user_item.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:descendantFocusability="blocksDescendants"
    android:gravity="center_vertical|center_horizontal"
    android:orientation="horizontal" >

    <!--自定义的布局界面的根标签中加入了:
       android:descendantFocusability="blocksDescendants".
    -->

    <TextView
        android:id="@+id/tv_name"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1" />

    <TextView
        android:id="@+id/tv_phone"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1" />

    <Button
        android:id="@+id/btn_call"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:text="@string/btn_call" />

    <Button
        android:id="@+id/btn_sms"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:text="@string/btn_sms" />

</LinearLayout>

字符串资源:

Graphic Layout:

3.在activity_main.xml中添加ListView控件

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="${relativePackage}.${activityClass}" >

    <ListView
        android:id="@+id/lv_users"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</RelativeLayout>

4.新建名为UserAdapter的自定义Adapter,继承BaseAdapter,注意data的存储方式

package com.example.adapter;

import java.util.List;
import java.util.Map;

import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

import com.example.domxml.R;
import com.example.domxml.SmsActivity;

/**
 * 自定义的adapter   ListAdapter
 * @author Administrator
 *
 */
public class UserAdapter extends BaseAdapter{

    //要显示的数据
    private List<Map<String, Object>> data;
    //接受上下文
    private Context context;

    //声明一个内部类对象
    private ViewHolder viewHolder;

    /**
     * 通过构造函数传递
     * @param data
     */
    public UserAdapter(Context context,List<Map<String, Object>> data) {
        this.context=context;
        this.data=data;
    }

    //返回的总个数
    @Override
    public int getCount() {
        return data.size();
    }

    /**
     * 返回每个条目对应的数据
     */
    @Override
    public Object getItem(int position) {
        // TODO Auto-generated method stub
        return data.get(position);
    }

    /**
     * 返回的id 就是对应row id 和postion一致 
     */
    @Override
    public long getItemId(int position) {
        // TODO Auto-generated method stub
        return position;
    }

    /**
     * 返回这个条目 对应控件对象
     */
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {

        System.out.println("converView@"+convertView);
        //首先判断当前条目是否为null
        if (convertView==null) {
            //初始化这个viewHolder对象
            viewHolder = new ViewHolder();
            //创建它
            convertView = View.inflate(context, R.layout.user_item, null);
            viewHolder.tv_name = (TextView) convertView.findViewById(R.id.tv_name);
            viewHolder.tv_phone = (TextView) convertView.findViewById(R.id.tv_phone);
            viewHolder.btn_call = (Button) convertView.findViewById(R.id.btn_call);
            viewHolder.btn_sms= (Button) convertView.findViewById(R.id.btn_sms);
            //google开发者建议使用的
            convertView.setTag(viewHolder);
        }else{
            viewHolder = (ViewHolder) convertView.getTag();
        }

        //获取list集合中map对象
        Map<String,Object> map = data.get(position);
        //设置值
        viewHolder.tv_name.setText(map.get("names").toString());
        final String phone = map.get("phone").toString();
        //设置
        viewHolder.tv_phone.setText(phone);
        //具体的按钮注册事件
        viewHolder.btn_call.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                Toast.makeText(context, "call---"+phone, 1).show();
                //执行打电话
                //1.定义打电话的意图对象
                Intent intent = new Intent(Intent.ACTION_CALL, Uri.parse("tel:"+phone));
                //2.执行意图
                context.startActivity(intent);
                //3.记得添加打电话的权限  在项目清单中添加
            }
        });

        //给按钮注册事件
        viewHolder.btn_sms.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                //执行一个意图 打开发短信界面
                //1.定义一个意图
                Intent intent = new Intent(context,SmsActivity.class);
                //通过这个意图可以附带数据
                intent.putExtra("phone", phone);
                //2.执行意图
                context.startActivity(intent);
            }
        });
        return convertView;
    }

    //内部类   ViewHolder记录单个条目中所有属性
    class ViewHolder{
        public TextView tv_name,tv_phone;
        public Button btn_call,btn_sms;

    }
}

5.MainActivity.java

package com.example.domxml;

import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

import com.example.adapter.UserAdapter;

import android.app.Activity;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.TextView;

public class MainActivity extends Activity {

    // 声明控件对象 视图V
    private ListView lv_users;
    // 集合
    private List<Map<String, Object>> data = new ArrayList<Map<String, Object>>();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        // 获取控件对象
        lv_users = (ListView) findViewById(R.id.lv_users); // 视图 jsp html

        try {
            // dom解析 users.xml asserts目录中
            domParser();

            /*
             * context 上下文 data list集合 resource 资源布局文件
             * android.R.layout.simple_list_item_2 text1 text2
             * 
             * from map集合中的key是String ids names
             * 
             * to ids显示在布局文件中对应text2 names显示对应text1
             */

            // 适配器 控制层 C
            ListAdapter adapter = new UserAdapter(this, data);
            // 设置适配器
            lv_users.setAdapter(adapter);

            // 思考 点击具体的一个条目
            lv_users.setOnItemClickListener(new OnItemClickListener() {

                @Override
                public void onItemClick(AdapterView<?> parent, View view,
                        int position, long id) {

                    //获取view控件中的控件  包括用户名控件 电话的控件
                    TextView tv_name = (TextView) view.findViewById( R.id.tv_name);
                    TextView tv_phone = (TextView) view.findViewById( R.id.tv_phone);
                    //获取用户名称
                    String name = tv_name.getText().toString();
                    //获取用户电话
                    String phone = tv_phone.getText().toString();
                    //执行打电话
                    //1.定义打电话的意图对象
                    Intent intent = new Intent(Intent.ACTION_CALL, Uri.parse("tel:"+phone));
                    //2.执行意图
                    startActivity(intent);
                    //3.记得添加打电话的权限  在项目清单中添加
                }
            });

        } catch (ParserConfigurationException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (SAXException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    /**
     * 解析方法
     * 
     * @throws ParserConfigurationException
     * @throws IOException
     * @throws SAXException
     */
    private void domParser() throws ParserConfigurationException, IOException,
            SAXException {
        // 1.创建DocumentBuilderFactory对象
        DocumentBuilderFactory builderFactory = DocumentBuilderFactory
                .newInstance();
        // 2.通过工厂对象获取DocumentBuilder
        DocumentBuilder builder = builderFactory.newDocumentBuilder();
        //
        // 3 获取要解析的xml文件 对应的输入流
        InputStream is = getAssets().open("users.xml");

        // 4.利用DocumentBuilder的parse方法获取解析的users.xml的document对象
        Document document = builder.parse(is);

        // 5.处理解析
        // 1.获取文档的跟节点 users
        Element root = document.getDocumentElement();
        // 2.获取当前根节点下面所有user节点的集合
        NodeList nodeList = root.getElementsByTagName("user");

        // 遍历孩子节点
        for (int i = 0; i < nodeList.getLength(); i++) {
            // 获取具体的孩子节点
            Node node = nodeList.item(i); // user
            // 创建map对象
            Map<String, Object> map = new HashMap<String, Object>();

            // 获取user节点的所有孩子节点 id name
            NodeList nlist = node.getChildNodes();

            // 遍历孩子节点
            for (int index = 0; index < nlist.getLength(); index++) {
                // 获取具体的孩子节点
                Node n = nlist.item(index);
                // 判断该节点的名称是否是id
                if (n.getNodeName().equals("id")) {
                    // 设置user的id值
                    map.put("ids", n.getTextContent());
                    // 判断该节点的名称是否是name
                } else if (n.getNodeName().equals("name")) {
                    // 设置name值
                    map.put("names", n.getTextContent());
                } else if (n.getNodeName().equals("phone")) {
                    map.put("phone", n.getTextContent());
                }
            }
            // 添加到集合中
            data.add(map);

        }

    }

}

6.该案例集成了发短信的功能
SmsActivity.java

package com.example.domxml;

import java.util.List;

import android.app.Activity;
import android.os.Bundle;
import android.telephony.SmsManager;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

public class SmsActivity extends Activity {

    private Button sendBtn;
    private EditText etphone,etsms;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_sms);

        // 获取点击发送按钮的控件对象
        sendBtn = (Button) findViewById(R.id.sendBtn);
        //获取电话号码的控件对象
        etphone=(EditText) findViewById(R.id.etphone);
        //获取要发送信息的控件对象
        etsms = (EditText) findViewById(R.id.etsms);

        //获取这个数据
        String phone = getIntent().getStringExtra("phone");
        etphone.setText(phone);
        Toast.makeText(this, "给这个家伙发短信"+phone, 1).show();

        // 注册按钮的点击事件
        sendBtn.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {   
                //1.获取电话号码及发送的短信内容
                String phone = etphone.getText().toString();
                String content = etsms.getText().toString();
                //2.发短信的管理器对象
                SmsManager smsManager = SmsManager.getDefault();
                //3.拆分短信内容
                List<String> list = smsManager.divideMessage(content);
                //4.遍历发送信息
                for(String sms:list){
                    //5.逐条发送短信
                    smsManager.sendTextMessage(phone, null, sms, null, null);
                }

                //5.提示短信发送成功
                Toast.makeText(SmsActivity.this, "发短信成功", Toast.LENGTH_LONG).show();
            }
        });

    }
}

Activity_sms.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="${relativePackage}.${activityClass}" >

    <TextView
        android:id="@+id/tvphone"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@string/tip_phone" />

    <EditText
        android:id="@+id/etphone"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@+id/tvphone"
        android:inputType="phone" />

    <TextView
        android:id="@+id/tvsms"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@+id/etphone"
        android:text="@string/tip_sms" />

    <!-- 作业思考 怎么实现自动换行的效果 -->
    <EditText
        android:id="@+id/etsms"
        android:layout_width="match_parent"
        android:layout_height="100dp"
        android:gravity="top"
        android:layout_below="@+id/tvsms"
        android:lines="5"
         />

    <Button
        android:id="@+id/sendBtn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@id/etsms"
        android:text="@string/tip_send" />

</RelativeLayout>


7.运行效果:

点击每一个item将拨打对应条目的号码,点击发短信按钮将给对应号码发短信。
如何解决它们之间的冲突?

标签: android

热门推荐