`
woaimoliha4
  • 浏览: 13161 次
社区版块
存档分类
最新评论

仿QQ好友列表

 
阅读更多
最近,需要做一个可展开的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) {  
    }  
 
 
 

分享到:
评论

相关推荐

    仿qq好友列表

    在IT行业中,设计一个仿QQ好友列表的布局是一项常见的任务,尤其在开发聊天应用程序时。这个项目的目标是创建一个用户界面,它能够模仿QQ应用程序的好友列表功能,包括可收缩和展开的特性,以提供良好的用户体验。...

    易语言仿QQ好友列表框源码

    "仿QQ好友列表框源码"是指使用易语言编写的一个程序,该程序模仿了腾讯QQ应用中的好友列表显示功能。这个源码可能是为了教学目的或者作为实践项目,帮助用户了解和学习如何在易语言中实现类似界面和功能。 首先,...

    扩展listview,仿QQ好友列表

    本示例"扩展listview,仿QQ好友列表"旨在教你如何基于ListView自定义一个功能丰富的、类似于QQ好友列表的界面。在这个Demo中,你可以学习到如何实现动态添加成员,并将其显示在列表的相应位置。 首先,我们需要创建...

    仿QQ好友列表C#版本

    【标题】"仿QQ好友列表C#版本"是一款基于C#编程语言开发的应用程序,旨在模仿QQ客户端的好友列表展示功能。此项目可能是为学习或教学目的设计的,旨在帮助开发者理解和实现类似社交软件中的用户界面和数据管理。 ...

    DELPHI 7仿QQ好友列表

    在本文中,我们将深入探讨如何使用DELPHI 7创建一个仿QQ好友列表的应用程序。DELPHI 7是一款强大的Windows应用程序开发工具,以其直观的可视化组件和面向对象的编程特性而闻名。仿QQ好友列表的实现涉及多个关键知识...

    ios仿QQ好友列表

    本项目“ios仿QQ好友列表”旨在模仿QQ应用程序的好友列表界面,通过使用表格(UITableView)来实现,提供可展开和收缩的功能,增加了交互性和层次感。 首先,我们要理解UITableView的基础知识。UITableView是iOS ...

    仿QQ好友列表设计

    无聊随便上传的一个QQ好友列表界面,希望能够帮助到别人!

    基于Qt的仿QQ好友列表面板

    基于Qt的仿QQ好友列表面板

    android仿QQ好友列表

    本文将深入探讨如何实现这样一个功能,并基于给定的"android仿QQ好友列表"项目进行分析。 首先,从标题我们可以知道,这个项目是针对Android平台,目的是模仿QQ应用中的好友列表功能。QQ好友列表通常包括用户的头像...

    简单仿QQ好友列表

    【标题】"简单仿QQ好友列表"所涉及的知识点主要集中在Windows桌面应用程序开发上,特别是使用C#语言和Windows Forms框架来实现一个类似QQ的好友列表界面。这通常包括以下几个核心部分: 1. **Windows Forms**:...

    仿QQ好友列表控件(非控件拼凑)

    本项目“仿QQ好友列表控件(非控件拼凑)”正是这样一个实例,它通过编程方式实现了类似QQ应用的好友列表展示效果,避免了使用多个标准控件简单堆砌,从而在性能和视觉体验上达到更高的标准。 首先,我们要理解“非...

    仿QQ好友列表源码20130403

    仿QQ好友列表源码 功能介绍: VB.NET写的仿QQ好友列表控件,控件中,每一个组为一个控件,里面的好友项及小图标等均是绘制上去的,所以不用担心控件太多延迟问题,支持各项颜色的实时配置,测试时加载了2000个好友...

    MFC仿QQ好友列表控件

    本文将详细探讨如何使用MFC来创建一个仿QQ好友列表的控件,主要涉及的知识点包括MFC的基础、CListCtrl控件的使用以及如何通过重写控件类来实现特定功能。 首先,MFC是基于面向对象编程的,它封装了Windows API,...

    仿QQ好友列表控件

    对于“仿QQ好友列表控件”,开发者可能使用了C#、WPF(Windows Presentation Foundation)或者WinForms等.NET Framework技术来实现,因为这些平台提供了丰富的UI控件和自定义能力。 在提供的文件列表中,我们可以...

    iOS 仿qq好友列表

    以上就是实现“iOS 仿qq好友列表”所需的主要技术点。在实际开发中,你可能还会涉及网络请求、数据缓存、错误处理等方面的知识。通过这些步骤,你可以创建一个功能齐全且用户体验良好的好友列表应用。在实践中不断...

    易语言仿QQ好友列表框

    "易语言仿QQ好友列表框"是一个使用易语言编写的源码项目,它旨在模仿腾讯QQ软件的好友列表显示方式,提供类似的功能和用户体验。在这个项目中,开发者将实现以下关键知识点: 1. **界面设计**:QQ好友列表框通常...

    VC++ 高仿QQ好友列表窗体界面

    在VC++编程环境中,创建一个高仿QQ好友列表窗体界面是一项挑战性的任务,涉及到Windows API、MFC(Microsoft Foundation Classes)库以及自定义控件的使用。本项目旨在重现QQ2009的经典界面风格,包括窗口布局、颜色...

    安卓仿QQ好友列表界面可默认展开

    本项目“安卓仿QQ好友列表界面可默认展开”提供了一种实现方式,使得用户在打开应用时,好友列表能够自动展开,为用户提供更为直观和便捷的体验。 首先,我们要理解UI界面的设计。在安卓中,我们可以使用Android ...

Global site tag (gtag.js) - Google Analytics