expandablelistview详解[通俗易懂]

expandablelistview详解[通俗易懂]我在项目中使用到expandablelistview,然后我就在网上找了很多关于expandablelistview的文章,那么这里,将一些对去进行总结一些,并将自己踩过的坑填上。expandablelistview就是类似QQ分组,点击分类,显示其各个详细的分类信息。下面是一些效果图这样是完成了有父标题,和子标题,实现了分组,接下来看看如何布局的。

大家好,又见面了,我是你们的朋友全栈君。

我在项目中使用到expandablelistview,然后我就在网上找了很多关于expandablelistview的文章,那么这里,将一些对去进行总结一些,并将自己踩过的坑填上。

expandablelistview就是类似QQ分组,点击分类,显示其各个详细的分类信息。下面是一些效果图

expandablelistview详解[通俗易懂]

expandablelistview详解[通俗易懂]

这样是完成了有父标题,和子标题,实现了分组,接下来看看如何布局的。

<ExpandableListView
    android:id="@+id/exlistview"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:drawSelectorOnTop="false"
    android:groupIndicator="@null"
    android:cacheColorHint="@color/colorAccent"/>

看这个属性android:drawSelectorOnTop

android:drawSelectorOnTop="true"  点击某一条记录,颜色会显示在最上面,记录上的文字被遮住,所以点击文字不放,文字就看不到

android:drawSelectorOnTop="false" 点击某条记录不放,颜色会在记录的后面,成为背景色,但是记录内容的文字是可见的

去掉ExpandableListView 默认的箭头 
用到ExpandableListView时有个箭头图标系统自带的在你自定义布局也不能去掉只要设置一个属性即可,如下: 
settingLists.setGroupIndicator(null); ~~~~~~~~~~~~~~~~~此处就是设置自定义的箭头图标的。置空则没有了。  
也可以自定义(但是位置还是在那个地方不推荐)如下: 
首先,自定义一个expandablelistviewselector.xml文件,具体内容如下: Java代码

<?xml version="1.0" encoding="utf-8"?>   
<selector xmlns:android="http://schemas.android.com/apk/res/android">   
     <item android:state_expanded="true" android:drawable="@drawable/expandablelistviewindicatordown" />   
      <item android:drawable="@drawable/expandablelistviewindicator" />  
 </selector>   

加一句代码如下: 

settingLists.setGroupIndicator(this.getResources().getDrawable(R.layout.expandablelistviewselector));    
或xml设置:  
 android:groupIndicator="@drawable/groupIndicator_selector"  

将默认的箭头修改到右边显示: 
1首先ExpandableListViewelistview;  

elistview.setGroupIndicator(null);//将控件默认的左边箭头去掉,

 2在自定义的继承自BaseExpandableListAdapter的adapter中有一个方法。需要在自己的布局文件中添加一个ImageView,然后根据展开或者是关闭来设置不同的箭头的方法。如下代码:

/** * 父类view */ @Override   
public View getGroupView(intgroupPosition, booleanisExpanded, View convertView, ViewGroup parent)  
{ Log.i("zhaoxiong","parent view");   
     LinearLayoutparentLayout=(LinearLayout) View.inflate(context, R.layout.wowocoupons_parent_item, null);   
    TextViewparentTextView=(TextView)parentLayout.findViewById(R.id.parentitem);  
    parentTextView.setText(parentlist.get(groupPosition));   
    ImageViewparentImageViw=(ImageView) parentLayout.findViewById(R.id.arrow);   
    //判断isExpanded就可以控制是按下还是关闭,同时更换图片  
   if(isExpanded){   
       parentImageViw.setBackgroundResource(R.drawable.arrow_down);   
    }else{   
        parentImageViw.setBackgroundResource(R.drawable.arrow_up); }    
     return parentLayout;  
}  

展示Group

有时候,我们需要列表是展开的,默认是关闭的,可以在系统中设置exListView.expandGroup(0);展示第一个父列

如果想要所有的都展示 写下如何代码:

exListView.setAdapter(exlvAdapter);   
//遍历所有group,将所有项设置成默认展开  
 intgroupCount = exListView.getCount();   
for (inti=0; i<groupCount; i++)  
 {   
       exListView.expandGroup(i);  
 };   

同样它也有点击事件,它的点击事件有两种,
setOnGroupClickListener()//点击父列表的时候触发该事件

setOnChildClickListener()//点击子列表的时候触发该事件。
不想要系统设置的分割线,设置exListView.setDivider(null);  
属性和方法都介绍了,接下来展示一个例子,这个例子是平常见到的,类似QQ的分组显示。
main.xml文件
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.ice.expandablelistviewdemo.MainActivity">

    <ExpandableListView
        android:id="@+id/exlistview"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:drawSelectorOnTop="false"
        android:groupIndicator="@null"
        android:cacheColorHint="@color/colorAccent"/>
</RelativeLayout>

父标题和子项的布局文件,如下:

item_parent.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="70dp"
    android:gravity="center">

    <View
        android:id="@+id/line_view"
        android:layout_width="match_parent"
        android:layout_height="20dp"
        android:background="#D7D7D7"/>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="horizontal"
        android:layout_below="@+id/line_view"
        android:gravity="center">
    <TextView
        android:id="@+id/parent_title"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="2016年5月"
        android:textSize="18sp"
        android:textColor="#000000"
        android:layout_gravity="center"/>

    <ImageView
        android:id="@+id/parent_image"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:paddingLeft="24dp"/>
    </LinearLayout>
</RelativeLayout>

item_child.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <View
        android:id="@+id/line_view1"
        android:layout_width="match_parent"
        android:layout_height="1dp"
        android:layout_marginLeft="8dp"
        android:layout_marginRight="8dp"
        android:background="@android:color/darker_gray"/>

    <RelativeLayout
        android:id="@+id/rl_daiyu"
        android:layout_width="match_parent"
        android:layout_height="48dp"
        android:gravity="center_vertical"
        android:layout_below="@+id/line_view1">

        <TextView
            android:id="@+id/daiyu"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="待遇类型"
            android:textSize="16dp"
            android:layout_marginLeft="48dp"/>

        <TextView
            android:id="@+id/daiyu_content"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="失业保险金"
            android:textSize="16dp"
            android:layout_alignParentRight="true"
            android:layout_marginRight="48dp"/>

    </RelativeLayout>

    <View
        android:id="@+id/line_view2"
        android:layout_width="match_parent"
        android:layout_height="1dp"
        android:background="@android:color/darker_gray"
        android:layout_marginLeft="8dp"
        android:layout_marginRight="8dp"
        android:layout_below="@+id/rl_daiyu"/>

    <RelativeLayout
        android:id="@+id/rl_linqu"
        android:layout_width="match_parent"
        android:layout_height="48dp"
        android:gravity="center_vertical"
        android:layout_below="@+id/line_view2">

        <TextView
            android:id="@+id/linqu"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="待遇领取方式"
            android:textSize="16dp"
            android:layout_marginLeft="48dp"/>

        <TextView
            android:id="@+id/linqu_content"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="定期"
            android:textSize="16dp"
            android:layout_alignTop="@+id/linqu"
            android:layout_alignParentEnd="true"
            android:layout_marginEnd="95dp"/>

    </RelativeLayout>
</RelativeLayout>

接下来看看适配器,该适配器继承了BaseExpandableListAdapter,其中有很多方法,从代码来看更直接。其实可以将其当做两个List,一个标题ListView,还有一个是内容ListView.适配器就是两个BaseAdapter。这样理解后,下面的代码就可以看得更清晰。


public class ExpandListViewAdapter extends BaseExpandableListAdapter{

    private List<String> titleList;

    private List<List<ExpandListBean>> expandList;

    public void setTitleList(List<String> titleList) {
        this.titleList = titleList;
    }

    public void setExpandList(List<List<ExpandListBean>> expandList) {
        this.expandList = expandList;
    }

    private LayoutInflater mInflater;

    public ExpandListViewAdapter(Context context){
        mInflater = LayoutInflater.from(context);
        titleList = new ArrayList<>();
        expandList = new ArrayList<>();
    }

    //---------------Parent-----------------
    @Override
    public int getGroupCount() {
        return titleList.size();
    }
    @Override
    public Object getGroup(int groupPosition) {
        return titleList.get(groupPosition);
    }

    @Override
    public long getGroupId(int groupPosition) {
        return groupPosition;
    }
    //---------------Parent  EDN-----------------

    //---------------Child start-----------------
    @Override
    public int getChildrenCount(int groupPosition) {
        //判断设置的是否有值(这个判断是在网络请求中出现了异常,没有给expandList设置值,如果在执行expandList.get(groupPosition)是会出现异常。)
        if (!expandList.isEmpty()){
            if (expandList.get(groupPosition).isEmpty()){  //有时候该列表是没有值的,没有值的时候,仅让它显示,并且显示的内容可以设置为(暂无数据)
                return 1;
            }else{
                return expandList.get(groupPosition).size();
            }
        }else{
            return 1;
        }
    }

    @Override
    public Object getChild(int groupPosition, int childPosition) {
        if (!expandList.isEmpty()){             //返回子列的值的时候,只有当子列表中设置了值的时候,才有值返回
            if (!expandList.get(groupPosition).isEmpty()){
                return expandList.get(groupPosition).get(childPosition);
            }
        }
        return null;
    }

    @Override
    public long getChildId(int groupPosition, int childPosition) {
        if (!expandList.isEmpty()){
            if (!expandList.get(groupPosition).isEmpty()){
                return childPosition;
            }
        }
        return 0;
    }
    //---------------Child END-----------------

    @Override
    public boolean hasStableIds() {
        return false;
    }

    @Override
    public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {
        if (convertView == null){
            convertView = mInflater.inflate(R.layout.parent_item,parent,false);
        }

        TextView textView = (TextView) convertView.findViewById(R.id.parent_title);
        ImageView imageView = (ImageView) convertView.findViewById(R.id.parent_image);

        textView.setText(titleList.get(groupPosition));
        if (isExpanded){
            imageView.setBackgroundResource(R.drawable.arrow_bottom);
        }else{
            imageView.setBackgroundResource(R.drawable.arrow_right);
        }

        return convertView;
    }

    @Override
    public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {
        //这里相当于ListView中适配器
        ViewHolder viewHolder = null;
        if (convertView == null){
            convertView = mInflater.inflate(R.layout.child_item,parent,false);

            viewHolder = new ViewHolder();
            viewHolder.daiyuContentTV = (TextView) convertView.findViewById(R.id.daiyu_content);
            viewHolder.linquContentTV = (TextView) convertView.findViewById(R.id.linqu_content);

            convertView.setTag(viewHolder);
        }else{
            viewHolder = (ViewHolder) convertView.getTag();
        }

        //设置值,当有数据的时候,就显示值,没有的时候,就设置为(暂无数据)
        if (!expandList.isEmpty() && !expandList.get(groupPosition).isEmpty()){
            viewHolder.daiyuContentTV.setText(expandList.get(groupPosition).get(childPosition).getDaiyu());
            viewHolder.linquContentTV.setText(expandList.get(groupPosition).get(childPosition).getLiqu());

        }else{
            viewHolder.daiyuContentTV.setText("暂无数据");
            viewHolder.linquContentTV.setText("暂无数据");
        }

        return convertView;
    }

    @Override
    public boolean isChildSelectable(int groupPosition, int childPosition) {
        return true;
    }

    private class ViewHolder{
        private TextView daiyuContentTV;
        private TextView linquContentTV;
    }
}

写一个MainActivity,并写上一些测试数据,来让整个程序运行起来。


public class MainActivity extends AppCompatActivity {

    private List<String> titles ;

    private ExpandableListView mListView;

    private ExpandListViewAdapter mExpandListViewAdapter;

    private List<List<ExpandListBean>> expandList;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        initData();
        initView();
    }

    private void initView(){
        mListView = (ExpandableListView) findViewById(R.id.exlistview);
        mExpandListViewAdapter = new ExpandListViewAdapter(MainActivity.this);
        mExpandListViewAdapter.setTitleList(titles);
        //这里直接设置了值,如果是网络请求,出了设置值外,还需要调用 mExpandListViewAdapter.notifyDataSetChanged();方法来刷新页面
        mExpandListViewAdapter.setExpandList(expandList);

        mListView.setAdapter(mExpandListViewAdapter);
        mListView.setDivider(null);             //设置


        mListView.setOnChildClickListener(new ExpandableListView.OnChildClickListener() {
            @Override
            public boolean onChildClick(ExpandableListView parent, View v, int groupPosition, int childPosition, long id) {
                //点击效果
                Toast.makeText(MainActivity.this, "点击了", Toast.LENGTH_SHORT).show();
                return false;
            }
        });
    }
    //测试数据的显示
    private void initData(){
        titles = new ArrayList<>();
        titles.add("2016年5月");
        titles.add("2016年4月");
        titles.add("2016年3月");
        titles.add("2016年2月");
        titles.add("2016年1月");
        titles.add("2015年12月");

        expandList = new ArrayList<>();
        for (int i = 0; i < 5;i++){
            List<ExpandListBean> list = new ArrayList<>();
            list.add(new ExpandListBean("失业保险" + i,"定期"));
            expandList.add(list);
        }
        expandList.add(new ArrayList<ExpandListBean>());        //这里设置为空值,子列中将显示为暂无数据
    }
}

运行的效果如下

expandablelistview详解[通俗易懂]









版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/150397.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • stimulsoft mysql_【Stimulsoft Reports Java教程】在运行时使用MySQL数据库创建报表

    stimulsoft mysql_【Stimulsoft Reports Java教程】在运行时使用MySQL数据库创建报表此示例项目显示如何使用MySQL字段创建新报表并提取MySQL数据库信息。首先,您需要创建一个新报表并添加MySqlDatabase。在StiMySqlDatabase类的构造函数中,您应该设置数据库名称,别名和连接字符串。publicstaticStiReportcreateReport()throwsClassNotFoundException,SQLException,StiE…

  • JSP对象和JavaBean

    JSP对象和JavaBean1.JSP 客户端请求当浏览器请求一个网页时,它会向网络服务器发送一系列不能被直接读取的信息,因为这些信息是作为HTTP信息头的一部分来传送的,如下图所示:Http请求头对应的内容如下

  • java gb2312中文乱码_Java中文乱码问题(转)

    java gb2312中文乱码_Java中文乱码问题(转)大家在JSP的开发过程中,经常出现中文乱码的问题,可能一至困扰着大家,现把JSP开发中遇到的中文乱码的问题及解决办法写出来供大家参考。首先了解一下Java中文问题的由来:Java的内核和class文件是基于unicode的,这使Java程序具有良好的跨平台性,但也带来了一些中文乱码问题的麻烦。原因主要有两方面,Java和JSP文件本身编译时产生的乱码问题和Java程序于其他媒介交互产生的乱码问题。…

  • pycharm 激活码 2021[在线序列号]

    pycharm 激活码 2021[在线序列号],https://javaforall.cn/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

  • intellij idea输出语句快捷键_常用快捷键大全图片

    intellij idea输出语句快捷键_常用快捷键大全图片其他的快捷键还有很多,象Ctrl+G(跳转到指定行)、Ctrl+F4(关闭当前编辑页面)、Ctrl+F(搜索)等等,这些快捷键由于是各个编辑器都会提供的,而且定义的键位也都差不多,就没什么可说的了;Alt+回车导入包,自动修正Ctrl+N 查找类Ctrl+Shift+N查找文件Ctrl+Alt+L 格式化代码Ctrl+Alt+O优化导入的类和包Alt+Ins

  • 前端开发必备站点汇总

    常用前端手册:http://caniuse.com/http://www.w3school.com.cn/http://www.runoob.com/http://www.css88.com/

    2021年12月28日

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号