最近,需要做一个可展开的listview,不禁想起了ExpandableListView。但是,在写了一个简单的例子后,发现了问题:
ExpandableListView是又多个childList组成的。
当展开的childList过长,又需要打开其他的list时,用户只能先滚动到最上面关掉这个childList,才可能打开其他的childlist!
这样的用户体验很差。iPhone做的就很不错,QQ的好友列表顶端 也有类似的导航,显示当前gruop的标签,并且点击就可以关闭当前组,十分方便!
好了,今天就模仿做了这个,直接上图:
下面是页面的布局(其他无用的布局我已经去掉了):
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:orientation="vertical" >
<FrameLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
<com.customWidget.QExListView
android:choiceMode="singleChoice"
android:id="@+id/home_expandableListView"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_below="@id/head_line"
android:cacheColorHint="#00000000"
android:childDivider="@drawable/list_divider_line"
android:divider="@drawable/list_divider_line"
android:dividerHeight="1dip"
android:fadingEdge="none"
android:groupIndicator="@null" />
</FrameLayout>
</LinearLayout>
<?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:orientation="vertical" >
<FrameLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
<com.customWidget.QExListView
android:choiceMode="singleChoice"
android:id="@+id/home_expandableListView"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_below="@id/head_line"
android:cacheColorHint="#00000000"
android:childDivider="@drawable/list_divider_line"
android:divider="@drawable/list_divider_line"
android:dividerHeight="1dip"
android:fadingEdge="none"
android:groupIndicator="@null" />
</FrameLayout>
</LinearLayout> 这里要说明的是:他的父控件一定要为FrameLayout。因为需要添加在ExpandableListView上层的小导航条!
下面是自定义组件QExListView 代码:
Java代码
public class QExListView extends ExpandableListView implements
AbsListView.OnScrollListener {
private ExpandableListAdapter _exAdapter = null;
private LinearLayout _groupLayout;
private int _groupIndex = -1;
/**
* @param context
*/
public QExListView(Context context) {
super(context);
super.setOnScrollListener(this);
}
/**
* @param context
* @param attrs
*/
public QExListView(Context context, AttributeSet attrs) {
super(context, attrs);
super.setOnScrollListener(this);
}
/**
* @param context
* @param attrs
* @param defStyle
*/
public QExListView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
super.setOnScrollListener(this);
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem,
int visibleItemCount, int totalItemCount) {
if (_exAdapter == null)
_exAdapter = this.getExpandableListAdapter();
int ptp = view.pointToPosition(0, 0);
if (ptp != AdapterView.INVALID_POSITION) {
QExListView qExlist = (QExListView) view;
long pos = qExlist.getExpandableListPosition(ptp);
int groupPos = ExpandableListView.getPackedPositionGroup(pos);
int childPos = ExpandableListView.getPackedPositionChild(pos);
if (childPos < 0) {
groupPos = -1;
}
if (groupPos < _groupIndex) {
_groupIndex = groupPos;
if (_groupLayout != null)
_groupLayout.removeAllViews();
} else if (groupPos > _groupIndex) {
final FrameLayout fl = (FrameLayout) getParent();
_groupIndex = groupPos;
if (_groupLayout != null)
fl.removeView(_groupLayout);
_groupLayout = (LinearLayout) getExpandableListAdapter()
.getGroupView(groupPos, true, null, null);
_groupLayout.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
collapseGroup(_groupIndex);
// v = (LinearLayout) getExpandableListAdapter().getGroupView(_groupIndex, true, null, null);
Home_Act._viewHandler.post(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
fl.removeView(_groupLayout);
fl.addView(_groupLayout, new LayoutParams(
LayoutParams.FILL_PARENT, 50));
}
});
}
});
fl.addView(_groupLayout,fl.getChildCount(), new LayoutParams(
LayoutParams.FILL_PARENT, 50));
}
}
}
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
}
}
分享到:
相关推荐
在IT行业中,设计一个仿QQ好友列表的布局是一项常见的任务,尤其在开发聊天应用程序时。这个项目的目标是创建一个用户界面,它能够模仿QQ应用程序的好友列表功能,包括可收缩和展开的特性,以提供良好的用户体验。...
"仿QQ好友列表框源码"是指使用易语言编写的一个程序,该程序模仿了腾讯QQ应用中的好友列表显示功能。这个源码可能是为了教学目的或者作为实践项目,帮助用户了解和学习如何在易语言中实现类似界面和功能。 首先,...
本示例"扩展listview,仿QQ好友列表"旨在教你如何基于ListView自定义一个功能丰富的、类似于QQ好友列表的界面。在这个Demo中,你可以学习到如何实现动态添加成员,并将其显示在列表的相应位置。 首先,我们需要创建...
【标题】"仿QQ好友列表C#版本"是一款基于C#编程语言开发的应用程序,旨在模仿QQ客户端的好友列表展示功能。此项目可能是为学习或教学目的设计的,旨在帮助开发者理解和实现类似社交软件中的用户界面和数据管理。 ...
在本文中,我们将深入探讨如何使用DELPHI 7创建一个仿QQ好友列表的应用程序。DELPHI 7是一款强大的Windows应用程序开发工具,以其直观的可视化组件和面向对象的编程特性而闻名。仿QQ好友列表的实现涉及多个关键知识...
本项目“ios仿QQ好友列表”旨在模仿QQ应用程序的好友列表界面,通过使用表格(UITableView)来实现,提供可展开和收缩的功能,增加了交互性和层次感。 首先,我们要理解UITableView的基础知识。UITableView是iOS ...
无聊随便上传的一个QQ好友列表界面,希望能够帮助到别人!
基于Qt的仿QQ好友列表面板
本文将深入探讨如何实现这样一个功能,并基于给定的"android仿QQ好友列表"项目进行分析。 首先,从标题我们可以知道,这个项目是针对Android平台,目的是模仿QQ应用中的好友列表功能。QQ好友列表通常包括用户的头像...
【标题】"简单仿QQ好友列表"所涉及的知识点主要集中在Windows桌面应用程序开发上,特别是使用C#语言和Windows Forms框架来实现一个类似QQ的好友列表界面。这通常包括以下几个核心部分: 1. **Windows Forms**:...
本项目“仿QQ好友列表控件(非控件拼凑)”正是这样一个实例,它通过编程方式实现了类似QQ应用的好友列表展示效果,避免了使用多个标准控件简单堆砌,从而在性能和视觉体验上达到更高的标准。 首先,我们要理解“非...
仿QQ好友列表源码 功能介绍: VB.NET写的仿QQ好友列表控件,控件中,每一个组为一个控件,里面的好友项及小图标等均是绘制上去的,所以不用担心控件太多延迟问题,支持各项颜色的实时配置,测试时加载了2000个好友...
本文将详细探讨如何使用MFC来创建一个仿QQ好友列表的控件,主要涉及的知识点包括MFC的基础、CListCtrl控件的使用以及如何通过重写控件类来实现特定功能。 首先,MFC是基于面向对象编程的,它封装了Windows API,...
对于“仿QQ好友列表控件”,开发者可能使用了C#、WPF(Windows Presentation Foundation)或者WinForms等.NET Framework技术来实现,因为这些平台提供了丰富的UI控件和自定义能力。 在提供的文件列表中,我们可以...
以上就是实现“iOS 仿qq好友列表”所需的主要技术点。在实际开发中,你可能还会涉及网络请求、数据缓存、错误处理等方面的知识。通过这些步骤,你可以创建一个功能齐全且用户体验良好的好友列表应用。在实践中不断...
"易语言仿QQ好友列表框"是一个使用易语言编写的源码项目,它旨在模仿腾讯QQ软件的好友列表显示方式,提供类似的功能和用户体验。在这个项目中,开发者将实现以下关键知识点: 1. **界面设计**:QQ好友列表框通常...
在VC++编程环境中,创建一个高仿QQ好友列表窗体界面是一项挑战性的任务,涉及到Windows API、MFC(Microsoft Foundation Classes)库以及自定义控件的使用。本项目旨在重现QQ2009的经典界面风格,包括窗口布局、颜色...
本项目“安卓仿QQ好友列表界面可默认展开”提供了一种实现方式,使得用户在打开应用时,好友列表能够自动展开,为用户提供更为直观和便捷的体验。 首先,我们要理解UI界面的设计。在安卓中,我们可以使用Android ...