当前位置:首页 > 技术知识 > 正文内容

ExpandListView 的一种巧妙写法(三十的另一种写法)

maynowei9个月前 (08-02)技术知识171

ExpandListView大家估计也用的不少了,一般有需要展开的需求的时候,大家不约而同的都想到了它

然后以前自己留过记录的一般都会找找以前自己的代码,没有记录习惯的就会百度、谷歌,这里吐槽一下,好几次发现用百度搜索一个知识点的时候,一页都是一样的答案,能不能抄袭出一点水平,咱改一个字也可以呀!!原封不动的抄袭,还不带参考链接!!废话不多说了,先上效果图吧!!

原生的ExpandListView的问题

  1. 父条目展开的时候,图标的变化!!原生的是丑陋的箭头,而且位置我们也不好控制!!

  2. 展开的子条目如果也需要我给出的效果图一样的效果….我们不能很方便的定义子条目的视图

灵光一现的解决办法

核心思想: 把陌生的领域转化为我们熟悉的领域里解决

通俗的说法就是,把我们不好控制的父条目和子条目,换成自己的可以控制的View,我们就可以像平时一样操控UI,来实现我们的需求!!

父条目图标的变换问题

  • 首先要将ExpandListView的默认的箭头图标取消

<ExpandableListView

android:id="@+id/expand_lv_main"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:divider="@null"

android:dividerHeight="0.5dp"

android:groupIndicator="@null"

android:scrollbars="none"

/>

  • 为了实现我们父条目展开和未展开的图标变换,可以通过isExpanded的属性来判断。

/**

* 自定义组

*/public View getGroupView(final int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {

....省略代码

if (!isExpanded) {

mIvItem.setImageResource(R.drawable.group_plus);

mLineShow.setVisibility(View.INVISIBLE);

RelativeLayout.LayoutParams layoutParams = (RelativeLayout.LayoutParams) diliver_group.getLayoutParams();

layoutParams.leftMargin = DimenUtils.dp2px(mContext, 0);

diliver_group.setLayoutParams(layoutParams);

} else {

mIvItem.setImageResource(R.drawable.group_sub);

mLineShow.setVisibility(View.VISIBLE);

RelativeLayout.LayoutParams layoutParams = (RelativeLayout.LayoutParams) diliver_group.getLayoutParams();

layoutParams.leftMargin = DimenUtils.dp2px(mContext, 46);

diliver_group.setLayoutParams(layoutParams);

}

....省略代码

return view;

}

子条目的处理

这也是我要分享这个巧妙写法的最重要的一环,就是将子条目返回为的数量写死为1,然后返回ListView,就是将不熟悉的问题转换为我们熟悉的问题上,这就很好处理了吧!!重要代码如下

/**

* 返回值必须为1,否则会重复数据

*/

public int getChildrenCount(int groupPosition) { return 1;

}

然后子条目返回为ListView

/**

* 自定义子条目

*/public View getChildView(int groupPosition, int childPosition,

// ...数据的添加

convertView = View.inflate(parentContext, R.layout.follow_view, null);

lv_follow = (FollowListView) convertView.findViewById(R.id.lv_follow);

mMAdapter = new MyAdapter(data);

lv_follow.setAdapter(mMAdapter);// 设置菜单Adapter

return convertView;

}12345678910111234567891011

因为展开会出现错误,需要将ListView进行处理一下,重写一下测量的方法

public class FollowListView extends ListView {

public FollowListView(android.content.Context context,

android.util.AttributeSet attrs) { super(context, attrs);

} /**

* 设置不滚动

*/

public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2,

MeasureSpec.AT_MOST); super.onMeasure(widthMeasureSpec, expandSpec);

}

}

然后大工告成!!!

源码地址

  • 欢迎Follow和Star,如果对你有帮助的话

https://github.com/StudyLifeTime/YUIUtils

相关文章

Win10系统除了移植Objective C,还要有Swift

IT之家讯Build2015大会最让人震惊的莫属微软推出工具,Win10系统可以移植安卓/iOS应用,特别是后者使用的Objective C编程语言,不过最新消息表明,微软连苹果最新的Swift移植也...

Android主流UI开源库整理(android完整开源项目)

前言最近老大让我整理一份 Android主流UI开源库 的资料,以补充公司的Android知识库。由于对格式不做特别限制,于是打算用博客的形式记录下来,方便查看、防丢并且可以持续维护、不断更新。标题隐...

Linux C++实现多线程同步的四种方式(超级详细)

背景问题:在特定的应用场景下,多线程不进行同步会造成什么问题?通过多线程模拟多窗口售票为例:#include <iostream>#include<pthread.h>#inc...

不需安装oracleclient连接oracle数据库方案

在Oracle官方发布ODP.net之前,我们通常使用微软的System.data.OracleClient进行Oracle数据库操作,它的缺点是必须要装Oracle客户端OracleClient,如...

python-oracledb——利用python连接Oracle数据库的好用方法

这篇文章最早发布在CSDN了,最近想尝试使用一下头条,重新转移过来了。背景介绍之前使用的数据库一直是MySql,偶尔使用PostgreSQL,都是利用的数据库连接池使用;最近需要在Oracle数据库取...

ORA-12514 TNS 监听程序当前无法识别连接描述符中请求服务

早上同事用PL/SQL连接虚拟机中的Oracle数据库,发现又报了“ORA-12514 TNS 监听程序当前无法识别连接描述符中请求服务”错误,帮其解决后,发现很多人遇到过这样的问题,因此写着这里。也...