首先还是xml布局文件,在其中添加ListVIEw控件:
主布局layout_main.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"
androID:paddingBottom="@dimen/activity_vertical_margin"
androID:paddingleft="@dimen/activity_horizontal_margin"
androID:paddingRight="@dimen/activity_horizontal_margin"
androID:paddingtop="@dimen/activity_vertical_margin"
androID:background="#00aaff"
tools:context=".MainActivity" >
<TextVIEw
androID:ID="@+ID/myText"
androID:layout_wIDth="wrap_content"
androID:layout_height="wrap_content"
androID:text="联系人"
androID:textSize="7pt"
androID:layout_centerHorizontal="true"
androID:textcolor="#ffffff"
androID:textStyle="bold" />
<ListVIEw
androID:ID="@+ID/qq_List"
androID:layout_wIDth="match_parent"
androID:layout_height="match_parent"
androID:layout_below="@ID/myText"/>
</relativeLayout>
然后是每一行ListItem的布局,采用linerLayout布局,一些注意的点都在里面:
复制代码 代码如下:
<?xml version="1.0" enCoding="utf-8"?>
<relativeLayout xmlns:androID="http://schemas.androID.com/apk/res/androID"
androID:layout_wIDth="match_parent"
androID:layout_height="wrap_content"
androID:background="#efefef" >
<!-- linerLayout有比较奇怪的性质:当布局中的控件可以超出布局规定的大小,所以这里一行的行宽改成由内部的几个控件
控制,而linerLayout的layout_height改成wrap_content .. -->
<Imagebutton
androID:ID="@+ID/ct_photo"
androID:layout_height="70dip"
androID:layout_wIDth="70dip"
androID:layout_margin="5dip"
androID:background="@drawable/contact_0"/>
<TextVIEw
androID:ID="@+ID/ct_name"
androID:layout_wIDth="wrap_content"
androID:layout_height="wrap_content"
androID:padding="5dip"
androID:layout_toRightOf="@ID/ct_photo"
androID:layout_aligntop="@ID/ct_photo"
androID:text="为你我受冷风吹"
androID:textSize="8pt"
androID:textStyle="bold"
androID:maxLength="7"/>
<TextVIEw
androID:ID="@+ID/ct_sign"
androID:layout_wIDth="wrap_content"
androID:layout_height="wrap_content"
androID:padding="5dip"
androID:layout_toRightOf="@ID/ct_photo"
androID:layout_alignBottom="@ID/ct_photo"
androID:text="为什么受伤的总是我"
androID:textcolor="#888888"/>
<!-- 注意不是layout_padding -->
</relativeLayout>
因为这里使用的是自己定义的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<HashMap<String,Object>> 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<HashMap<String,Object>> 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<HashMap<String,Object>> List=null;
HashMap<String,Object> 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<HashMap<String,Object>>();
for(int i=0; i<4; i++){
map=new HashMap<String,Object>(); //map调用put方法添加键值对
map.put("userPhoto",getResources().getDrawable(photoRes[i]));
map.put("username",strname[i]);
map.put("userSign",strSign[i]);
List.add(map);
}
//创建自定义的MyAdapter对象
MyAdapter adapter=new MyAdapter(this,R.layout.List_item,List,from,to);
//调用ListVIEw的setAdapter()方法设置适配器
ListVIEw.setAdapter(adapter);
}
@OverrIDe
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main,menu);
return true;
}
}
@H_403_309@
这几个头像是我自己下载的图片,其对应的资源地址在 MainActivity中用一个 photoRes数组表示的~
总结以上是内存溢出为你收集整理的android开发教程之使用listview显示qq联系人列表全部内容,希望文章能够帮你解决android开发教程之使用listview显示qq联系人列表所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)