ExpandableListView的使用2:ExpandableListView+SQLite+Json解析+网络下载

上一篇文章讲述了ExpandableListView的基本使用

https://blog.csdn.net/qq_17846019/article/details/83276920

案例2之下的复杂案例的实现:

基于网络,SQLite、json数据的ExpandableListView的实现

先了解几个概念

Biz:(业务逻辑层)

解释:控制层的主要作用就是协调model层和view层直接的调用和转换。能够有效的避免请求直接进行数据库内容调用,而忽略了逻辑处理的部分。实际上biz就起到了一个server服务的角色,很好的沟通了上层和下层直接的转换,避免在model层进行业务处理(代码太混乱,不利于维护)。

  • Dao:(数据访问层)

dao层:dao层叫数据访问层,全称为data access object,属于一种比较底层,一般用于数据库比较基础的操作,具体到对于某个表、某个实体的增删改

  • bean(数据层)

javaBean在MVC设计模型中是model,又称模型层,在一般的程序中,我们称它为数据层,就是用来设置数据的属性和一些行为,然后我会提供获取属性和设置属性的get/set方法JavaBean是一种JAVA语言写成的可重用组件。
所以,我们一般利用bean类来存放一些特定的属性或行为,而不存放值,这样我们就能多次调用bean类中的属性并赋值使用,实现重复使用的功能。

  • utils(工具类)

代码:

源码链接:链接: https://pan.baidu.com/s/1QE483Wm1J-iv82s5DHtDBg 提取码: 25av

下面直接贴代码:

1.布局文件

主布局:activity_main.xml

放置一个ExpandableListView 和一个Button

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

<ExpandableListView
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/id_expandableLv"
    android:childDivider="#414145"
    tools:context=".MainActivity">
</ExpandableListView>

    <Button
        android:id="@+id/id_btn_refresh"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="right|bottom"
        android:layout_margin="20dp"
        android:text="刷新" />
</FrameLayout>

父item的布局item_parent_list.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:orientation="horizontal"
    android:layout_width="match_parent"
    android:layout_height="56dp">
<ImageView
    android:id="@+id/item_parent_iv"
    android:layout_width="30dp"
    android:layout_height="30dp"
    android:layout_marginStart="10dp"
    tools:background="@drawable/indicator_expand"
    android:layout_gravity="center_vertical"/>
<TextView
    android:id="@+id/item_parent_tv"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_marginStart="10dp"
    android:textStyle="bold"
    android:textSize="25dp"
    android:gravity="center_vertical"
    tools:text="Android"/>
</LinearLayout>

子item的布局item_child_list.xml

<?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="match_parent"
    xmlns:tools="http://schemas.android.com/tools"
    android:orientation="horizontal">
    <TextView
        android:id="@+id/item_child_tv"
        android:layout_width="match_parent"
        android:layout_height="40dp"
        android:layout_marginStart="20dp"
        android:gravity="center_vertical"
        android:textSize="20dp"
        android:textStyle="bold"
        tools:text="Andorid....."/>
</LinearLayout>

2.bean类

父item的属性封装类Chapter.java

package com.demo.expandablelistviewdemo.bean;

import java.util.ArrayList;
import java.util.List;

/**
 * 父布局的数据封装
 */
public class Chapter {
    private  String name;
    private  int id;
    private List<ChapterItem> children=new ArrayList<>();
    //数据库的属性
    public static  final String TABLE_NAME="tb_chapter";
    public static  final String COL_ID="_id";
    public static  final String COL_NAME="name";

    public Chapter() {
    }

    public Chapter( int id,String name) {
        this.name = name;
        this.id = id;
    }
    //添加子item1
    public void addChild(ChapterItem child){
        children.add(child);
        child.setPid(getId());
    }
    //添加子item方法2
    public void addChild(int id,String childName){
        ChapterItem chapterItem=new ChapterItem(id,childName);
        chapterItem.setPid(getId());
        children.add(chapterItem);
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public List<ChapterItem> getChildren() {
        return children;
    }

    public void setChildren(List<ChapterItem> children) {
        this.children = children;
    }

    @Override
    public String toString() {
        return "Chapter{" +
                "name='" + name + '\'' +
                ", id=" + id +
                ", children=" + children +
                '}';
    }
}

子item的属性封装类ChapterItem.java

package com.demo.expandablelistviewdemo.bean;

/**
 * 子布局的数据封装
 */
public class ChapterItem {
    private String name;
    private int id;
    private int pid;
    //数据库的属性
    public static final String TABLE_NAME = "tb_chapterItem";
    public static final String COL_ID = "_id";
    public static final String COL_NAME = "name";
    public static final String COL_PID = "pid";

    public ChapterItem() {
    }

    public ChapterItem(int id, String name) {
        this.name = name;
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public int getPid() {
        return pid;
    }

    public void setPid(int pid) {
        this.pid = pid;
    }

    @Override
    public String toString() {
        return "ChapterItem{" +
                "name='" + name + '\'' +
                ", id=" + id +
                ", pid=" + pid +
                '}';
    }
}

3.Dao类

dao层:dao层叫数据访问层,全称为data access object,属于一种比较底层,一般用于数据库比较基础的操作,具体到对于某个表、某个实体的增删改

ChapterDbHelper.java

实现数据库及表的创建

package com.demo.expandablelistviewdemo.dao;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

import com.demo.expandablelistviewdemo.bean.Chapter;
import com.demo.expandablelistviewdemo.bean.ChapterItem;

/**
 * 数据访问层
 */
public class ChapterDbHelper extends SQLiteOpenHelper {
    private static final String DB_NAME = "db_chapter.db";
    private static final int VERSION = 1;
    //单例模式
    private static ChapterDbHelper sInstance;

    public static synchronized ChapterDbHelper getsInstance(Context context) {
        if (sInstance == null)
            sInstance = new ChapterDbHelper(context.getApplicationContext());
        return sInstance;
    }

    public ChapterDbHelper(Context context) {
        super(context, DB_NAME, null, VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        //创建Chapter表
        db.execSQL("create table if not exists " + Chapter.TABLE_NAME +
                "(" +
                Chapter.COL_ID + " integer primary key ," +
                Chapter.COL_NAME + " varchar )");
        //创建ChapterItem表
        db.execSQL("create table if not exists " + ChapterItem.TABLE_NAME +
                "(" +
                ChapterItem.COL_ID + " integer primary key ," +
                ChapterItem.COL_NAME + " varchar," +
                ChapterItem.COL_PID + " integer " +
                ")");
    }

    //版本更新
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

    }
}

 ChapterDao.java

外公布数据库的操作

一个是从数据库加载数据(从缓存中拿数据)loadFromDb()

一个是将网络的数据插入到数据库中(放进缓存)insert2Db()

package com.demo.expandablelistviewdemo.dao;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.util.Log;

import com.demo.expandablelistviewdemo.bean.Chapter;
import com.demo.expandablelistviewdemo.bean.ChapterItem;

import java.util.ArrayList;
import java.util.List;

/**
 * 对外公布数据库的操作
 */
public class ChapterDao {
    //从数据库读取数据,转换成List返回
    public List<Chapter> loadFromDb(Context context) {
        ChapterDbHelper dbHelper = ChapterDbHelper.getsInstance(context);
        //拿到读写数据库的对象
        SQLiteDatabase db = dbHelper.getWritableDatabase();
        //1.query Chapter的表
        List<Chapter> chapterList = new ArrayList<>();
        Cursor cursor = db.rawQuery("select*from " + Chapter.TABLE_NAME, null);
        Chapter chapter = null;
        while (cursor.moveToNext()) {
            //每次遍历生成Chapter对象
            chapter = new Chapter();
            //拿数据
            int id = cursor.getInt(cursor.getColumnIndex(Chapter.COL_ID));
            String name = cursor.getString(cursor.getColumnIndex(Chapter.COL_NAME));
            chapter.setId(id);
            chapter.setName(name);
            chapterList.add(chapter);
        }
        cursor.close();

        //2.query chapterItems的表
        ChapterItem chapterItem = null;
        //遍历上面的结果,拿到pid,因为每一个chapterItem都有对应的pid
        for (Chapter parent : chapterList) {
            int pid = parent.getId();
            Log.e("TAG", "pid=" + pid + "");
            //每次查询出与当前pid相同的chapterItem
            cursor = db.rawQuery("select* from " + ChapterItem.TABLE_NAME +
                            " where " + ChapterItem.COL_PID + "= ?",
                    new String[]{pid + ""});
            Log.e("TAG", "cursor1=" + cursor + "");
            while (cursor.moveToNext()) {
                chapterItem = new ChapterItem();
                //拿数据
                int id = cursor.getInt(cursor.getColumnIndex(ChapterItem.COL_ID));
                String name = cursor.getString(cursor.getColumnIndex(ChapterItem.COL_NAME));
                chapterItem.setId(id);
                chapterItem.setName(name);
                chapterItem.setPid(pid);
                parent.addChild(chapterItem);
            }
            cursor.close();
        }
        return chapterList;
    }

    //缓存数据到db
    public void insert2Db(Context context, List<Chapter> chapterList) {
        if (context == null)
            throw new IllegalArgumentException("context can not be empty ");
        if (chapterList == null || chapterList.isEmpty()) {
            return;
        }
        //拿到ChapterDbHelper的单例对象
        ChapterDbHelper dbHelper = ChapterDbHelper.getsInstance(context);
        //写人数据
        /**getReadableDatabase和getWritableDatabase的区别
         * 1.两个方法都是返回读写数据库的对象,但是当磁盘已经满了时,getWritableDatabase会抛异常,
         * 而getReadableDatabase不会报错,它此时不会返回读写数据库的对象,而是仅仅返回一个读数据库的对象。
         * 2.getReadableDatabase会在问题修复后继续返回一个读写的数据库对象。
         * 3.两者都是数据库操作,可能存在延迟等待,所以尽量不要在主线程中调用。
         */
        //拿到读写数据库的对象
        SQLiteDatabase db = dbHelper.getWritableDatabase();
        //开始事务
        db.beginTransaction();
        //数据库存储 利用ContentValues
        ContentValues contentValues = null;
        //遍历传入的数据
        for (Chapter chapter : chapterList) {
            //1将数据通Chapter封装
            contentValues = new ContentValues();
            contentValues.put(Chapter.COL_ID, chapter.getId());
            contentValues.put(Chapter.COL_NAME, chapter.getName());
            //如果有冲突 如果相同的id name更新了,一般是不能插入,利用这个插入可以解决这个冲突
            db.insertWithOnConflict(Chapter.TABLE_NAME,
                    null,
                    contentValues,
                    SQLiteDatabase.CONFLICT_REPLACE);
            //每一个父Chapter下都有孩子
            List<ChapterItem> children = chapter.getChildren();
            //2.ChapterItem的数据封装
            for (ChapterItem chapterItem : children) {
                contentValues = new ContentValues();
                contentValues.put(ChapterItem.COL_ID, chapterItem.getId());
                contentValues.put(ChapterItem.COL_NAME, chapterItem.getName());
                contentValues.put(ChapterItem.COL_PID, chapter.getId());
                db.insertWithOnConflict(ChapterItem.TABLE_NAME,
                        null,
                        contentValues,
                        SQLiteDatabase.CONFLICT_REPLACE);
            }

        }

        db.setTransactionSuccessful();
        //关闭事务
        db.endTransaction();

    }
}

4.Utils工具类

HttpUtils.java

从网络上下载数据的工具类

记得在AndroidManifest.xml 申请网络权限

<uses-permission android:name="android.permission.INTERNET"/>
package com.demo.expandablelistviewdemo.utils;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;

/**
 * 网络下载的工具类
 */
public class HttpUtils {

    private static final int timeout = 5000;
    private static InputStream is=null;
    private static ByteArrayOutputStream baos=null;
    private static HttpURLConnection conn;

    public static String doGet(String urlStr) {

        try {
            URL url = new URL(urlStr);
            conn = (HttpURLConnection) url.openConnection();
            conn.setReadTimeout(timeout);
            conn.setConnectTimeout(timeout);
            conn.setRequestMethod("GET");
            conn.setRequestProperty("accept", "*/*");
            conn.setRequestProperty("connection", "Keep-Alive");
            if (conn.getResponseCode() == 200) {
                is = conn.getInputStream();
                baos = new ByteArrayOutputStream();
                int len = -1;
                byte[] buf = new byte[512];
                while ((len = is.read(buf)) != -1) {
                    baos.write(buf, 0, len);
                }
                baos.flush();
                return baos.toString();
            }
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        finally {
            //关闭流操作
            if(baos!=null){
                try {
                    baos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
                if (is!=null){
                    try {
                        is.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
                conn.disconnect();
            }
        }
        //发现异常,返回null
        return null;
    }
}

5.Biz业务逻辑层

实现数据显示的逻辑、和网络数据的解析

package com.demo.expandablelistviewdemo.biz;

import android.content.Context;
import android.os.AsyncTask;
import android.util.Log;

import com.demo.expandablelistviewdemo.bean.Chapter;
import com.demo.expandablelistviewdemo.bean.ChapterItem;
import com.demo.expandablelistviewdemo.dao.ChapterDao;
import com.demo.expandablelistviewdemo.utils.HttpUtils;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.util.ArrayList;
import java.util.List;

/**
 * 业务逻辑层
 */
public class ChapterBiz {
    private ChapterDao mChapterDao = new ChapterDao();

    public void loadDatas(final Context context, final CallBack callBack, boolean useCache) {
        AsyncTask<Boolean, Void, List<Chapter>> asyncTask = new AsyncTask<Boolean, Void, List<Chapter>>() {
            private Exception ex;

            //后台线程,进行下载操作
            @Override
            protected List<Chapter> doInBackground(Boolean... booleans) {
                //拿到入参就是第一个 参数
                boolean isUseCache = booleans[0];
                //返回
                List<Chapter> chapterList = new ArrayList<>();
                try {
                    //判断是否要从缓存中拿数据
                    if (isUseCache) {
                        // load data from db
                        List<Chapter> chapterListFromDb = mChapterDao.loadFromDb(context);
                        Log.e("TAG", "chapterListFromDb=" + chapterListFromDb);
                        chapterList.addAll(chapterListFromDb);
                    }
                    //如果chapterList为空则缓存中没有数据,则进行网络下载
                    //load from net
                    if (chapterList.isEmpty()) {
                        //load from net
                        List<Chapter> chapterListFromNet = loadFromNet(context);
                        //cache to db
                        //从网络下载数据后将数据插入数据库
                        mChapterDao.insert2Db(context, chapterListFromNet);
                        chapterList.addAll(chapterListFromNet);
                    }
                } catch (Exception ex) {
                    ex.printStackTrace();
                    this.ex = ex;
                }
                return chapterList;
            }

            //UI线程。通过传入的callBack返回结果到(MainActivity)UI线程
            @Override
            protected void onPostExecute(List<Chapter> chapters) {
                super.onPostExecute(chapters);
                if (ex != null) {//如果发生异常,将ex传出去(UI线程)
                    callBack.loadFailed(ex);
                    return;
                }
                //正常情况下,将我们下载后的数据传出去
                callBack.loadSuccess(chapters);
            }
        };

        asyncTask.execute(useCache);
    }

    //从网络上下载数据
    //记得添加网络权限
    private List<Chapter> loadFromNet(Context context) {
        List<Chapter> chapterList = new ArrayList<>();
        String url = "http://www.wanandroid.com/tools/mockapi/2/mooc-expandablelistview";
        //1.发请求获取String数据
        String content = HttpUtils.doGet(url);
        Log.e("Tag", "content=" + content);
        //2.content——>List<Chapter>
        if (content != null) {
            chapterList = parseContent(content);
            Log.e("Tag", "parse finish chapterList=" + chapterList);
        }
        return chapterList;
    }

    //解析Json数据将从网络的数据转换成List<Chapter> 格式
    private List<Chapter> parseContent(String content) {
        List<Chapter> chapterList = new ArrayList<>();
        try {
            //最外层JSON
            JSONObject root = new JSONObject(content);
            //拿到erroCode get(没有数据会报异常) opt(没有数据返回null)
            int errorCode = root.optInt("errorCode");
            if (errorCode == 0) {
                //拿data data是JsonArray
                JSONArray datajsonArray = root.optJSONArray("data");
                //遍历
                for (int i = 0; i < datajsonArray.length(); i++) {
                    //第一层遍历得到Chapter对象 id /name
                    JSONObject chapterJsonObj = datajsonArray.getJSONObject(i);
                    int id = chapterJsonObj.optInt("id");
                    String name = chapterJsonObj.optString("name");
                    Chapter chapter = new Chapter(id, name);
                    chapterList.add(chapter);

                    //第二层解析 parse chapterItems children是一个数组
                    JSONArray childrenJsonArray = chapterJsonObj.optJSONArray("children");
                    if (childrenJsonArray != null) {
                        for (int j = 0; j < childrenJsonArray.length(); j++) {
                            JSONObject chapterItemJsonObj = childrenJsonArray.getJSONObject(j);
                            int cid = chapterItemJsonObj.optInt("id");
                            String cname = chapterItemJsonObj.optString("name");
                            ChapterItem chapterItem = new ChapterItem(cid, cname);
                            chapter.addChild(chapterItem);
                        }
                    }
                }
            }
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return chapterList;
    }

    //通过CallBack返回数据到UI线程的接口
    public static interface CallBack {
        void loadSuccess(List<Chapter> chapterList);

        void loadFailed(Exception ex);
    }
}

6.UI界面及适配器

ChapterAdapter.java

package com.demo.expandablelistviewdemo.adapter;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseExpandableListAdapter;
import android.widget.ImageView;
import android.widget.TextView;

import com.demo.expandablelistviewdemo.R;
import com.demo.expandablelistviewdemo.bean.Chapter;

import java.util.List;

/**
 * 适配器数据封装
 */
public class ChapterAdapter extends BaseExpandableListAdapter {
    private Context context;//上下文
    private List<Chapter> mData;//显示的数据
    private LayoutInflater mInflater;

    public ChapterAdapter(Context context,List<Chapter> mData) {
        this.mData=mData;
        this.context = context;
        mInflater=LayoutInflater.from(context);
    }

    //父item的数目
    @Override
    public int getGroupCount() {
        return mData.size();
    }

    //每一个父item下子item的数目
    @Override
    public int getChildrenCount(int groupPosition) {
        return mData.get(groupPosition).getChildren().size();
    }

    //父item的位置
    @Override
    public Object getGroup(int groupPosition) {
        return mData.get(groupPosition);
    }

    //每一个父item下子item的位置
    @Override
    public Object getChild(int groupPosition, int childPosition) {
        return mData.get(groupPosition).getChildren().get(childPosition);
    }
    //父item的id
    @Override
    public long getGroupId(int groupPosition) {
        return groupPosition;
    }

    @Override
    public long getChildId(int groupPosition, int childPosition) {
        return childPosition;
    }

    @Override
    public boolean hasStableIds() {
        return false;
    }
    //父item的布局设置
    @Override
    public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {
        ParentViewHolder vh;
        if(convertView==null){
            vh =new ParentViewHolder();
           convertView=mInflater.inflate(R.layout.item_parent_list,parent,false);
            vh.parent_item_iv=convertView.findViewById(R.id.item_parent_iv);
            vh.parent_item_tv=convertView.findViewById(R.id.item_parent_tv);
           convertView.setTag(vh);
       }
       else{
            vh= (ParentViewHolder) convertView.getTag();
       }
        vh.parent_item_tv.setText(mData.get(groupPosition).getName());
        vh.parent_item_iv.setSelected(isExpanded);//是否为展开
        vh.parent_item_iv.setImageResource(R.drawable.indicator_group);
        return convertView;
    }

    //子item的布局设置
    @Override
    public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {
        ChildViewHolder vh;
        if(convertView==null){
            vh =new ChildViewHolder();
            convertView=mInflater.inflate(R.layout.item_child_list,parent,false);
            vh.chlid_item_tv=convertView.findViewById(R.id.item_child_tv);
            convertView.setTag(vh);
        }
        else{
            vh= (ChildViewHolder) convertView.getTag();
        }
        vh.chlid_item_tv.setText(mData.get(groupPosition).getChildren().get(childPosition).getName());
        return convertView;
    }
    //控制child不可点击
    @Override
    public boolean isChildSelectable(int groupPosition, int childPosition) {
        return true;
    }
    private static class ParentViewHolder{
        ImageView parent_item_iv;
        TextView parent_item_tv;
    }
    private static class ChildViewHolder{
        TextView chlid_item_tv;
    }
}

主界面

MainActivity.java

package com.demo.expandablelistviewdemo;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.ExpandableListView;

import com.demo.expandablelistviewdemo.adapter.ChapterAdapter;
import com.demo.expandablelistviewdemo.bean.Chapter;
import com.demo.expandablelistviewdemo.bean.ChapterLab;
import com.demo.expandablelistviewdemo.biz.ChapterBiz;

import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity {

    private ExpandableListView expandableListView;
    private ChapterAdapter madapter;
    private List<Chapter> mDatas = new ArrayList<>();
    private ChapterBiz mChapterBiz = new ChapterBiz();
    private Button refresh_bt;//刷新按钮,将loadData()换成从数据库拿数据

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        expandableListView = findViewById(R.id.id_expandableLv);
        refresh_bt = findViewById(R.id.id_btn_refresh);
        //生成模拟数据
//         mDatas= ChapterLab.generateDatas();
        //拿到回调数据
        //第一次打开从网络打开,设置为true
        loadDatas(true);
        madapter = new ChapterAdapter(this, mDatas);
        expandableListView.setAdapter(madapter);
        initEvents();//添加事件
    }

    //加载数据(拿到onPostExcuteUI线程回调的数据)
    private void loadDatas(boolean useCache) {
        mChapterBiz.loadDatas(this, new ChapterBiz.CallBack() {

            @Override
            public void loadSuccess(List<Chapter> chapterList) {
                mDatas.clear();//每次都要清除一遍,否则会叠加
                mDatas.addAll(chapterList);
                madapter.notifyDataSetChanged();
            }

            @Override
            public void loadFailed(Exception ex) {

            }
        }, useCache);
    }

    private void initEvents() {
        //点击刷新按钮的监听,切换数据显示方式
        refresh_bt.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                loadDatas(false);
            }
        });
        //点击父item的监听
        expandableListView.setOnGroupClickListener(new ExpandableListView.OnGroupClickListener() {
            @Override
            public boolean onGroupClick(ExpandableListView parent, View v, int groupPosition, long id) {
                Log.e("TAG", "onGroupClick groupPosition" + groupPosition + " id=" + id);
                return false;
            }
        });
        //点击子item的监听
        expandableListView.setOnChildClickListener(new ExpandableListView.OnChildClickListener() {

            @Override
            public boolean onChildClick(ExpandableListView parent, View v, int groupPosition, int childPosition, long id) {
                Log.e("TAG", "onChildClick groupPosition" + groupPosition + " childPosition=" + childPosition + " id=" + id);

                return false;
            }
        });
        //点击父item收缩的监听
        expandableListView.setOnGroupCollapseListener(new ExpandableListView.OnGroupCollapseListener() {
            @Override
            public void onGroupCollapse(int groupPosition) {
                Log.e("TAG", "onGroupCollapse groupPosition=" + groupPosition);
            }
        });
        //点击父item展开的监听
        expandableListView.setOnGroupExpandListener(new ExpandableListView.OnGroupExpandListener() {
            @Override
            public void onGroupExpand(int groupPosition) {
                Log.e("TAG", "onGroupExpand groupPosition=" + groupPosition);
            }
        });
    }
}

 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值