简单几句代码模仿手机QQ列表

手机QQ的可折叠列表在分组往上滑动时是可以停靠在最上方的,android默认的列表并没有提供相关的功能,其实可以简单的实现下,就是放一个View在最上面,在合适的时候显示出来就行了。

public class ExExpandableListView extends FrameLayout implements
        OnScrollListener, OnClickListener {

    private ExpandableListView mList;

    public ExExpandableListView(Context context, AttributeSet attrs) {
        super(context, attrs);
        mList = new ExpandableListView(context, null);
        FrameLayout.LayoutParams lp = new FrameLayout.LayoutParams(-1, -1);
        mList.setLayoutParams(lp);
        mFixedHeader = new TextView(context);
        FrameLayout.LayoutParams lp1 = new FrameLayout.LayoutParams(-1,
                LayoutParams.WRAP_CONTENT);
        mFixedHeader.setLayoutParams(lp1);
        addView(mList);
        addView(mFixedHeader);

        mList.setOnScrollListener(this);
        mFixedHeader.setOnClickListener(this);
        
        mList.setFadingEdgeLength(0);
    }
    

    TextView mFixedHeader;
    

    public ExpandableListView getList() {
        return mList;
    }

    private int mCurrentGroup = -1;

    @Override
    public void onScroll(AbsListView view, int firstVisibleItem,
            int visibleItemCount, int totalItemCount) {

        if (mList == null || mList.getChildCount() <= 0) {
            return;
        }

        final long flatPos = mList.getExpandableListPosition(firstVisibleItem);
        final int groupPos = ExpandableListView.getPackedPositionGroup(flatPos);
        
        if(groupPos != mCurrentGroup){
            //只有在组改变时才去设置文字
            String text = mList.getExpandableListAdapter().getGroup(groupPos)
                    .toString();
            mFixedHeader.setText(text);
        }
        
        mCurrentGroup = groupPos;
        
        if (mList.isGroupExpanded(groupPos)) {
            if(mFixedHeader.getVisibility() != View.VISIBLE){
                mFixedHeader.setVisibility(View.VISIBLE);
            }
        } else {
            if(mFixedHeader.getVisibility() != View.GONE){
                mFixedHeader.setVisibility(View.GONE);
            }
        }
    }

    @Override
    public void onClick(View v) {
        if (v == mFixedHeader) {
            mFixedHeader.setVisibility(View.GONE);
            mList.collapseGroup(mCurrentGroup);
            mList.setSelectedGroup(mCurrentGroup);
        }
    }

}

只是简单的使用一个TextView去显示组的文字,还有很多细节没有考虑,比如说QQ的列表是当下面的组靠近停靠的组时是把停靠的那个视图推上去的。
posted @ 2011-08-31 23:09  douzifly  阅读(949)  评论(0编辑  收藏  举报