精华内容
下载资源
问答
  • QQ 分组

    2014-05-29 17:01:01
     <div class="xmmc"><p class="bm_txtitem" id="proName<%#Container.ItemIndex+1%>">项目名称:</span> ("P_Title") %></p></div>  <div id="Base<%#Container.ItemIndex+1%>">      ...
     
    

    <!DOCTYPE html>


    <html xmlns="http://www.w3.org/1999/xhtml">
    <head id="Head1" runat="server">
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
        <meta name="viewport" content="width=device-width, initial-scale=1.0,maximum-scale=1.0, user-scalable=no">
        <title> </title>
        <link href="/sucai/styles/css.css" type="text/css" rel="stylesheet" />
        <script src="../../api/jquery/jquery-1.3.2.min.js"></script>


        <script type="text/javascript">
            var tof = true;
            //获取当前div距顶部距离,获取当前滚动条距顶部距离,如果超出,则给其添加一个属性position:fixed直到下一个被赋属性了,这个属性被去掉
            window.onscroll = scrollCheck;
            function scrollCheck() {
                var bb = $(".xmmc").length;
                var id = "";
                var idBottom = "";
                var Baseid="";
                for (var i = 1; i <= bb; i++) {
                    Baseid = "Base" + i;
                    id = "proName" + i;
                    idBottom = "bottom" + i;
                    var top = document.getElementById(Baseid).offsetTop;//获取当前div到顶部的距离
                    var bottom = document.getElementById(idBottom).offsetTop;//获取当前div到顶部的距离
                    var nowScroll = $(this).scrollTop();//获取当前滚动条距顶部的距离
                    var obj = document.getElementById(id);
                    if (nowScroll > top && nowScroll < bottom) {
                        obj.style.cssText = "position:fixed; top:47px; background-color:#FFFFFF;";
                    } else {
                        obj.style.cssText = "position:static;";
                    }
                }
            }
        </script>
    </head>
    <body>
        <div class="html">
            <div class="header">
                <a class="h_home" href="Infrared.html"></a>
                通讯录
                <span class="h_setting"></span>
            </div>
            <div class="body">
                <div class="b_main">
                    <asp:Repeater ID="rptJoinMan" runat="server" OnItemDataBound="rptJoinMan_ItemDataBound">
                        <ItemTemplate>
                            <div class="xmmc"><p class="bm_txtitem"  id="proName<%#Container.ItemIndex+1%>"><span>项目名称:</span> <%#Eval("P_Title") %></p></div>
                            <div id="Base<%#Container.ItemIndex+1%>"></div>
                            <asp:Repeater ID="rptName" runat="server">
                                <ItemTemplate>
                                    <p class="bm_txtitem"><a class="bm_txtitem" href="/UserInfo_<%#Eval("ID") %>.html">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;服务人员:<%#Eval("U_Name") %></a></p>
                                </ItemTemplate>
                            </asp:Repeater>
                            <%--<asp:Panel ID="pl<%#Eval("P_ID") %>" runat="server">暂无数据</asp:Panel>--%>
                            <div id="dv" class="bm_txtitem" runat="server" style="text-align: left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;暂无数据</div>
                            <div id="bottom<%#Container.ItemIndex+1%>"></div>
                            <p class="bm_txtitem"></p>
                        </ItemTemplate>
                    </asp:Repeater>
                    <div id="pshow" runat="server" class="bm_txtitem" style="text-align: left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;暂无数据</div>
                </div>
                <div class="b_copyright">
        
                </div>
            </div>
        </div>
    </body>
    </html>
    展开全文
  • 第一篇链接:android RecyclerView一步步打造分组效果、类似QQ分组、折叠菜单、分组效果(一) 上一篇写了分组效果的初步实现: 这一篇就继续增加分组折叠效果和基类的抽取与解决上一篇的bug(item布局宽度match...
    第一篇链接: 
    

    android RecyclerView一步步打造分组效果、类似QQ分组、折叠菜单、分组效果(一)

    注!已更新代码!

    上一篇写了分组效果的初步实现:

    这里写图片描述

    这里写图片描述


    这一篇就继续增加分组折叠效果和基类的抽取与解决上一篇的bug(item布局宽度match_parent没有生效)

    效果如下图:

    这里写图片描述 这里写图片描述

    三、点击头布局实现展开折叠效果

    根据上一片文章最后的代码,继续修改代码让RecyclerView实现点击班级布局可以显示隐藏学生的效果,

    首先,先画图分析可折叠的效果有几种情况:

    这里写图片描述

    与不可折叠的差别:

    1.由上图可以看出,班级布局的position的可变的,也就是说,当折叠的时候无展开的时候,其他的班级布局的position会动态改变位置,所以,上一篇中用HashMap存放班级布局的index和position不可用于该效果,所以改为List集合来存放班级的position

    2.根据当前选中情况来单独显示隐藏某个班级下的学生

    怎么实现点击班级后显示学生,再次点击就隐藏学生呢?这个我们可以在返回班级对应学生人数哪里做文章,当我需要隐藏该班级学生,就返回0,显示的话就返回该班级的所有人数

    代码改造如下:

        //存放班级对应的position
        private List<Integer> mHeaderIndex = new ArrayList<>();
        //存放班级对应的学生
        private HashMap<Integer, List<String>> mContentMap = new HashMap<>();
        //存放当前班级的是否展开
        private SparseBooleanArray mBooleanMap;
        
        /**
         * 条目的总数量
         * @return
         */
        @Override
        public int getItemCount() {
            return getHeadersCount() + getContentCount();
        }
    
        /**
         * 头布局的数量
         * @return
         */
        private int getHeadersCount(){
            return mContent.size();
        }
    
        /**
         * item的数量
         * @return
         */
        private int getContentCount(){
    
            mHeaderIndex.clear();
            mContentMap.clear();
            int itemCount = 0;
            int studentSize = 0;
    
            for (int i = 0; i < mContent.size(); i++) {
    
                if(i != 0){
                    itemCount++;
                }
    
                //存储第几班的index位置
    //            mHeaderIndex.put(i,new Integer(itemCount));
                mHeaderIndex.add(new Integer(itemCount));
    
                itemCount += getStudentSizeOfClass(i);
                studentSize += getStudentSizeOfClass(i);
    
                if(getStudentSizeOfClass(i) > 0){
                    mContentMap.put(i, mContent.get(i).classStudents);
                }
    
            }
    
            return studentSize;
        }
    
        /**
         * 根据班级获取对应的学生人数
         * @param classIndex
         * @return
         */
        private int getStudentSizeOfClass(int classIndex){
    
            int count = mContent.get(classIndex).classStudents.size();
    
            if (!mBooleanMap.get(classIndex)) {
                count = 0;
            }
            return count;
        }
        
        @Override
        public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
    
            //如果是head布局
            if(isHeaderView(position)){
    
                ((HeaderHolder)holder).tvClassName.setOnClickListener(null);
                ((HeaderHolder)holder).tvClassName.setText(mContent.get(getHeadRealCount(position)).className);
    
                ((HeaderHolder)holder).tvClassName.setTag(getHeadRealCount(position));
                ((HeaderHolder)holder).tvClassName.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
                        int position = (int) view.getTag();
    
                        boolean isOpen = mBooleanMap.get(position);
    
                        mBooleanMap.put(position, !isOpen);
                        notifyDataSetChanged();
                    }
                });
                return ;
            }else {
    
                //根据position获取position对应的学生所在班级
                int classId = getStudentOfClass(position);
                //获取该班级所有学生
                List<String> classStudent = mContentMap.get(classId);
                //获取改班级head所在的position位置
                int classOfPosition = mHeaderIndex.get(classId);
                //根据当前位置position和班级head布局的position,计算当前学生在班级中的位置
                int studentIndex = position - classOfPosition - 1;
                //根据位置获取具体学生
                String studentName = classStudent.get(studentIndex);
                //显示出来学生名字
                ((ContentHolder) holder).tvInfo.setText(studentName);
            }
        }
        
        /**
         * 获取position是第几个班级
         * @param position
         * @return
         */
        private int getHeadRealCount(int position){
            return mHeaderIndex.indexOf(new Integer(position));
        }
        
        /**
         * 根据position获取所属的班级的index
         * @return
         */
        private int getStudentOfClass(int position){
    
            for (int i = 0; i < mHeaderIndex.size(); i++) {
                if(mHeaderIndex.get(i) > position){
                    return i-1;
                }
            }
            return mHeaderIndex.size() - 1;
        }
        
    

    从代码中可以看出,getHeadersCount()getItemCount()并没有改动,主要就是getContentCount()getHeadRealCount(int position)getStudentOfClass(int position)onBindViewHolder中改动较大,还多了个mBooleanMap,这个主要是存储当前班级是否展开。

    运行效果如下:

    这里写图片描述

    基本效果是实现了,如果想要listView样式的我们只需要修改布局管理器setLayoutManager就可以很轻松的切换成List样式了,那么,如果换成其他场景还要重复写这么多代码也不想我们的作风,程序员都是非常懒的,所以,我们需要抽出一个基类,在不同的地方使用,只需要继承该基类然后写一些少量的代码就可以实现该效果,这才是我们想要的,那么开始把。

    四、抽出基类

    首先,需要思考那些需要自己实现的,那些需要基类实现的,大概整理了一下不同需求需要改变的地方:
    1. 创建班级布局
    2. 创建学生布局
    3. 填充班级布局信息
    4. 填充学生布局信息
    5. 班级ViewHolder
    6. 学生ViewHolder
    7. 一共有多少个班级
    8. 每个班级有多少个学生

    所以,我们在基类中,把这些方法定义为抽象方法,让子类必须去实现,注意:ViewHolder需要使用泛型!:

        /**
         * 头布局的总数(一共有多少个班级)
         * @return
         */
        public abstract int getHeadersCount();
    
        /**
         * 头布局对应内容的总数(也就是改头布局里面有多少条item)(根据班级获取该班级有多少个学生)
         * @param headerPosition 第几个头布局
         * @return
         */
        public abstract int getContentCountForHeader(int headerPosition);
    
        /**
         * 创建头布局(创建班级布局)
         * @param parent
         * @param viewType
         * @return
         */
        public abstract C onCreateHeaderViewHolder(ViewGroup parent, int viewType);
    
        /**
         * 创建内容布局(创建学生布局)
         * @param parent
         * @param viewType
         * @return
         */
        public abstract S onCreateContentViewHolder(ViewGroup parent, int viewType);
    
        /**
         * 填充头布局的数据(填充班级布局信息)
         * @param holder
         * @param position
         */
        public abstract void onBindHeaderViewHolder(C holder, int position);
    
        /**
         * 填充(填充学生布局信息)
         * @param holder
         * @param HeaderPosition
         * @param ContentPositionForHeader
         */
        public abstract void onBindContentViewHolder(S holder, int HeaderPosition, int ContentPositionForHeader);
    

    下面把基类的adapter中对应的代码改一下:

        /**
         * 条目的总数量
         * @return
         */
        @Override
        public int getItemCount() {
            mHeaderIndex.clear();
            int count = 0;
            int headSize = getHeadersCount();
            for (int i = 0; i < headSize; i++) {
                if(i != 0){
                    count++;
                }
                mHeaderIndex.add(new Integer(count));
    
                count += getContentCountForHeader(i);
            }
            Log.e("fan", "--getItemCount:" + count + "--headSize" + headSize);
            return count + 1;
        }
        
        @Override
        public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
            if(viewType == TYPE_HEADER){
                //班级header布局
                return onCreateHeaderViewHolder(parent, viewType);
            }else {
                //学生布局
                return onCreateContentViewHolder(parent, viewType);
            }
        }
        
        @Override
        public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
    
            //如果是head布局
            if(isHeaderView(position)){     //班级header布局填充
    
                onBindHeaderViewHolder((C)holder, getHeadRealCount(position));
                return ;
            }else {      //学生信息填充
                //根据position获取position对应的学生所在班级
                int classId = getStudentOfClass(position);
                //获取改班级head所在的position位置
                int classOfPosition = mHeaderIndex.get(classId);
                //根据当前位置position和班级head布局的position,计算当前学生在班级中的位置
                int studentIndex = position - classOfPosition - 1;
                onBindContentViewHolder((S)holder, classId, studentIndex);
            }
        }
    
    

    基类adapter完整的代码如下(如果不懂泛型的可以注意下类名后面跟着的代码):

    这里写代码片

    public abstract class ClassAdapter<C extends RecyclerView.ViewHolder, S extends RecyclerView.ViewHolder> extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
    
        private static final int TYPE_HEADER = 1;
        private static final int TYPE_CONTENT = 0;
    
        private List<Integer> mHeaderIndex = new ArrayList<>();
        /**
         * 是否为头布局
         * @param position
         * @return
         */
        private boolean isHeaderView(int position){
            return mHeaderIndex.contains(new Integer(position));
        }
    
        @Override
        public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
            if(viewType == TYPE_HEADER){
                //班级header布局
                return onCreateHeaderViewHolder(parent, viewType);
            }else {
                //学生布局
                return onCreateContentViewHolder(parent, viewType);
            }
        }
    
        @Override
        public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
    
            //如果是head布局
            if(isHeaderView(position)){     //班级header布局填充
    
                onBindHeaderViewHolder((C)holder, getHeadRealCount(position));
                return ;
            }else {      //学生信息填充
                //根据position获取position对应的学生所在班级
                int classId = getStudentOfClass(position);
                //获取改班级head所在的position位置
                int classOfPosition = mHeaderIndex.get(classId);
                //根据当前位置position和班级head布局的position,计算当前学生在班级中的位置
                int studentIndex = position - classOfPosition - 1;
                onBindContentViewHolder((S)holder, classId, studentIndex);
            }
        }
    
        @Override
        public int getItemViewType(int position) {
    
            if(isHeaderView(position)){
                return TYPE_HEADER;
            }else{
                return TYPE_CONTENT;
            }
        }
    
        /**
         * 条目的总数量
         * @return
         */
        @Override
        public int getItemCount() {
            mHeaderIndex.clear();
            int count = 0;
            int headSize = getHeadersCount();
            for (int i = 0; i < headSize; i++) {
                if(i != 0){
                    count++;
                }
                mHeaderIndex.add(new Integer(count));
    
                count += getContentCountForHeader(i);
            }
            return count + 1;
        }
    
        /**
         * 获取position是第几个头布局
         * @param position
         * @return
         */
        private int getHeadRealCount(int position){
            return mHeaderIndex.indexOf(new Integer(position));
        }
    
        /**
         * 根据value获取所属的key
         * @return
         */
        private int getStudentOfClass(int position){
    
            for (int i = 0; i < mHeaderIndex.size(); i++) {
                if(mHeaderIndex.get(i) > position){
                    return i-1;
                }
            }
            return mHeaderIndex.size() - 1;
        }
    
        @Override
        public void onAttachedToRecyclerView(RecyclerView recyclerView) {
    
            final RecyclerView.LayoutManager layoutManager = recyclerView.getLayoutManager();
            if(layoutManager instanceof GridLayoutManager){
                GridLayoutManager gridLayoutManager = (GridLayoutManager) layoutManager;
                GridLayoutManager.SpanSizeLookup spanSizeLookup = gridLayoutManager.getSpanSizeLookup();
                gridLayoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup(){
    
                    @Override
                    public int getSpanSize(int position) {
    
                        int viewType = getItemViewType(position);
                        if(viewType == TYPE_HEADER){
                            return ((GridLayoutManager) layoutManager).getSpanCount();
                        }
                        return 1;
                    }
                });
            }
        }
    
        @Override
        public void onViewAttachedToWindow(RecyclerView.ViewHolder holder){
            int position = holder.getLayoutPosition();
            if (isHeaderView(position))
            {
                ViewGroup.LayoutParams lp = holder.itemView.getLayoutParams();
    
                if (lp != null && lp instanceof StaggeredGridLayoutManager.LayoutParams)
                {
    
                    StaggeredGridLayoutManager.LayoutParams p =
                            (StaggeredGridLayoutManager.LayoutParams) lp;
    
                    p.setFullSpan(true);
                }
            }
        }
    
        /**
         * 头布局的总数
         * @return
         */
        public abstract int getHeadersCount();
    
        /**
         * 头布局对应内容的总数(也就是改头布局里面有多少条item)
         * @param headerPosition 第几个头布局
         * @return
         */
        public abstract int getContentCountForHeader(int headerPosition);
    
        /**
         * 创建头布局
         * @param parent
         * @param viewType
         * @return
         */
        public abstract C onCreateHeaderViewHolder(ViewGroup parent, int viewType);
    
        /**
         * 创建内容布局
         * @param parent
         * @param viewType
         * @return
         */
        public abstract S onCreateContentViewHolder(ViewGroup parent, int viewType);
    
        /**
         * 填充头布局的数据
         * @param holder
         * @param position
         */
        public abstract void onBindHeaderViewHolder(C holder, int position);
    
        /**
         * 填充
         * @param holder
         * @param HeaderPosition
         * @param ContentPositionForHeader
         */
        public abstract void onBindContentViewHolder(S holder, int HeaderPosition, int ContentPositionForHeader);
    
    }
    

    而我们平常使用的话就写个子类去继承该adapter,例如:

    MyAdapter.class

    public class MyAdapter extends ClassAdapter<MyAdapter.ClassHolder, MyAdapter.StudentHolder> {
    
        private Context context;
        private List<ClassBean> mContent;
    
        //用于记录当前班级是隐藏还是显示
        private SparseBooleanArray mBooleanMap;
    
        public MyAdapter(Context context, List mContent) {
            this.context = context;
            this.mContent = mContent;
    
            mBooleanMap = new SparseBooleanArray();
        }
    
        @Override
        public int getHeadersCount() {
            return mContent.size();
        }
    
        @Override
        public int getContentCountForHeader(int headerPosition) {
    
            int count = mContent.get(headerPosition).classStudents.size();
    
            if (!mBooleanMap.get(headerPosition)) {
                count = 0;
            }
            return count;
        }
    
        /**
         * 创建头布局header的viewholder
         * @param parent
         * @param viewType
         * @return
         */
        @Override
        public MyAdapter.ClassHolder onCreateHeaderViewHolder(ViewGroup parent, int viewType) {
            return new ClassHolder(View.inflate(context, R.layout.item, null));
        }
    
        /**
         * 创建内容布局item的viewholder
         * @param parent
         * @param viewType
         * @return
         */
        @Override
        public MyAdapter.StudentHolder onCreateContentViewHolder(ViewGroup parent, int viewType) {
            return new StudentHolder(View.inflate(context, R.layout.item, null));
        }
    
        @Override
        public void onBindHeaderViewHolder(MyAdapter.ClassHolder holder, int position) {
            holder.tvClassName.setOnClickListener(null);
            holder.tvClassName.setText(mContent.get(position).className);
    
            holder.tvClassName.setTag(position);
            holder.tvClassName.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    int position = (int) view.getTag();
    
                    boolean isOpen = mBooleanMap.get(position);
    
                    mBooleanMap.put(position, !isOpen);
                    notifyDataSetChanged();
                }
            });
        }
    
        @Override
        public void onBindContentViewHolder(StudentHolder holder, int HeaderPosition, int ContentPositionForHeader) {
            holder.tvInfo.setText(mContent.get(HeaderPosition).classStudents.get(ContentPositionForHeader));
        }
    
    
    
        class ClassHolder extends RecyclerView.ViewHolder{
    
            public TextView tvClassName;
    
            public ClassHolder(View itemView) {
                super(itemView);
                tvClassName = itemView.findViewById(R.id.tvInfo);
            }
        }
    
        class StudentHolder extends RecyclerView.ViewHolder{
    
            public TextView tvInfo;
    
            public StudentHolder(View itemView) {
                super(itemView);
                tvInfo = itemView.findViewById(R.id.tvInfo);
            }
        }
    
    }
    

    这里需要注意一点的是,我们把显示隐藏的放到子类的getContentCountForHeader(int headerPosition)里面了,所以,如果我们不想要隐藏,只要一直显示内容的话就把里面的map给注释了,如下:

        @Override
        public int getContentCountForHeader(int headerPosition) {
    
            int count = mContent.get(headerPosition).classStudents.size();
    
            //这里是控制显示隐藏内容的部分
            //if (!mBooleanMap.get(headerPosition)) {
            //    count = 0;
            //}
            return count;
        }
    

    对了,还有Activity中使用的话就直接创建我们写的子类就可以了,比如:

            for (int i = 1; i < 4; i++) {
    
                List<String> studentName = new ArrayList<>();
                for (int j = 1; j < 56; j++) {
                    studentName.add(i + "班 学生" + j);
                }
                ClassBean bean = new ClassBean();
                bean.className = "二年级" + i + "班";
                bean.classStudents = studentName;
                mListClass.add(bean);
            }
    
            //可以修改布局管理器来显示网格布局还是线性布局
            rvShow.setLayoutManager(new GridLayoutManager(this, 4));
            //这个就用我们的子类adapter
            MyAdapter mWrapper = new MyAdapter(this, mListClass);
            rvShow.setAdapter(mWrapper);
    

    ok,搞定,对了,还有最后一步,就是修改之前的match_parent不生效问题

    五、修复布局match_parent不生效问题

    这个百度一下估计多的是,这里就简要说一下解决方法:

    在创建ViewHolder的时候,我们之前使用的是用的以前Listview的adapter的写法:

    View.inflate(context, R.layout.item, null)
    

    需要修改为:

    LayoutInflater.from(context).inflate(R.layout.item, parent, false)
    

    就可以了,最终效果图就是:

    在这里插入图片描述

    在这里插入图片描述

    完整版代码:https://github.com/fan0424/RecyclerViewGroupDemo

    教程结束!

    番外一:根据点击child获取真实的position

        /**
         * 获取真实位置
         * @param section
         * @param position 如果是标题栏,为-1
         * @return
         */
        private int getRealPosition(int headerPosition, int ContentPositionForHeader){
            int realPosition = -1;
            if(headerPosition!= -1){
    
                realPosition = 0;
    
                for (int i = 0; i < headerPosition; i++) {
                    realPosition++;
                    realPosition += getContentCountForHeader(i);
                }
    
                realPosition++;
    
                realPosition += ContentPositionForHeader;
            }
    
            return realPosition;
        }
    
    展开全文
  • 不同QQ版本 顺序会不一样(记住) 建议使用同一个版本的QQ,否则QQ分组会打乱的.QQ2008应该是按名称或者音序排列的 非得要在QQ2008下使用分组~解决办法:在分组全可以加上数字 1 2 3 4 5 6 7 8 9 。。。或者A B C D E...
  • 效果如下:【穿着婚纱】Wearingaweddingdre【带着笑容】Withasmile【踩过泥土】Steppingontheearth【走向坟墓】Tothegraveyard【爱情的坟墓】Thetomboflove——————————————————————————...

    效果如下:

    e5ea3a568e06e10310a966af4dba28b7.png

    【穿着婚纱】

    Wearing a wedding dre

    【带着笑容】

    With a smile

    【踩过泥土】

    Stepping on the earth

    【走向坟墓】

    To the graveyard

    【爱情的坟墓】

    The tomb of love

    ——————————————————————————————————————

    回忆正在删除中

    请稍后...

    ┏━━━━━━┓

    ┃▉▉▉ 99.9%┃

    ┗━━━━━━┛

    删除成功〈

    ╔┈╗

    │心│  ╔┈╗

    │不│  │则│

    │动│  │不│

    ╚┈╝  │痛│

    ╚┈╝

    ——————————————————————————————————————

    ∩_∞

    (●.●)

    --

    ﹎亲爱的

    ㄟ你只能属于我

    ゆゆゆ"

    〔我的唯一〕

    ╱︶︶︶︶゛

    ——————————————————————————————————————

    /\/\

    \/

    ╭⌒⌒╮

    ╰傻瓜╯

    ㄍ﹎。牵着你手

    是否可以

    ▼▼▼

    一起

    ︶ ̄到世界的终结

    ——————————————————————————————————————

    ━❤❤━━━━━

    ┏╮/╱℡

    ╰★ ╮

    ╱/╰┛

    拉拉手¢

    ⺌﹏说好一起走

    爱琴海的誓言¢

    永不磨灭

    ━━━━━❤❤━

    ——————————————————————————————————————

    让我为你写一首诗

    ════════

    ┇ ┇ ┇ ┇

    ◆ ┇ ┇ ┇

    ◆ ┇ ┇

    ◆ ┇

    诉说ノ

    属于我们旳浪漫。

    ——————————————————————————————————————

    ╭──────╮

    ╰──────╯

    最美的

    〈执子之手〉

    〈与子偕老〉

    不是说说

    桃子和阿狸的结合

    便是特例

    ▼▼▼▼▼▼

    ——————————————————————————————————————

    ▓▓▓▓▓▓

    这些人 很陌生゜

    这些人 很现实゜

    这一群 不解释゜

    这些人 永远的゜

    这个人 永不变゜

    ——————————————————————————————————————

    [fish have a heart]

    鱼有一颗心i

    [Only seven seconds]

    唯有七秒情i

    [cat has nine lives]

    猫有九条命i

    [Only one heart]

    唯有一颗心

    ——————————————————————————————————————

    ≮放纵、沉沦≯

    ≮虚假、颓废≯

    ≮卑微、落幕≯

    ____残留旳记忆ゝ

    ____残缺旳画面ゝ

    回忆正在删除中

    请稍后.......

    ┏━━━━━━┓

    ——————————————————————————————————————

    ≮放纵、沉沦≯

    ≮虚假、颓废≯

    ≮卑微、落幕≯

    ____残留旳记忆ゝ

    ____残缺旳画面ゝ

    回忆正在删除中

    请稍后.......

    ┏━━━━━━┓

    ┃▉▉▉ 99.9%┃

    ┗━━━━━━┛

    展开全文
  • 两个类,一个是一级的类,一个是级的类直接贴上 package com.mogujie.tt.ui.model;import com.chad.library.adapter.base.entity.AbstractExpandableItem; import ...

    首先配置什么的。点击这里

    代码:
    两个类,一个是一级的类,一个是二级的类

    直接贴上

     package com.mogujie.tt.ui.model;
    
    import com.chad.library.adapter.base.entity.AbstractExpandableItem;
    import com.chad.library.adapter.base.entity.MultiItemEntity;
    import com.mogujie.tt.ui.adapter.FenZuAdapter;
    
    /**
     * Created by luoxw on 2016/8/10.
     * 第一组
     */
    public class Level0Item extends AbstractExpandableItem<Person> implements MultiItemEntity {
        public String title;
        public String subTitle;//标记
    
        public Level0Item( String title, String subTitle) {
            this.subTitle = subTitle;
            this.title = title;
        }
    
        @Override
        public int getItemType() {
            return FenZuAdapter.TYPE_LEVEL_0;
        }
    
        @Override
        public int getLevel() {
            return 1;
        }
    }
    
    
    package com.mogujie.tt.ui.model;
    
    import com.chad.library.adapter.base.entity.MultiItemEntity;
    import com.mogujie.tt.ui.adapter.FenZuAdapter;
    
    /**
     * Created by luoxw on 2016/8/10.
     * 第二组
     */
    
    public class Person implements MultiItemEntity{
        public String name;
    
        public Person(String name) {
            this.name = name;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        @Override
        public int getItemType() {
            return FenZuAdapter.TYPE_PERSON;
        }
    }
    

    适配器

     package com.mogujie.tt.ui.adapter;
    
    import android.content.Context;
    import android.view.View;
    
    import com.chad.library.adapter.base.BaseMultiItemQuickAdapter;
    import com.chad.library.adapter.base.BaseViewHolder;
    import com.chad.library.adapter.base.entity.MultiItemEntity;
    import com.mogujie.tt.ui.model.Level0Item;
    import com.mogujie.tt.ui.model.Person;
    import com.sankeyun.bb.R;
    
    import java.util.List;
    
    /**
     * Created by ${CWJ} on 2017/8/2.
     * 描述: 分组activity
     */
    
    public class FenZuAdapter extends BaseMultiItemQuickAdapter<MultiItemEntity, BaseViewHolder> {
        private Context context;
        public static final int TYPE_LEVEL_0 = 0;
        public static final int TYPE_PERSON = 1;
        /**
         * Same as QuickAdapter#QuickAdapter(Context,int) but with
         * some initialization data.
         *
         * @param data A new list is created out of this one to avoid mutable list
         */
        public FenZuAdapter(List<MultiItemEntity> data) {
            super(data);
            addItemType(TYPE_LEVEL_0, R.layout.item_head);
            addItemType(TYPE_PERSON, R.layout.item_item);
    //        addItemType(TYPE_PERSON, R.layout.item_expandable_lv2);
        }
        @Override
        protected void convert(final BaseViewHolder helper, final MultiItemEntity item) {
            switch (helper.getItemViewType()) {
                case TYPE_LEVEL_0:
                    final Level0Item lv0 = (Level0Item) item;
                    helper.setText(R.id.head_name, lv0.title)//父布局标题
                            .setText(R.id.subTitle_name, lv0.subTitle);//下标
    //                        .setImageResource(R.id.head_iv, lv0.isExpanded() ? R.drawable.arrow_b : R.drawable.arrow_r)
                    helper.itemView.setOnClickListener(new View.OnClickListener() {
                        @Override
                        public void onClick(View v) {
                            int pos = helper.getPosition();
    //                        Log.d(TAG, "Level 0 item pos: " + pos);
                            if (lv0.isExpanded()) {
                                collapse(pos);
                            } else {
    //                            if (pos % 3 == 0) {
    //                                expandAll(pos, false);
    //                            } else {
                                expand(pos);
    //      }
                            }
                        }
                    });
                    break;
                case TYPE_PERSON:
                    Person person = (Person) item;
                    helper.setText(R.id.item_name, person.getName());
    //                helper.itemView.setOnClickListener(new View.OnClickListener() {
    //                    @Override
    //                    public void onClick(View view) {
    //                        int cp = getParentPosition(person);
    //                        ((Level0Item) getData().get(cp)).removeSubItem(person);
    //                        getData().remove(helper.getClickPosition());
    //                        notifyItemRemoved(helper.getClickPosition());
    //                    }
    //                });
                    break;
            }
        }
    
    }
    

    显示页面
    我这里是Fragment

    package com.mogujie.tt.ui.fragment;
    
    import android.os.Bundle;
    import android.support.v4.app.Fragment;
    import android.support.v7.widget.LinearLayoutManager;
    import android.support.v7.widget.RecyclerView;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    
    import com.chad.library.adapter.base.entity.MultiItemEntity;
    import com.mogujie.tt.ui.adapter.FenZuAdapter;
    import com.mogujie.tt.ui.model.Level0Item;
    import com.mogujie.tt.ui.model.Person;
    import com.sankeyun.bb.R;
    
    import java.util.ArrayList;
    import java.util.List;
    
    public class AddressBooksFragment_item extends Fragment {
        private FenZuAdapter adapter;
        private List<MultiItemEntity> list;
        private RecyclerView recyclerView;
        /**
         * @param args
         * Fragment 中的Fragment
         * 这里要承载 四种类型的Aapater
         */
        private String title;
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                 Bundle savedInstanceState) {
            View v = inflater.inflate(R.layout.fragment_address_books_item, container, false);
            recyclerView= (RecyclerView) v.findViewById(R.id.address_rl);
            //设置 recyclerView
    //        final GridLayoutManager manager=new GridLayoutManager(getActivity(),2);
    //        manager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
    //            @Override
    //            public int getSpanSize(int i) {
    //                return adapter.getItemViewType(i)==FenZuAdapter.TYPE_PERSON ? 0:manager.getSpanCount();
    //            }
    //        });
            recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
            initView();
            return v;
        }
    
       <!-- //公共方法 获取Fragment
        public static Fragment getFragment(Bundle bundle) {
            AddressBooksFragment_item transactionDetailFragment = new AddressBooksFragment_item();
            transactionDetailFragment.setArguments(bundle);
            return transactionDetailFragment;
        }-->
    
        //获取数据
       private ArrayList<MultiItemEntity> getDat(){
           int lv0Count = 5;
           int personCount = 5;
           ArrayList<MultiItemEntity> res = new ArrayList<>();
           Person p=new Person("人类");
           for (int i = 0; i < lv0Count; i++) {//设置外层数据
               Level0Item lv0 = new Level0Item( "第",i+"组");
               for (int k = 0; k < personCount; k++) {
                   //设置内层数据
                   lv0.addSubItem(i,p);
               }
               res.add(lv0);
           }
           return res;
        }
        public void initView() {
        //只看这个企业通讯录里面的
            list=new ArrayList<>();
            list=getDat();
            //adapter 初始化。
            title = getArguments().getString("address_type");
            if (title.equals("企业通讯录")) {
                adapter=new FenZuAdapter(list);
                recyclerView.setAdapter(adapter);
    //            adapter.expandAll();//默认展开全部 不写就不展开
    
            } else if (title.equals("群组")) {
    
            } else if (title.equals("讨论组")) {
    
            } else {//常用联系人
    
            }
        }
    }
    

    还有两个布局

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="horizontal" android:layout_width="match_parent"
        android:background="@color/bg_color"
        android:id="@+id/head_layout"
        android:layout_height="wrap_content">
        <TextView
            android:id="@+id/head_name"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="父布局名称"
            android:textColor="@color/font_default_color"
            android:gravity="center|left"
            />
        <TextView
            android:id="@+id/subTitle_name"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="父布局名称"
            android:textColor="@color/font_default_color"
            android:gravity="center|left"
            />
    </LinearLayout>
    
    
    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/item_layout"
        android:background="@color/group_manager_user_title"
        android:orientation="vertical">
        <TextView
            android:id="@+id/item_name"
            android:layout_width="match_parent"
            android:layout_height="40dp"
            android:gravity="center|left"
            android:layout_marginLeft="10dp"
            android:textColor="@color/font_qianhei_color"
            android:text="子布局Name" />
    </LinearLayout>

    最后效果图:
    有点丑。不过实现了。

    展开全文
  • 先直接上图, 1:、展开的效果图: 2:后面的是点击收缩的效果图。...我们要定义2个集合用来存储数据,一个是groupItem的数据,一个是childItem的数据 ...// 分组名称 public List>> childList = new
  • QQMenuQQ侧滑菜单,右滑菜单,QQ展开菜单,QQ好友分组GitHub: https://github.com/Zws-China/QQMenuPhotoShootHow To Use//右滑菜单 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:...
  • JavaWeb 模拟QQ分组功能

    2018-11-12 09:40:14
    一、需求场景  页面数据分组,点击当前,其他关闭,当前展开。点击每下面的任意一条消息,进入详情页面,可以对数据进行处理。在数据60秒刷新一次,计算未读...、后台提供封装后的数据如下: [Mess...
  • 但一个简单又唯美的的扣扣分组,一定比默认的要舒服一些,多少也会让你的qq分组变得更加好看,一带英文的qq分组也会多少提升你的知识涵养,更加使你的qq分组变得有个性。现在我们来看看小编整理的扣扣分组名称简单...
  • 类似QQ分组的样子,实现tableView的折叠与展开。其实要做这个效果我先想到的是在tableView中再嵌套多个tableView,这个想法实现起来就有点难了。 所以还是换个思路,把tableView的HeaderView用上了。给headerView...
  • 下面就来看看能够表达爱意、带心形符号或者心形图案的qq分组名称有哪些?qq分组心形图案一颗心很多人希望自己的分组名称足够独特,而带符号的分组名是绝大多数人的首选,以下小编也分享一些带心形的分组名称。┇╭╭...
  • 分组名称唯美简短的下面小编在今天就为大家带来qq分组名称供大家选择,让大家挑选到一个简单又唯美的分组名称。分组名称唯美简短的゛昔素颜 -______海深不蓝。————————————————夏之日冬之夜百岁之后...
  • 一、求和与求平均1、什么是函数函数就是我们前面我说过的多行函数。它主要针对表进行操作。因为只有表中,才有多行数据。下面我们以SUM和AVG这两个函数为例,先从它们开始,介绍函数的特性。2、SUM 求和函数...
  • 在我们的项目开发过程中,经常会对用户的信息进行分组,即通过来显示用户的信息,同时通过一定的查询条件来显示查询后的相关用户信息,并且通过颜色选择器来设置列表信息的背景颜色,实现仿QQ分组列表显示以及查询...
  • 这是QQ2011BETA3的替换文件可用作替换里面的 皮肤和分组名称
  • QQ分组控件的简单实现

    千次阅读 2009-09-23 16:58:00
    原文:http://blog.csdn.net/rabbitguiming/archive/2009/05/03/4144278.aspx QQ的上下拉的抽屉式控件估计已经深入民心了。课程设计作业需要,花了半天时间写了一个类似的控件,可以实现对每个抽屉按钮设置不同的...
  • QQ好友分组:一个好友里有多个好友,一个好友只能选择一个,这样好友和好友之间就是一个一对多的关系。在此程序中封装一个好友类即Buddy类,一个类即Group类。在Buddy类有有关好友的最基本的信息姓名和年龄...
  • Android 高仿QQ 好友分组列表

    千次阅读 2014-05-08 13:53:20
    Android 高仿QQ 好友分组列表 [复制链接]     愤怒的小鸟 版主 TA的每日心情 开心 2013-9-3 11:05:05 签到天数: 16 天 ...
  • Android仿QQ好友列表分组实现增删改及持久化Demo
  • 上图我创建了一个DropDown,相关属性我就不说了,我讲讲怎么添加事件,和设置名称 我根据项目需求,选中后主标题是不会变化的,所以把CaptionText 控件置为空,这样我们就可以单独控制改文字的更改。 我的项目需求
  • 我们点击展开与折叠分组的功能在库里面是已经封装好的,只能把它已入到项目中,就可以直接用了,十分的方便。 下面直接上核心代码 首先定义分组的对象,相当于上面红色字体的对象,跟分组下每个item的对象; 创建...
  • 我主要讲述的是用listview实现、模仿qq好友分组点击收缩、扩展功能 这个是对listview的拓展,用法比较相似,还是需要一个适配器 MainActivity public class MainActivity extends Activity { private ...
  • 现在的手机软件是越来越多,但是...分组名称唯美简单四字不知大家是否也和小编一样喜欢设置唯美、简单一点的分组名称呢?是的话可以从以下一些四字分组名中进行挑选哦。❀[ 时光难变 ]❀[ 世人难辨 ]❀[ 暮光难凉 ]...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 24,827
精华内容 9,930
关键字:

qq分组名称2组