`
syab11
  • 浏览: 199389 次
  • 性别: Icon_minigender_1
  • 来自: SH
社区版块
存档分类
最新评论

用ExpandableListView实现类似QQ好友列表

阅读更多

ExpandableListView是一个用来显示二级节点的listview。

qq好友列表中子列表上下移动时,父节点在顶端会始终显示,这里我们可以自定义一个view来充当这个父节点。

 

主布局文件qq_listview如下,其中当我们拖动列表时,系统默认拖动过程中列表背景是黑的,我们可以通过android:cacheColorHint="#00000000"将其设置为透明,其中前两位是透明效果参数(00-99),后六位是颜色的设置。

 

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="fill_parent"
  android:layout_height="wrap_content"
  android:orientation="vertical"
  android:background="@drawable/default_bg_hdpi">
  <LinearLayout
  	 android:id="@+id/gone_linear"
 	 android:layout_width="fill_parent"
 	 android:layout_height="wrap_content"
 	 android:background="@drawable/expand_column_bg"
 	 android:visibility="gone"
 	 android:cacheColorHint="#50000000"
  >
  <ImageView android:id="@+id/qq_list_imageview" 
  	android:layout_width="wrap_content"  android:layout_height="30dip" 
  	android:src="@drawable/narrow_select" />
  <TextView android:id="@+id/qq_list_textview"   android:layout_marginLeft="50dip"
  	android:layout_width="fill_parent" android:layout_height="wrap_content" />
  	</LinearLayout>
	<FrameLayout android:layout_width="fill_parent"
		android:layout_height="fill_parent">
  <ExpandableListView android:id="@+id/qq_listview"
 	 android:cacheColorHint="#00000000"
  	android:layout_width="fill_parent" android:layout_height="wrap_content" />
  	</FrameLayout>
</LinearLayout>

 

如果我们想更换父节点打开和关闭时的箭头,可以先设置一个selector.xml

 

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
	<item android:state_window_focused="false" android:drawable="@drawable/expand_column_bg_over" />
	<item android:state_pressed="true" android:drawable="@drawable/expand_column_bg" />
	<item android:state_pressed="false" android:drawable="@drawable/feedlistdividerbg"></item>
</selector>

 然后在代码中调用

 

		elistview = (ExpandableListView)findViewById(R.id.qq_listview);
		//替换ExpandableListView的打开关闭时的箭头图标
		elistview.setGroupIndicator(this.getResources().getDrawable(R.drawable.expand_list_selector));

 

此外,我们还要设置父节点和子节点item的布局文件

父节点qq_list_parent.xml如下

 

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent" 	
  android:background="@drawable/expand_column_bg">
  <TextView android:id="@+id/parend"
  	android:layout_width="wrap_content" 
  	android:layout_height="30dip"
  	android:layout_marginLeft="50dip"
  	 />
</LinearLayout>

 

子节点qq_listview_child.xml

 

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent"
  android:cacheColorHint="#00000000"
 >
    <TextView android:id="@+id/child"
  		android:layout_width="wrap_content" android:layout_height="40dip"
  		android:layout_marginLeft="80dip"
  		/>
</LinearLayout>

 

java代码如下

 

package com.sy.android.qqlistview;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.AbsListView;
import android.widget.AbsListView.OnScrollListener;
import android.widget.ExpandableListView;
import android.widget.ExpandableListView.OnGroupCollapseListener;
import android.widget.ExpandableListView.OnGroupExpandListener;
import android.widget.LinearLayout;
import android.widget.SimpleExpandableListAdapter;
import android.widget.TextView;

import com.sy.android.testAndroid.R;

public class QQListView extends Activity   {
	
	private static ArrayList<Map<String,String>> parentData = new ArrayList<Map<String,String>>();
	private static ArrayList<ArrayList<Map<String,String>>> childData = new ArrayList<ArrayList<Map<String,String>>>();
	private ExpandableListView elistview;
	private TextView tv;
	
	/**
	 *当前打开的父节点
	 */
	private int the_group_expand_position=-1;
	/**
	 * 打开的父节点所与的子节点数
	 */
	private int position_child_count=0;
	/**
	 * 是否有打开的父节点
	 */
	private boolean isExpanding=false;
	
	public void getData(){
		for(int i=0; i<20;i++){
			 Map<String,String> map = new HashMap<String,String>();
			 map.put("parend", i+"");
			 parentData.add(map);
		}
		for(int i=0;i<20;i++){
			ArrayList<Map<String,String>> child = new ArrayList<Map<String,String>>();
			for(int j=0; j<20;j++){
				Map<String,String> map = new HashMap<String,String>();
				map.put("child", i+""+j);
				child.add(map);
			}
			childData.add(child);
		}
	}
	
	public void onCreate(Bundle saveBundle){
		super.onCreate(saveBundle);
		setContentView(R.layout.qq_listview);
		
		elistview = (ExpandableListView)findViewById(R.id.qq_listview);
		//替换ExpandableListView的打开关闭时的箭头图标
		elistview.setGroupIndicator(this.getResources().getDrawable(R.drawable.expand_list_selector));
		tv = (TextView)findViewById(R.id.qq_list_textview);
		
		/**
		 * 滑动子列表时在上方显示父节点的view
		 */
		final LinearLayout linear = (LinearLayout)findViewById(R.id.gone_linear);
		
		/**
		 * 监听父节点打开的事件
		 */
		elistview.setOnGroupExpandListener(new OnGroupExpandListener(){

			@Override
			public void onGroupExpand(int groupPosition) {
				the_group_expand_position=groupPosition;
				position_child_count=childData.get(groupPosition).size();
				isExpanding=true;
			}
			
		});
		
		/**
		 * 监听父节点关闭的事件
		 */
		elistview.setOnGroupCollapseListener(new OnGroupCollapseListener(){

			@Override
			public void onGroupCollapse(int groupPosition) {
				if(linear.getVisibility()==View.VISIBLE){
					linear.setVisibility(View.GONE);
				}
				isExpanding=false;
			}
			
		});
		

		linear.setOnClickListener(new OnClickListener(){

			@Override
			public void onClick(View v) {
				linear.setVisibility(View.GONE);
				elistview.collapseGroup(the_group_expand_position);
			}
			
		});
		
		/**
		 * 通过setOnScrollListener来监听列表上下滑动时item显示和消失的事件
		 */
		
		elistview.setOnScrollListener(new OnScrollListener(){

			@Override
			public void onScrollStateChanged(AbsListView view, int scrollState) {
				
			}

			@Override
			public void onScroll(AbsListView view, int firstVisibleItem,
					int visibleItemCount, int totalItemCount) {
				if(isExpanding){
					// 当当前第一个item id小于打开的父节点id 或大于打开的父节点id和它的子节点总数之和时
					if(firstVisibleItem<the_group_expand_position ||
							firstVisibleItem>(the_group_expand_position+position_child_count)){
						linear.setVisibility(View.GONE);
					}else{
						linear.setVisibility(View.VISIBLE);
						tv.setText(((Map)parentData.get(the_group_expand_position)).get("parend").toString());
					}
				}
			}
			
		});
		
		getData();
		
		SimpleExpandableListAdapter selAdapter = new SimpleExpandableListAdapter(this,
				parentData,
				R.layout.qq_listview_parend_item,
				new String[]{"parend"},
				new int[]{R.id.parend},
				childData,
				R.layout.qq_liatview_child_item,
				new String[]{"child"},
				new int[]{R.id.child}
				);
		elistview.setAdapter(selAdapter);

	}

}

 

 

实现的思路是通过setOnScrollListener来监听listview,从而获得显示在视图中的item的id,通过id的判断来决定显示在顶端的自定义的view是否显示

分享到:
评论
11 楼 ybitts 2014-09-13  
能把源码发我邮箱吗 谢谢了 ybitts@sina.cn
10 楼 gmailToyou 2012-06-30  
shishisssss
9 楼 jjy119 2012-06-07  
感觉不错啊,谢谢分享了
8 楼 yyf365 2012-03-27  
请问有源码么?看之前评论貌似有的
7 楼 o_kxj 2012-03-10  
源码在哪里呢?谢谢
6 楼 mydeadsky 2011-12-06  
看不到下载地方啊
5 楼 bingtao115 2011-11-09  
down下来试过了,不是我想要的效果,不过也有可取之处的
4 楼 newli2010. 2011-11-03  
可以把源码放上嘛,拜读了。
3 楼 lingranyu 2011-10-31  
拜读大作!!!非常好!!!!
2 楼 feng88724 2011-05-26  
感谢分享。 不过测试下来,问题还很多。

1 楼 l16426434 2011-04-08  
可以把工程代码 放上来吗

相关推荐

    ExpandableListView实现展开收缩功能

    ExpandableListView能够实现类似QQ好友的展开、收缩功能

    Android ExpandableListView用法实例:仿QQ界面分组列表.rar

    本源码将演示Android ExpandableListView的用法,制作一个类似QQ界面的好友分组列表展开收缩效果,为什么最开始没有使用ListView呢?因为ListView只能显示一级列表,如果实现像QQ好友列表那样的效果,就需要用到...

    实现类似QQ的好友列表展示,列表有头像、文字

    使用ExpandableListView实现了类是QQ好友列表的功能,我开发的时候用到的,经过验证,可以使用,希望对大家有帮助。

    Android 实现QQ好友列表源码.zip

    在某些android开发群里,看到有些新手问怎么实现QQ好友列表,其实网上一搜挺多的。接触Android,也才一年的时间,大部分时间花在工作上(解bug。。。),界面上开发很少参与。自己维护的系统应用里,有个...

    Android 实现QQ好友列表

    在某些android开发群里,看到有些新手问怎么实现QQ好友列表,其实网上一搜挺多的。接触Android,也才一年的时间,大部分时间花在工作上(解bug。。。),界面上开发很少参与。自己维护的系统应用里,有个...

    Android 中使用ExpandableListView 实现分组的实例

    这不同于列表视图,允许两个层次,类似于QQ的好友分组。要实现这个效果的整体思路为: 1.要给ExpandableListView 设置适配器,那么必须先设置数据源。 2.数据源,就是此处的适配器类,此方法继承了...

    类似手机QQ好友列表特效

    类似手机QQ好友列表特效,在某些Android开发群里,看到有些新手问怎么实现QQ好友列表,其实网上一搜挺多的。接触Android,也才一年的时间,大部分时间花在工作上,界面上开发很少参与。自己维护的系统应用里,有个...

    仿QQ好友分组

    通过ExpandableListView完美实现嵌套的ListView,主要用在类似QQ好友分组的项目中,有需要的朋友可以参考一下。

    Android仿QQ好友列表实现列表收缩与展开

    好友QQ列表,可以展开,可以收起,在android中,以往用的比较多的是listview,虽然可以实现列表的展示,但在某些情况下,我们还是希望用到可以分组并实现收缩的列表,那就要用到android的ExpandableListView,今天...

    ExpandableListView:仿京东购物车折叠listview列表

    ##一、简介在日常开发,有可能会遇到需要一些可以展开的列表,比如QQ的好友列表。但是,用Android的该怎么做呢?其实在我没有接触过ExpandableListView类之前,都是自定义控件继承于ListView或者ListView嵌套...

    Android ExpandableListView展开列表控件使用实例

    主要介绍了Android ExpandableListView展开列表控件使用实例,本文实现了一个类似手机QQ好友列表的界面效果,需要的朋友可以参考下

    android 的类似于QQ分组的二级列表

    public String[] groups = { "我的好友", "新疆同学", "亲戚", "同事" }; public String[][] children = { { "胡算林", "张俊峰", "王志军", "二人" }, { "李秀婷", "蔡乔", "别高", "余音" }, { "摊派新...

    ExpandableListView使用

    类似QQ好友界面,点击某一项弹出下拉框显示内容

Global site tag (gtag.js) - Google Analytics