一:ExpandableListView
ExpandableListView,是可展开的列表组件的ExpandableListView的用法和ListView非常像,只是其所显示的列表项应该由ExpandableListAdapter提供,下面是它的xml属性及说明:
- childDivider:指定各组内子项列表项之间的分割条
- childIndicator:显示在子列表项旁边的Drawable对象
- groupIndicator:显示在组列表项旁边的Drawable对象
二:效果
三:使用
第一步:新建包,列表中显示的数据是从网络请求过来,并且插入到数据库中
1.Android开发中使用Bean类最多的场景是从网络获取数据,将数据以Bean类组织,Bean类中的数据用于填充UI界面中的控件。此处使用Bean类主要是组织数据方便,便于将其中的数据填充到控件中。
2.biz是Business的缩写,实际上就是控制层,控制层的主要作用就是协调model层和view层直接的调用和转换。能够有效的避免请求直接进行数据库内容调用,而忽略了逻辑处理的部分。实际上biz就起到了一个server服务的角色,很好的沟通了上层和下层直接的转换,避免在model层进行业务处理(代码太混乱,不利于维护)
第二步:代码编写
1.Chapter.java
package com.hanjie.expandablelistview2.bean;
import java.util.ArrayList;
import java.util.List;
public class Chapter {
private int id;
private String name;
public static final String TABLE_NAME = "tb_chapter";
public static final String COL_ID = "_id";
public static final String COL_NAME = "name";
private List<ChapterItem> children = new ArrayList<>();
public Chapter() {
}
public Chapter(int id, String name) {
this.name = name;
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public List<ChapterItem> getChildren() {
return children;
}
public void addChild(ChapterItem child) {
children.add(child);
child.setPid(getId());
}
public void addChild(int id, String childName) {
ChapterItem chapterItem = new ChapterItem(id, childName);
chapterItem.setPid(getId());
children.add(chapterItem);
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
}
2.ChapterItem.java
package com.hanjie.expandablelistview2.bean;
public class ChapterItem {
private int id;
private String name;
private int pid;
public static final String TABLE_NAME = "tb_chapter_item";
public static final String COL_ID = "_id";
public static final String COL_PID = "pid";
public static final String COL_NAME = "name";
public ChapterItem() {
}
public ChapterItem(int id, String name) {
this.name = name;
this.id = id;
}
public int getId() {
return id;
}
public int getPid() {
return pid;
}
public void setPid(int pId) {
this.pid = pId;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
3.ChapterLab.java
package com.hanjie.expandablelistview2.bean;
import java.util.ArrayList;
import java.util.List;
public class ChapterLab {
public static List<Chapter> generateDatas() {
List<Chapter> chapters = new ArrayList<>();
Chapter root1 = new Chapter(1, "Android");
Chapter root2 = new Chapter(2, "IOS");
Chapter root3 = new Chapter(3, "Unity 3D");
Chapter root4 = new Chapter(4, "Cocos2d-x");
root1.addChild(1, "PullToRefresh");
root1.addChild(2, "Android 8.0通知栏解决方案");
root1.addChild(4, "Android 与WebView的js交互");
root1.addChild(8, "Android UiAutomator 2.0 入门实战");
root1.addChild(10, "移动端音频视频入门");
root2.addChild(11, "iOS开发之LeanCloud");
root2.addChild(12, "iOS开发之传感器");
root2.addChild(13, "iOS开发之网络协议");
root2.addChild(14, "iOS之分享集成");
root2.addChild(15, "iOS之FTP上传");
root3.addChild(16, "Unity 3D 翻牌游戏开发");
root3.addChild(17, "Unity 3D基础之变体Transform");
root3.addChild(20, "带你开发类似Pokemon Go的AR游戏");
root3.addChild(21, "Unity 3D游戏开发之脚本系统");
root3.addChild(22, "Unity 3D地形编辑器");
root4.addChild(25, "Cocos2d-x游戏之七夕女神抓捕计划");
root4.addChild(26, "Cocos2d-x游戏开发初体验-C++篇");
root4.addChild(27, "Cocos2d-x全民俄罗斯");
root4.addChild(28, "Cocos2d-x坦克大战");
root4.addChild(30, "新春特辑-Cocos抢红包");
chapters.add(root1);
chapters.add(root2);
chapters.add(root3);
chapters.add(root4);
return chapters;
}
}
4.ChapterBiz.java
package com.hanjie.expandablelistview2.biz;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.AsyncTask;
import android.os.Handler;
import android.os.Looper;
import android.util.Log;
import com.hanjie.expandablelistview2.bean.Chapter;
import com.hanjie.expandablelistview2.bean.ChapterItem;
import com.hanjie.expandablelistview2.dao.ChapterDao;
import