首页 > 学院 > 开发设计 > 正文

Intnet Bundle以及ListView的学习

2019-11-07 23:01:15
字体:
来源:转载
供稿:网友

这次做的是一个简单的通讯录,有两个页面,第一个页面呈现联系人,第二个页面是显示联系人的详细信息。

先上两张效果图:

  

可以进行的操作大家可以下载来试一下,功能不是很多,但是对于入门Android的童鞋来说还是比较有意思的。

下面讲一下技术要点:

对于ListView来说,他的布局是很简单的:

    <ListView        android:id="@+id/lv"        android:layout_width="match_parent"        android:layout_height="match_parent"/> 要注意的是这个id是一定要是设的,因为后面需要在.java文件中填充数据。

在.java文件中获得这个ListView之后,使用Adapter为这个ListView填充数据,常用的Adapter有ArrayAdapter,SimpleAdapter,随着ListView中内容的丰富,以上两种Adapter已经很难满足需要,因此现在一般使用自定义的Adapter来填充数据。

在这个应用中,我是用了自定义的Adapter以及SimpleAdapter。

对于SimpleAdapter,,创建SimpleAdapter需要5个参数,第一个参数依然是Context,就不多说了,下面介绍余下的4个参数:第2个参数:该参数应该是一个List<? Extends Map<String, ?>>类型的集合对象,该集合中每个Map<String, ?>对象生成一个列表项。第3个参数:该参数指定一个界面布局的ID。该界面布局指定每一个列表项的样式。第4个参数:该参数应该是一个String[]类型的参数,该参数决定提取Map<String, ?>对象中哪些key对应的value来生成列表项。第5个参数:该参数应该是一个int[]类型的参数,该参数决定填充哪些组件

    public void More_PRocess() {        String[] op = {"编辑联系人", "分享联系人", "加入黑名单", "删除联系人"};        // 使用SimpleAdapter填充数据        List<Map<String, Object>> mapList = new ArrayList<>();        for (int i = 0; i < op.length; i++) {            Map<String, Object> temp = new LinkedHashMap<>();            temp.put("op", op[i]);            mapList.add(temp);        }        SimpleAdapter simpleAdapter = new SimpleAdapter(this, mapList, R.layout.more,                new String[]{"op"}, new int[]{R.id.more_to_do});        item_list.setAdapter(simpleAdapter);    }

这一个Adapter我用来填充联系人详情页面中的下面的一些东西。

对于listView的长按和点击事件的处理这里就不多说了,这里实现的功能是点击之后跳转到联系人详情页面,长按会弹出对话框提示是否删除这个联系人。

需要注意的是长按的事件处理是有返回值的,默认是false,但是这样的话是不能区分长按和点击的,在我测试的过程中体现出来就是长按之后会弹出对话框,但是也实现了单击的跳转功能,改成true之后就正常了。

下面主要介绍一下自定义的Adapter,直接上代码:

public class MyAdapter extends BaseAdapter {    private Context context;    private List<Information> list;    public MyAdapter(Context context, List<Information> list) {        this.context = context;        this.list = list;    }    @Override    // 获取数据项列表的长度,也就是一共有多少个数据项    public int getCount() {        if (list == null) return 0;        else return list.size();    }    @Override    // 获得某一个数据项    public Object getItem(int i) {        if (list == null) return null;        else return list.get(i);    }    @Override    // 获得数据项的布局样式,    public long getItemId(int i) {        return i;    }    @Override    public View getView(int i, View view, ViewGroup viewGroup) {        // 新声明一个View变量和ViewHolder变量        View convertView;        ViewHolder viewHolder;        // 当View为空时才加载布局,并且创建一个ViewHolder,获得布局中的两个控件        if (view == null) {            // 通过inflate方法加载布局,context这个参数需要使用这个adapter的Activity传入            convertView = LayoutInflater.from(context).inflate(R.layout.item, null);            viewHolder = new ViewHolder();            viewHolder.first_name = (TextView) convertView.findViewById(R.id.first_name);            viewHolder.name = (TextView) convertView.findViewById(R.id.name);            // setTag方法是将处理好的viewHolder放入view中            convertView.setTag(viewHolder);        } else { // 否则,让convertView等于view, 然后从中取出ViewHolder即可            convertView = view;            viewHolder = (ViewHolder) convertView.getTag();        }        // 从ViewHolder中取出对象,然后负责给他们        viewHolder.first_name.setText(list.get(i).getFirst_name());        viewHolder.name.setText(list.get(i).getName());        return convertView;    }    private class ViewHolder {        public TextView first_name;        public TextView name;    }}

自定义的Adapter需要提供一个数据列表才能填充数据,一般是一个List类型,在这里我是创建了一个information类,然后将List<Information>传入Adapter中作为数据的列表。

注意这个Information类,因为点击联系人页面之后,跳转的联系人详情页面中不出bug的话是要显示详情的,这些详情哪里来呢,当然是从main_activity中传过去啦!所以为了在两个activity之间传递信息,使用bundle来实现。这个Information类就需要实现serializable.

传递和接收是这样的:

                Intent intent = new Intent(MainActivity.this, Particulars.class);                Bundle bundle = new Bundle();                bundle.putSerializable("information", list.get(i));                intent.putExtras(bundle);                startActivity(intent);
Information information = (Information) this.getIntent().getSerializableExtra("information");有兴趣的童鞋可以下载源码来玩一下:

       点击下载源码


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表