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

来源:互联网 发布:网络安全技术高峰论坛 编辑:程序博客网 时间:2024/06/01 09:37

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将拨打对应条目的号码,点击发短信按钮将给对应号码发短信。
如何解决它们之间的冲突?
这里写图片描述

3 0
原创粉丝点击