实例介绍
【实例截图】
【核心代码】
package com.example.android_qqfix;
import android.location.Location;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.view.DragEvent;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnDragListener;
import android.view.View.OnTouchListener;
import android.view.ViewGroup;
import android.view.View.OnClickListener;
import android.view.ViewGroup.LayoutParams;
import android.view.Window;
import android.view.WindowManager;
import android.widget.AbsListView;
import android.widget.AbsListView.OnScrollListener;
import android.widget.BaseAdapter;
import android.widget.BaseExpandableListAdapter;
import android.widget.ExpandableListAdapter;
import android.widget.ExpandableListView;
import android.widget.ExpandableListView.OnChildClickListener;
import android.widget.ExpandableListView.OnGroupClickListener;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.ScrollView;
import android.widget.TextView;
import android.widget.Toast;
import java.util.*;
import com.dragon.persondata.ContactsInfo;
public class ContactsListExpandable extends Activity {
private int height=0;
private int GROUP_HEIGHT=0;
private int CHILD_HEIGHT=52;
private int VISIBILITY_GONE=0;
private int VISIBILITY_VISIBLE=1;
int[] photoRes={R.drawable.contact_0,R.drawable.contact_1,R.drawable.contact_2,R.drawable.contact_3};
String[] groupFrom={"groupImage","groupName","childCount"};
int[] groupTo={R.id.groupImage,R.id.groupName,R.id.childCount};
String[] childFrom={"userImage","userName","userSign"};
int[] childTo={R.id.ct_photo,R.id.ct_name,R.id.ct_sign};
ArrayList<HashMap<String,Object>> groupData=null;
ArrayList<ArrayList<HashMap<String,Object>>> childData=null;
ArrayList<HashMap<String,Object>> groupItenformation=null; //用于存放groupItem的相对位置
int[] groupIndicator={R.drawable.toright,R.drawable.todown};
ExpandableListView exListView=null;
ListView listViewTop=null,listViewDown=null;
ScrollView qqScroll=null;
LinearLayout titleGroupView=null;
ImageView titleImage=null;
TextView titleGroupName=null;
TextView titleChildCount=null;
MyExpandableListViewAdapter adapter=null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.layout_qqlist_expandable);
groupData=new ArrayList<HashMap<String,Object>>();
childData=new ArrayList<ArrayList<HashMap<String,Object>>> ();
//创建groupLocation对象
//groupItemInformation=new ArrayList<HashMap<String,Object>>();
ContactsInfo user1=new ContactsInfo("暗夜之殇","总有一天会寻找到自己的幸福",R.drawable.contact_0,"我的好友");
ContactsInfo user2=new ContactsInfo("街角的幸福","有些事终于想开了",R.drawable.contact_1,"我的好友");
ContactsInfo user3=new ContactsInfo("愤怒的小胖","谁再叫我小胖我跟谁急!",R.drawable.contact_3,"朋友");
ContactsInfo user4=new ContactsInfo("放羊的星星","What ever",R.drawable.contact_2,"陌生人");
ContactsInfo user5=new ContactsInfo("都市丽人","我要我的完美",R.drawable.contact_4,"我的好友");
addUser(user1);
addUser(user2);
addUser(user3);
addUser(user4);
addUser(user5);
addUser(user1);
addUser(user2);
addUser(user3);
addUser(user4);
addUser(user5);
addUser(user3);
addUser(user4);
addUser(user5);
addUser(user3);
addUser(user4);
addUser(user5);
//不能用HashMap的实参赋给Map形参,只能new一个HashMap对象赋给Map的引用!
exListView=(ExpandableListView)findViewById(R.id.qq_list);
adapter=new MyExpandableListViewAdapter(this,groupData,R.layout.layout_qqlist_group,groupFrom,groupTo,childData,R.layout.layout_qqlist_child,childFrom,childTo );
exListView.setAdapter(adapter);
exListView.setGroupIndicator(null);
exListView.setOnChildClickListener(new OnChildClickListener() {
@Override
public boolean onChildClick(ExpandableListView parent, View v,
int groupPosition, int childPosition, long id) {
// TODO Auto-generated method stub
System.out.println("I am clicked!!!");
Intent intent=new Intent();
intent.setClass(ContactsListExpandable.this, ChatActivity.class);
ContactsListExpandable.this.startActivity(intent);
return false;
}
});
qqScroll=(ScrollView)findViewById(R.id.qqlist_scroll);
View exGroupListItem= exListView.getExpandableListAdapter().getGroupView(0,false, null, exListView );
exGroupListItem.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
exGroupListItem.measure(0, 0);
GROUP_HEIGHT=exGroupListItem.getMeasuredHeight();
View exChildListItem=exListView.getExpandableListAdapter().getChildView(0, 0, false, null, exListView);
exChildListItem.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT));
exChildListItem.measure(0, 0);
CHILD_HEIGHT=exChildListItem.getMeasuredHeight();
ViewGroup.LayoutParams params= exListView.getLayoutParams();
height=groupData.size()*GROUP_HEIGHT-2;
params.height=height;
exListView.setLayoutParams(params);
for(int i=0; i<groupData.size() ;i ){
groupData.get(i).put("location",i*GROUP_HEIGHT);
}
/*
for(int i=0; i<childData.size(); i ){
HashMap<String,Object> map1=new HashMap<String,Object>();
HashMap<String,Object> map2=new HashMap<String,Object>();
map1.put("location", i*GROUP_HEIGHT);
map1.put("expanded", false);
groupItemInformation.add(map1);
}
*/
listViewTop=(ListView)findViewById(R.id.qqlist_classify);
ArrayList<HashMap<String,Object>> listTop=new ArrayList<HashMap<String,Object>>();
HashMap<String,Object> mapTop1=new HashMap<String,Object>();
HashMap<String,Object> mapTop2=new HashMap<String,Object>();
HashMap<String,Object> mapTop3=new HashMap<String,Object>();
mapTop1.put("listTopImage",R.drawable.address_list);
mapTop1.put("listTopText", "通讯录");
mapTop2.put("listTopImage",R.drawable.chat_flock);
mapTop2.put("listTopText", "群");
mapTop3.put("listTopImage",R.drawable.forum);
mapTop3.put("listTopText", "讨论组");
listTop.add(mapTop1);
listTop.add(mapTop2);
listTop.add(mapTop3);
MyListViewAdapter adapterTop=new MyListViewAdapter(this, listTop,
R.layout.qqlist_classify_item, new String[]{"listTopImage","listTopText"}, new int[]{R.id.qqlist_classify_image,R.id.qqlist_classify_name});
listViewTop.setAdapter(adapterTop);
ViewGroup.LayoutParams paramsTop=listViewTop.getLayoutParams();
View listItem=listViewTop.getAdapter().getView(0, null, listViewTop);
listItem.measure(0, 0);
paramsTop.height=3*listItem.getMeasuredHeight()-2;
//ListView属于一种ViewGroup类型
listViewTop.setLayoutParams(paramsTop);
/**
* 创建一个String数组对象不能直接写String[]{} 必须在前面加上new,即写成 new String[]{"listTopImage","listTopText"}
*
*/
listViewDown=(ListView)findViewById(R.id.qqlist_classify_down);
ArrayList<HashMap<String,Object>> listDown=new ArrayList<HashMap<String,Object>>();
HashMap<String,Object> mapDown1=new HashMap<String,Object>();
mapDown1.put("listTopImage",R.drawable.life_service);
mapDown1.put("listTopText", "生活服务");
listDown.add(mapDown1);
listTop.add(mapTop3);
MyListViewAdapter adapterDown=new MyListViewAdapter(this, listDown,
R.layout.qqlist_classify_item, new String[]{"listTopImage","listTopText"}, new int[]{R.id.qqlist_classify_image,R.id.qqlist_classify_name});
listViewDown.setAdapter(adapterDown);
titleGroupView=(LinearLayout)findViewById(R.id.titleGroupView);
titleGroupName=(TextView)findViewById(R.id.title_groupName);
titleChildCount=(TextView)findViewById(R.id.title_childCount);
titleGroupView.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
int groupPosition=(Integer)titleGroupView.getTag();
exListView.collapseGroup(groupPosition);
new LocationCheckThread().start();
}
});
qqScroll.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
// TODO Auto-generated method stub
if(event.getAction()==MotionEvent.ACTION_MOVE && isChecking==false){
new LocationCheckThread().start();
}
return false;
}
});
}
/**
* 实现这个Activity的最后一个效果,即滑动到某一个Group那么改GroupItem就在屏幕顶端悬停的效果
* 方法:需要使用onTouchEvent方法,这个比用onScrollView方法靠谱
*/
private boolean isChecking=false;
private class LocationCheckThread extends Thread{
@Override
public void run() {
// TODO Auto-generated method stub
super.run();
isChecking=true;
int[] location=new int[2];
int beforeY=0;
int i;
ExpandableHandler mHandler=new ExpandableHandler(Looper.getMainLooper());
while(true){
//exListView.getLocationOnScreen(location);
exListView.getLocationOnScreen(location);
if(beforeY==location[1]){ //控件停止运动,线程关闭
isChecking=false;
return;
}
else{
beforeY=location[1];
for(i=groupData.size()-1; i>=0; i--){
if((Boolean)groupData.get(i).get("expanded")&&(Integer)groupData.get(i).get("location") location[1]<=24){
Message msg=new Message();
msg.arg1=childData.get(i).size();
msg.arg2=i;
msg.obj=groupData.get(i).get("groupName");
msg.what=VISIBILITY_VISIBLE;
mHandler.sendMessage(msg);
break;
}
}
if(i<0){
Message msg=new Message();
msg.what=VISIBILITY_GONE;
msg.obj=""; //必须加这一步,否则会有空指针异常
mHandler.sendMessage(msg);
}
}
try {
this.sleep(80); //sleep的时间不能过短!!
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
public class ExpandableHandler extends Handler{
public ExpandableHandler(Looper looper){
super(looper);
}
@Override
public void handleMessage(Message msg) {
// TODO Auto-generated method stub
super.handleMessage(msg);
int listNum=msg.arg1;
int visibility=msg.what;
int groupPos=msg.arg2;
String groupName=msg.obj.toString();
if(visibility==VISIBILITY_GONE){
titleGroupView.setVisibility(View.GONE);
return;
}
else{
titleGroupView.setVisibility(View.VISIBLE);
titleGroupName.setText(groupName);
titleChildCount.setText("" listNum);
titleGroupView.setTag(groupPos); //给这个View控件设置一个标签属性,用于存放groupPosition
/**
* setText()中的参数不能使int型!!
*/
}
}
}
protected void addUser(ContactsInfo user)
{
int i;
for(i=0; i< groupData.size(); i ){
if(groupData.get(i).get("groupName").toString().equals(user.groupInfo)){
break;
}
}
if(i>=groupData.size()){
HashMap<String,Object> map=new HashMap<String,Object>();
map.put("groupImage", groupIndicator);
map.put("groupName",user.groupInfo );
map.put("childCount", 0);
groupData.add(map);
ArrayList<HashMap<String,Object>> list=new ArrayList<HashMap<String,Object>>();
childData.add(list);
}
HashMap<String,Object> userData=new HashMap<String,Object>();
userData.put("userImage",user.userImage );
userData.put("userName", user.userName);
userData.put("userSign", user.userSign);
childData.get(i).add(userData);
Integer count=(Integer)groupData.get(i).get("childCount") 1;
groupData.get(i).put("childCount", count);
groupData.get(i).put("expanded", false);
}
/**
* ExpandableListView对应的适配器
* @author DragonGN
*
*/
public class MyExpandableListViewAdapter extends BaseExpandableListAdapter{
private Context context=null;
private ArrayList<HashMap<String,Object>> groupData=null;
int groupLayout=0;
private String[] groupFrom=null;
private int[] groupTo=null;
private ArrayList<ArrayList<HashMap<String,Object>>> childData=null;
int childLayout=0;
private String[] childFrom=null;
private int[] childTo=null;
public MyExpandableListViewAdapter(Context context, ArrayList<HashMap<String, Object>> groupData,
int groupLayout, String[] groupFrom, int[] groupTo,
ArrayList<ArrayList<HashMap<String, Object>>> childData, int childLayout,
String[] childFrom, int[] childTo) {
super();
this.context = context;
this.groupData = groupData;
this.groupLayout = groupLayout;
this.groupFrom = groupFrom;
this.groupTo = groupTo;
this.childData = childData;
this.childLayout = childLayout;
this.childFrom = childFrom;
this.childTo = childTo;
}
@Override
public Object getChild(int arg0, int arg1) {
// TODO Auto-generated method stub
return null;
}
/**
* position与id一样,都是从0开始计数的,
* 这里返回的id也是从0开始计数的
*/
@Override
public long getChildId(int groupPosition, int childPosition) {
// TODO Auto-generated method stub
long id=0;
for(int i=0;i<groupPosition; i ){
id =childData.size();
}
id =childPosition;
return id;
}
/**ChildViewHolder内部类**/
class ChildViewHolder{
ImageButton userImage=null;
TextView userName=null;
TextView userSign=null;
}
/**头像点击事件监听类**/
class ImageClickListener implements OnClickListener{
ChildViewHolder holder=null;
public ImageClickListener(ChildViewHolder holder){
this.holder=holder;
}
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Toast.makeText(context, holder.userName.getText() " is clicked", Toast.LENGTH_SHORT).show();
}
}
@Override
public View getChildView(int groupPosition, int childPosition,
boolean isLastChild, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
/**
* 这里isLastChild目前没用到,如果出现异常再说
*/
ChildViewHolder holder=null;
if(convertView==null){
convertView= LayoutInflater.from(context).inflate(childLayout,null);
//感觉这里需要把root设置成ViewGroup 对象
/**
* ERROR!!这里不能把null换成parent,否则会出现异常退出,原因不太确定,可能是inflate方法获得的这个item的View
* 并不属于某个控件组,所以使用默认值null即可
*/
holder=new ChildViewHolder();
holder.userImage=(ImageButton)convertView.findViewById(childTo[0]);
holder.userName=(TextView)convertView.findViewById(childTo[1]);
holder.userSign=(TextView)convertView.findViewById(childTo[2]);
convertView.setTag(holder);
}
else{
holder=(ChildViewHolder)convertView.getTag();
}
holder.userImage.setBackgroundResource((Integer)(childData.get(groupPosition).get(childPosition).get(childFrom[0])));
holder.userName.setText(childData.get(groupPosition).get(childPosition).get(childFrom[1]).toString());
holder.userSign.setText(childData.get(groupPosition).get(childPosition).get(childFrom[2]).toString());
holder.userImage.setOnClickListener(new ImageClickListener(holder));
return convertView;
}
@Override
public int getChildrenCount(int groupPosition) {
// TODO Auto-generated method stub
return childData.get(groupPosition).size();
}
@Override
public Object getGroup(int groupPosition) {
// TODO Auto-generated method stub
return null;
}
@Override
public int getGroupCount() {
// TODO Auto-generated method stub
return groupData.size();
}
@Override
public long getGroupId(int groupPosition) {
// TODO Auto-generated method stub
return groupPosition;
}
class GroupViewHolder{
ImageView image=null;
TextView groupName=null;
TextView childCount=null;
}
@Override
public View getGroupView(int groupPosition, boolean isExpanded,
View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
GroupViewHolder holder=null;
if(convertView==null){
convertView=LayoutInflater.from(context).inflate(groupLayout, null);
holder=new GroupViewHolder();
holder.image=(ImageView)convertView.findViewById(groupTo[0]);
holder.groupName=(TextView)convertView.findViewById(groupTo[1]);
holder.childCount=(TextView)convertView.findViewById(groupTo[2]);
convertView.setTag(holder);
}
else{
holder=(GroupViewHolder)convertView.getTag();
}
int[] groupIndicator=(int[])groupData.get(groupPosition).get(groupFrom[0]);
holder.image.setBackgroundResource(groupIndicator[isExpanded?1:0]);
holder.groupName.setText(groupData.get(groupPosition).get(groupFrom[1]).toString());
holder.childCount.setText(groupData.get(groupPosition).get(groupFrom[2]).toString());
if(groupPosition==groupData.size()-1){
convertView.setBackgroundResource(R.drawable.list_lastitem_border);
}
else{
convertView.setBackgroundResource(R.drawable.list_item_border);
}
//else的情况也要考虑,否则在绘制时出现错位现象
/**
* 将刚刚创建的groupItem的相对坐标计算出来放在groupLocation中,这个是初始相对坐标
* 当点击打开一级菜单和关闭一级菜单时重新更新每一个group的相对坐标
*/
return convertView;
/**
* 不要在适配器中调用适配器的内部方法,不然会出现奇怪的异常
*
*/
}
@Override
public boolean hasStableIds() {
// TODO Auto-generated method stub
return false;
}
@Override
public boolean isChildSelectable(int groupPosition, int childPosition) {
// TODO Auto-generated method stub
return true;
}
/**
* 在设置ExpandableListView的宽度的时候,要注意每次点击展开或者关闭时,各个Group和所要显示的Item都会重绘
* 因此在每次绘制完毕之后都需要对height进行更新
*/
@Override
public void onGroupExpanded(int groupPosition) {
// TODO Auto-generated method stub
super.onGroupExpanded(groupPosition);
/**
* 更新groupItem的相对坐标
*/
groupData.get(groupPosition).put("expanded", true);
for(int i=groupPosition 1; i<groupData.size(); i ){
groupData.get(i).put("location",(Integer)groupData.get(i).get("location") childData.get(groupPosition).size()*CHILD_HEIGHT );
}
float deviationFix=0; //对ExpandableListView高度的误差修正
for(int i=0;i<groupData.size() ;i ){
deviationFix =(Integer)groupData.get(i).get("location")/CHILD_HEIGHT*0.5;
}
height =childData.get(groupPosition).size()*CHILD_HEIGHT;
ViewGroup.LayoutParams params= exListView.getLayoutParams();
params.height=height-floatToInt(deviationFix);
exListView.setLayoutParams(params);
}
@Override
public void onGroupCollapsed(int groupPosition) {
// TODO Auto-generated method stub
super.onGroupCollapsed(groupPosition);
height=height-childData.get(groupPosition).size()*CHILD_HEIGHT;
ViewGroup.LayoutParams params= exListView.getLayoutParams();
params.height=height;
exListView.setLayoutParams(params);
/**
* 更新groupItem的相对坐标
*/
groupData.get(groupPosition).put("expanded", false);
for(int i=groupPosition 1; i<groupData.size(); i ){
groupData.get(i).put("location",(Integer)groupData.get(i).get("location")-childData.get(groupPosition).size()*CHILD_HEIGHT );
}
}
private int floatToInt(double f){
if(f>0){
return (int)(f 0.5);
}
else{
return (int)(f-0.5);
}
}
}
/**
* 这个是ListView的适配器
* @author DragonGN
*
*/
public class MyListViewAdapter extends BaseAdapter{
Context context=null;
ArrayList<HashMap<String,Object>> list=null;
int layout;
String[] from=null;
int[] to;
public MyListViewAdapter(Context context,
ArrayList<HashMap<String, Object>> list, int layout,
String[] from, int[] to) {
super();
this.context = context;
this.list = list;
this.layout = layout;
this.from = from;
this.to = to;
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return list.size();
}
@Override
public Object getItem(int arg0) {
// TODO Auto-generated method stub
return null;
}
@Override
public long getItemId(int arg0) {
// TODO Auto-generated method stub
return arg0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
View listItemView= LayoutInflater.from(context).inflate(layout, null);
ImageView image=(ImageView)listItemView.findViewById(to[0]);
TextView text=(TextView)listItemView.findViewById(to[1]);
image.setImageResource((Integer)list.get(position).get(from[0]));
text.setText((String)list.get(position).get(from[1]));
return listItemView;
}
}
}
标签: QQ
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明


网友评论
我要评论