Android Studio初学笔记-Day26-ExpandableListVIew(2)

接续昨天,今天要讲的是ExpandableListView的主体拉,首先创一个java档,我命名为MsExpandableListAdapter并implements ExpandableListAdapter,很明显看出来这就是要来设定ExpandableList的Adapter,实作後会出现一堆函数,可以先全部新增,再依自己需求作删减,这里我主要有用到几个比较重要的函数。不过首先先设定好建构元

public class MsExpandableListAdapter implements ExpandableListAdapter {

    private ArrayList<Group> gData;
    private ArrayList<ArrayList<Content>> iData;
    private Context mContext;

    public MsExpandableListAdapter(ArrayList<Group> gData,ArrayList<ArrayList<Content>> iData, Context mContext) {
        this.gData = gData;
        this.iData = iData;
        this.mContext = mContext;
    }

接者以下的函数我都在各个功能旁打上注解了,在函数的名称上也取的很帮助理解其功能。

    //取得组的大小
    @Override
    public int getGroupCount() {
        return gData.size();
    }
    //取得子类的大小
    @Override
    public int getChildrenCount(int groupPosition) {
        return iData.get(groupPosition).size();
    }
    //取的组的资料
    @Override
    public Object getGroup(int groupPosition) {
        return gData.get(groupPosition);
    }
    //取得子类的资料
    @Override
    public Object getChild(int groupPosition, int childPosition) {
        return iData.get(groupPosition).get(childPosition);
    }
    //取得指定组的位置id
    @Override
    public long getGroupId(int groupPosition) {
        return groupPosition;
    }
    //取得指定子类的位置id
    @Override
    public long getChildId(int groupPosition, int childPosition) {
        return childPosition;
    }
    //组和子元素是否有稳定的ID,也就是底层资料的改变不会影响到它们。
    @Override
    public boolean hasStableIds() {
        return true;
    }
    //设定子类别是否可以选择
    @Override
    public boolean isChildSelectable(int groupPosition, int childPosition) {
        return true;
    }

组和子类别的View取得

 private static class ViewHolderGroup{
        private TextView group_name;
    }

    private static class ViewHolderItem{
        private TextView language_name;
    }
    //取得组的View,内包含创建
    @Override
    public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {
        ViewHolderGroup groupHolder;
        //convertView负责存已建立的View
        if(convertView == null){
            convertView = LayoutInflater.from(mContext).inflate(R.layout.language_title,
                                                                parent, false);
            groupHolder = new ViewHolderGroup();
            groupHolder.group_name = (TextView) convertView.findViewById(R.id.title_name);
            convertView.setTag(groupHolder);
        }else{
            groupHolder = (ViewHolderGroup) convertView.getTag();
        }
        groupHolder.group_name.setText(gData.get(groupPosition).getName());
        return convertView;
    }
    //取得子类的View,内包含创建
    @Override
    public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {
        ViewHolderItem itemHolder;
        if(convertView == null){
            convertView = LayoutInflater.from(mContext).inflate(
                    R.layout.language_content, parent, false);
            itemHolder = new ViewHolderItem();
            itemHolder.language_name = (TextView) convertView.findViewById(R.id.content_name);
            convertView.setTag(itemHolder);
        }else{
            itemHolder = (ViewHolderItem) convertView.getTag();
        }
        itemHolder.language_name.setText(iData.get(groupPosition).get(childPosition).getName());
        return convertView;
    }
  • 两个class分别负责放入在前一章layout中分别属於language_title.xml和language_content.xml中的成员。
  • 其实两段的程序码是差不多的,主要差在子类别多了一个子类别的位置。这里我想稍微讲解一下引数View convetView 的部分,其意义是负责储存创建过的view,并透过setTag()做到增加标签的功能,以及透过getTag()来取得标签内容。

最後就是运用前一天的前置作业设定资料并绑上Adapter。

MainActivity.java

public class MainActivity extends AppCompatActivity {
    private ArrayList<Group> gData = null;
    private ArrayList<ArrayList<Content>> iData = null;
    private ArrayList<Content> lData = null;
    private Context mContext;
    private ExpandableListView language_list;
    private MsExpandableListAdapter msAdapter = null;
    private String Title[]={"请选择语言","请选择性别"};
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mContext = MainActivity.this;
        language_list = (ExpandableListView) findViewById(R.id.ep1);
        gData = new ArrayList<Group>();
        iData = new ArrayList<ArrayList<Content>>();
        gData.add(new Group("请选择语言"));
        gData.add(new Group("请选择性别"));

        lData = new ArrayList<Content>();
        lData.add(new Content("繁体中文"));
        lData.add(new Content("英文"));
        lData.add(new Content("法文"));
        lData.add(new Content("日文"));
        lData.add(new Content("韩文"));
        iData.add(lData);
        lData = new ArrayList<Content>();
        lData.add(new Content("男"));
        lData.add(new Content("女"));
        iData.add(lData);

        msAdapter = new MsExpandableListAdapter(gData,iData,mContext);
        language_list.setAdapter(msAdapter);
        //组的按钮事件
        language_list.setOnGroupClickListener(new ExpandableListView.OnGroupClickListener() {
            @Override
            public boolean onGroupClick(ExpandableListView parent, View v, int groupPosition, long id) {
                Toast.makeText(MainActivity.this,Title[groupPosition],Toast.LENGTH_SHORT).show();
                //需 return false 才能展开子类
                return false;
            }
        });
        //子类的按钮事件
        language_list.setOnChildClickListener(new ExpandableListView.OnChildClickListener() {
            @Override
            public boolean onChildClick(ExpandableListView parent, View v, int groupPosition, int childPosition, long id) {
                String select = iData.get(groupPosition).get(childPosition).getName();
                gData.get(groupPosition).setName(select);
                //收起子类栏位
                language_list.collapseGroup(groupPosition);
                return true;
            }
        });
    }
}
  • 这里比较特别的是在ArrayList的部分有看到多层的设定,但其实就是二维阵列,并没有比较复杂。
    ExpandableList的按钮事件有分为组和子类的,比要重要的部份我有加上注解,在设计上其实都蛮直观的,都是透过组的位址和子类的位址来取得或设定,比起Adapter的部分,主程序设计确实相对简单不少。

ExpandableList就大致介绍到这里,谢谢大家。/images/emoticon/emoticon41.gif


<<:  Day 26 - 实战演练 — Notifier 、Notification

>>:  Day 26: 出门前的Cypress 杂记

Day 5:Hello....android world! 建立第一个KMM专案(Android)

Keyword: Android Studio,AVD Manager 到Day6完成第一个KMM专...

[Day 30] 完赛,回顾留下的足迹

铁人赛的精神-毅力 终於来到铁人赛的最後一天,当然要来回顾一下这30天发生的点滴及感想罗~ 从Day...

day19 Kotlin coroutine flow with liveData in MVVM

恩,标题不知道怎麽下成中文 在之前的范例里,示范了如何用coroutine做一次性的网路请求,并交结...

Day 30: 机器学习最终回 网路资源总集合

机器学习最终回 网路资源总集合 那麽也到了我们『Machine Learning With Me ,...

OOCSS 基础介绍 DAY39

OOCSS 也是一种设计模式 它强调两点 结构与样式分离 容器与内容分离 在我们介绍 容器与内容分离...