当前位置:  编程技术>移动开发

android开发教程之使用listview显示qq联系人列表

    来源: 互联网  发布时间:2014-10-23

    本文导语:  首先还是xml布局文件,在其中添加ListView控件: 主布局layout_main.xml 代码如下:         然后是每一行ListItem的布局,采用LinerLayout布局,一些注意的点都在里面: 代码如下:                           因为这里使用...

首先还是xml布局文件,在其中添加ListView控件:

主布局layout_main.xml

代码如下:

   
   

然后是每一行ListItem的布局,采用LinerLayout布局,一些注意的点都在里面:

代码如下:


   
   
   
      
   
   

因为这里使用的是自己定义的MyAdapter类,可以更灵活的实现列表的一些功能,比如和数据库相联系,动态更新数据、添加按钮控件等等,在本例中模仿QQ列表为头像设置成了ImageButton,后面的附图中的一个Toast信息就是点击图像做出的相应,当然点击一行也可以做出相应,这个后续可能会对QQ程序做一些扩展,如增加网络模块,聊天窗口等等。到时候再进一步讨论。

下面是MyAdapter类,这个类最好和MainActivity类放在同一个包里。

代码如下:

package com.example.android_qqlist;

import java.util.*;

import android.annotation.SuppressLint;
import android.content.Context;
import android.graphics.drawable.Drawable;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.*;

public class MyAdapter extends BaseAdapter{
    private Context context=null;
    private int resources;
    private ArrayList list=null;
    private String[] from;
    private int[] to;   
    /**
     * 这里仿照的是SimpleAdapter的形参列表
     * @param context
     * @param Resources
     * @param list
     * @param from
     * @param to
     */

    public MyAdapter(Context context, int resources,
            ArrayList list, String[] from, int[] to) {
        super();
        this.context = context;
        this.resources = resources;
        this.list = list;
        this.from = from;
        this.to = to;
    }

    /**
     * 剩下的问题就是依次实现BaseAdapter的这几个类方法就可以了
     */

    @Override
    public int getCount() {        //这个方法返回的是ListView的行数
        // TODO Auto-generated method stub
        return list.size();
    }
    @Override
    public Object getItem(int arg0) {      //这个方法没必要使用,可以用getItemId代替
        // TODO Auto-generated method stub
        return null;
    }
    @Override
    public long getItemId(int itemId) {     //点击某一行时会调用该方法,其形参由安卓系统提供
        // TODO Auto-generated method stub
        return itemId;
    }
    /**
     * getView方法为系统在绘制每一行时调用,在此方法中要设置需要显示的文字,图片,
     * 以及为按钮设置监听器。
     *
     * 形参意义:
     * position:当前绘制的item 的位置(ID);
     * convertView,系统在绘制ListView时,如果是绘制第一个Item(即第一行),convertView为null,当
     * 绘制第二个及以后的Item的convertView不为空,这时可以直接利用这个convertView的getTag()方法,获得各控件
     * 的实例,并进行相应的设置,这样可以加快绘图速度。
     *
     * 为了为convertView设置附加信息Tag,这里创建一个内部类ViewHolder,用于盛放一行中所有控件的引用,将这些引用
     * 实例化后作为convertView的附加信息。
     */
    class ViewHolder{
        public ImageButton ctPhoto=null;
        public TextView ctName=null,ctSign=null;

        /*
         * 从这里可以看出,from和to数组彼此之间的元素应该一一对应,同时from和to各自元素内部的顺序不同,最后ListView
         * 呈现的位置也会不同!
         */
        public ViewHolder(View convertView){
            ctPhoto=(ImageButton)convertView.findViewById(to[0]);   
            /*注意View和Activity都属于容器类,都需要设置布局文件,内部都含有子控件,且都有findViewById()
             * 他们之间没有明显的继承关系
             */
            ctName=(TextView)convertView.findViewById(to[1]);
            ctSign=(TextView)convertView.findViewById(to[2]);

        }

    }   
    class ImageListener implements OnClickListener{

        private int position;

        public ImageListener(int position){
            this.position=position;
        }                          //构造函数没有返回值

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            String str=list.get(position).get(from[1]).toString();
            Toast.makeText(context,str+" is Clicked" , Toast.LENGTH_LONG).show();

        }

    }
    @Override
    public View getView(int position, View convertView, ViewGroup arg2) {
        // TODO Auto-generated method stub

        /**
         * 首先判断是不是第一次创建Item,若是,则创建convertView实例和ViewHolder对象,并通过fandViewById()方法
         * 获得每一行中所有空间的实例放在ViewHolder对象中,然后对convertView设置标签
         */
        ViewHolder viewHolder=null;

        //注意convertView不是随意创建的,需要有LayoutInflater,根据list_item布局文件创建
        if(convertView==null){
            LayoutInflater inflater=LayoutInflater.from(context);
            convertView=inflater.inflate(resources,null);    //这里的null是一个ViewGroup形参,基本用不上
            viewHolder=new ViewHolder(convertView);
            convertView.setTag(viewHolder);        
        }
        else{
            viewHolder=(ViewHolder)convertView.getTag();    //通过getTag()方法获得附加信息
        }
        /**
         * 这里对viewHolder中的各个控件进行相应的设置
         */
        /**
         * @author DragonGN
         * 这里出现了一个问题:在绘制当前行的ListItem时,只需要对当前行的控件进行设置,因此这里不能加一个for
         * 循环对每一个list中的每一个元素进行遍历,而应该根据当前创建的ListItem行的position,然后
         * 访问数据库list中相应位置的Map的数据,进行控件的设置!
         */
        /**
         * 注意这里必须是setBackgroundDrawable() 而不是setBackground(),后者会报错,尽管前者过期了但一样可用
         */
            viewHolder.ctPhoto.setBackgroundDrawable((Drawable)(list.get(position).get(from[0])));
            //Map中要添加一个Drawable对象,这里的from和to中的元素应该一一对应,其顺序也应该对应ViewHolder构造方法中控件的调用的顺序

            viewHolder.ctName.setText((String)(list.get(position).get(from[1])));
            viewHolder.ctSign.setText((String)(list.get(position).get(from[2])));   
            viewHolder.ctPhoto.setOnClickListener(new ImageListener(position));      
        return convertView;     //把这个每一行的View对象返回
    }
}

最后就是MainActivity类了,与因为MyAdapter的封装方式与SimpleAdpter是一样额,因此这里MainActivity的操作基本不变。

代码如下:

package com.example.android_qqlist;

import java.util.*;

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.widget.ListView;

public class MainActivity extends Activity {

    //每一列的列名/Map的键名  和其对应的View子控件的ID
    String[] from={"userPhoto","userName","userSign"};           //这里的内容对应后面HashMap中的键
    int[] to={R.id.ct_photo,R.id.ct_name,R.id.ct_sign};

    //整个ListView所显示的全部信息和资源数组
    int[] photoRes={R.drawable.contact_0,R.drawable.contact_1,R.drawable.contact_2,R.drawable.contact_3};
    String[] strName={"暗夜之殇","街角的幸福","静悄悄","愤怒的小胖"};
    String[] strSign={"Where is my love...","有些事终于想开了","总有一天会寻找到自己的幸福","谁再叫我小胖我跟谁急..."};

    //数据链表和Map容器
    ArrayList list=null;
    HashMap map=null;

    ListView listView=null;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        listView=(ListView)findViewById(R.id.qq_list);
        list=new ArrayList();    
        for(int i=0; i


    
 
 

您可能感兴趣的文章:

  • Android Horizontal ListView
  • android ListView的右边滚动滑块启用方法 分享
  • android ListView自动滚动方法
  • android listview 水平滚动和垂直滚动的小例子
  • 滑动刷新的ListView Android PullToRefresh
  • android中如果为listview的item添加listener,也能为item中的button添加listener
  • android中ListView多次刷新重复执行getView的解决方法
  • Android笔记之:在ScrollView中嵌套ListView的方法
  • android ListView 一些重要属性详解
  • Android用ListView显示SDCard文件列表的小例子
  • Android入门之ListView应用解析(一)
  • android表格效果之ListView隔行变色实现代码
  • Android入门之ListView应用解析(二) iis7站长之家
  • Android ListView 扩展 DragSortListView
  • android开发之横向滚动/竖向滚动的ListView(固定列头)
  • Android入门之ListView应用解析(二)
  • Android之ScrollView嵌套ListView和GridView冲突的解决方法
  • android开发教程之listview显示sqlite数据
  • android开发教程之listview使用方法
  • Android在listview添加checkbox实现原理与代码
  • Android根据电话号码获得联系人头像实例代码
  • android2.2平台删除联系人失败
  • android获取联系人示例分享
  • Android实现新增及编辑联系人的方法
  • Android Mms之:对话与联系人关联的总结详解
  • Android Mms之:联系人管理的应用分析
  • Android系统联系人全特效实现(上)分组导航和挤压动画(附源码)
  • android 加载本地联系人实现方法
  • Android之联系人PinnedHeaderListView使用介绍
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 申请Android Map 的API Key(v2)的最新申请方式(SHA1密钥)
  • Android瀑布流实例 android_waterfall
  • Android开发需要的几点注意事项总结
  • Android系统自带样式 (android:theme)
  • android 4.0 托管进程介绍及优先级和回收机制
  • Android网络共享软件 Android Wifi Tether
  • Android访问与手机通讯相关类的介绍
  • Android 图标库 Android GraphView
  • Android及andriod无线网络Wifi开发的几点注意事项
  • 轻量级Android开发工具 Android Tools
  • Android 2.3 下StrictMode介绍
  • Android 开发环境 Android Studio
  • IDEA的Android开发插件 idea-android
  • Android手机事件提醒 Android Notifier
  • XBMC的Android客户端 android-xbmcremote
  • Android小游戏 Android Shapes
  • Android电池监控 Android Battery Dog
  • android开发:“android:WindowTitle”没有对应项no resource
  • Android 上类似IOS 的开关控件。 Android ToggleButton
  • Android 将 android view 的位置设为右下角的解决方法
  • Android 2D游戏引擎 Android Angle




  • 特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3