可勾选的ExpandableListView


加上checkbox,需求大抵都是:check group, check all his children; if one' group's children all checked, group become checked. ExpandableListView的选中状态没有类似SparseBooleanArray的东东,需要自己维护一个数据结构. 开发上要求点group list item的大多数区域是expand/collapse,仅点checkbox区域是勾选,而点child list item的任意区域都是勾选效果, 可以让列表setOnChildClickListener()。注意ExpandableListAdapter的isChildSelectable()方法一定返回true。

编辑自http://www.allenj.net/?p=3644. 给出干货:

EListAdapter.java

[java]  view plain copy
  1. package com.example.checkableexpandablelistview;  
  2.   
  3. import java.util.ArrayList;  
  4.   
  5. import android.content.Context;  
  6. import android.view.LayoutInflater;  
  7. import android.view.View;  
  8. import android.view.View.OnClickListener;  
  9. import android.view.ViewGroup;  
  10. import android.widget.BaseExpandableListAdapter;  
  11. import android.widget.CheckBox;  
  12. import android.widget.ExpandableListView;  
  13. import android.widget.TextView;  
  14.   
  15. import com.example.aexpandablelist.R;  
  16.   
  17. public class EListAdapter extends BaseExpandableListAdapter implements ExpandableListView.OnChildClickListener {  
  18.       
  19.     private Context context;  
  20.     private ArrayList<Group> groups;  
  21.    
  22.     public EListAdapter(Context context, ArrayList<Group> groups) {  
  23.         this.context = context;  
  24.         this.groups = groups;  
  25.     }  
  26.    
  27.     public Object getChild(int groupPosition, int childPosition) {  
  28.         return groups.get(groupPosition).getChildItem(childPosition);  
  29.     }  
  30.    
  31.     public long getChildId(int groupPosition, int childPosition) {  
  32.         return childPosition;  
  33.     }  
  34.    
  35.     public int getChildrenCount(int groupPosition) {  
  36.         return groups.get(groupPosition).getChildrenCount();  
  37.     }  
  38.    
  39.     public Object getGroup(int groupPosition) {  
  40.         return groups.get(groupPosition);  
  41.     }  
  42.    
  43.     public int getGroupCount() {  
  44.         return groups.size();  
  45.     }  
  46.    
  47.     public long getGroupId(int groupPosition) {  
  48.         return groupPosition;  
  49.     }  
  50.    
  51.     public boolean hasStableIds() {  
  52.         return true;  
  53.     }  
  54.    
  55.     public boolean isChildSelectable(int groupPosition, int childPosition) {  
  56.         return true;  
  57.     }  
  58.    
  59.     /** 設定 Group 資料 */  
  60.     public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {  
  61.         Group group = (Group) getGroup(groupPosition);  
  62.    
  63.         if (convertView == null) {  
  64.             LayoutInflater infalInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);  
  65.             convertView = infalInflater.inflate(R.layout.group_layout, null);  
  66.         }  
  67.    
  68.         TextView tv = (TextView) convertView.findViewById(R.id.tvGroup);  
  69.         tv.setText(group.getTitle());  
  70.    
  71.         // 重新產生 CheckBox 時,將存起來的 isChecked 狀態重新設定  
  72.         CheckBox checkBox = (CheckBox) convertView.findViewById(R.id.chbGroup);  
  73.         checkBox.setChecked(group.getChecked());  
  74.    
  75.         // 點擊 CheckBox 時,將狀態存起來  
  76.         checkBox.setOnClickListener(new Group_CheckBox_Click(groupPosition));  
  77.    
  78.         return convertView;  
  79.     }  
  80.    
  81.     /** 勾選 Group CheckBox 時,存 Group CheckBox 的狀態,以及改變 Child CheckBox 的狀態 */  
  82.     class Group_CheckBox_Click implements OnClickListener {  
  83.         private int groupPosition;  
  84.    
  85.         Group_CheckBox_Click(int groupPosition) {  
  86.             this.groupPosition = groupPosition;  
  87.         }  
  88.    
  89.         public void onClick(View v) {  
  90.             groups.get(groupPosition).toggle();  
  91.    
  92.             // 將 Children 的 isChecked 全面設成跟 Group 一樣  
  93.             int childrenCount = groups.get(groupPosition).getChildrenCount();  
  94.             boolean groupIsChecked = groups.get(groupPosition).getChecked();  
  95.             for (int i = 0; i < childrenCount; i++)  
  96.                 groups.get(groupPosition).getChildItem(i).setChecked(groupIsChecked);  
  97.    
  98.             // 注意,一定要通知 ExpandableListView 資料已經改變,ExpandableListView 會重新產生畫面  
  99.             notifyDataSetChanged();  
  100.         }  
  101.     }  
  102.    
  103.     /** 設定 Children 資料 */  
  104.     public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {  
  105.         Child child = groups.get(groupPosition).getChildItem(childPosition);  
  106.    
  107.         if (convertView == null) {  
  108.             LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);  
  109.             convertView = inflater.inflate(R.layout.child_layout, null);  
  110.         }  
  111.    
  112.         TextView tv = (TextView) convertView.findViewById(R.id.tvChild);  
  113.         tv.setText(child.getFullname());  
  114.    
  115.         // 重新產生 CheckBox 時,將存起來的 isChecked 狀態重新設定  
  116.         CheckBox checkBox = (CheckBox) convertView.findViewById(R.id.chbChild);  
  117.         checkBox.setChecked(child.getChecked());  
  118.    
  119.         // 點擊 CheckBox 時,將狀態存起來  
  120.         checkBox.setOnClickListener(new Child_CheckBox_Click(groupPosition, childPosition));  
  121.    
  122.         return convertView;  
  123.     }  
  124.    
  125.     /** 勾選 Child CheckBox 時,存 Child CheckBox 的狀態 */  
  126.     class Child_CheckBox_Click implements OnClickListener {  
  127.         private int groupPosition;  
  128.         private int childPosition;  
  129.    
  130.         Child_CheckBox_Click(int groupPosition, int childPosition) {  
  131.             this.groupPosition = groupPosition;  
  132.             this.childPosition = childPosition;  
  133.         }  
  134.    
  135.         public void onClick(View v) {  
  136.             handleClick(childPosition, groupPosition);  
  137.         }  
  138.     }  
  139.       
  140.     public void handleClick(int childPosition, int groupPosition) {  
  141.         groups.get(groupPosition).getChildItem(childPosition).toggle();  
  142.           
  143.         // 檢查 Child CheckBox 是否有全部勾選,以控制 Group CheckBox  
  144.         int childrenCount = groups.get(groupPosition).getChildrenCount();  
  145.         boolean childrenAllIsChecked = true;  
  146.         for (int i = 0; i < childrenCount; i++) {  
  147.             if (!groups.get(groupPosition).getChildItem(i).getChecked())  
  148.                 childrenAllIsChecked = false;  
  149.         }  
  150.   
  151.         groups.get(groupPosition).setChecked(childrenAllIsChecked);  
  152.   
  153.         // 注意,一定要通知 ExpandableListView 資料已經改變,ExpandableListView 會重新產生畫面  
  154.         notifyDataSetChanged();  
  155.     }  
  156.   
  157.     @Override  
  158.     public boolean onChildClick(ExpandableListView parent, View v, int groupPosition, int childPosition, long id) {  
  159.         handleClick(childPosition, groupPosition);  
  160.         return true;  
  161.     }  
  162.       
  163. }  

Group.java

[java]  view plain copy
  1. package com.example.checkableexpandablelistview;  
  2.   
  3. import java.util.ArrayList;  
  4.   
  5. public class Group {  
  6.     private String id;  
  7.     private String title;  
  8.     private ArrayList<Child> children;  
  9.     private boolean isChecked;  
  10.    
  11.     public Group(String id, String title) {  
  12.         this.title = title;  
  13.         children = new ArrayList<Child>();  
  14.         this.isChecked = false;  
  15.     }  
  16.    
  17.     public void setChecked(boolean isChecked) {  
  18.         this.isChecked = isChecked;  
  19.     }  
  20.    
  21.     public void toggle() {  
  22.         this.isChecked = !this.isChecked;  
  23.     }  
  24.    
  25.     public boolean getChecked() {  
  26.         return this.isChecked;  
  27.     }  
  28.    
  29.     public String getId() {  
  30.         return id;  
  31.     }  
  32.    
  33.     public String getTitle() {  
  34.         return title;  
  35.     }  
  36.    
  37.     public void addChildrenItem(Child child) {  
  38.         children.add(child);  
  39.     }  
  40.    
  41.     public int getChildrenCount() {  
  42.         return children.size();  
  43.     }  
  44.    
  45.     public Child getChildItem(int index) {  
  46.         return children.get(index);  
  47.     }  
  48. }  



Child.java

[java]  view plain copy
  1. package com.example.checkableexpandablelistview;  
  2.   
  3. public class Child {  
  4.     private String userid;  
  5.     private String fullname;  
  6.     private String username;  
  7.     private boolean isChecked;  
  8.    
  9.     public Child(String userid, String fullname, String username) {  
  10.         this.userid = userid;  
  11.         this.fullname = fullname;  
  12.         this.username = username;  
  13.         this.isChecked = false;  
  14.     }  
  15.    
  16.     public void setChecked(boolean isChecked) {  
  17.         this.isChecked = isChecked;  
  18.     }  
  19.    
  20.     public void toggle() {  
  21.         this.isChecked = !this.isChecked;  
  22.     }  
  23.    
  24.     public boolean getChecked() {  
  25.         return this.isChecked;  
  26.     }  
  27.    
  28.     public String getUserid() {  
  29.         return userid;  
  30.     }  
  31.    
  32.     public String getFullname() {  
  33.         return fullname;  
  34.     }  
  35.    
  36.     public String getUsername() {  
  37.         return username;  
  38.     }  
  39. }  


MainActivity.java

[java]  view plain copy
  1. package com.example.checkableexpandablelistview;  
  2.   
  3. import java.util.ArrayList;  
  4.   
  5. import org.json.JSONArray;  
  6. import org.json.JSONException;  
  7. import org.json.JSONObject;  
  8.   
  9. import android.app.Activity;  
  10. import android.os.Bundle;  
  11. import android.util.Log;  
  12. import android.view.Menu;  
  13. import android.widget.ExpandableListView;  
  14.   
  15. import com.example.aexpandablelist.R;  
  16.   
  17.   
  18. public class MainActivity extends Activity {  
  19.   
  20.     ArrayList<Group> groups;  
  21.     ExpandableListView listView;  
  22.     EListAdapter adapter;  
  23.       
  24.     @Override  
  25.     public void onCreate(Bundle savedInstanceState) {  
  26.         super.onCreate(savedInstanceState);  
  27.         setContentView(R.layout.activity_main);  
  28.   
  29.         groups = new ArrayList<Group>();  
  30.         getJSONObject();  
  31.         listView = (ExpandableListView) findViewById(R.id.listView);  
  32.         adapter = new EListAdapter(this, groups);  
  33.         listView.setAdapter(adapter);  
  34.         listView.setOnChildClickListener(adapter);  
  35.     }  
  36.   
  37.     /** 解悉 JSON 字串 */  
  38.     private void getJSONObject() {  
  39.         String jsonStr = "{'CommunityUsersResult':[{'CommunityUsersList':[{'fullname':'a111','userid':11,'username':'a1'}"  
  40.                 + ",{'fullname':'b222','userid':12,'username':'b2'}],'id':1,'title':'人事部'},{'CommunityUsersList':[{'fullname':"  
  41.                 + "'c333','userid':13,'username':'c3'},{'fullname':'d444','userid':14,'username':'d4'},{'fullname':'e555','userid':"  
  42.                 + "15,'username':'e5'}],'id':2,'title':'開發部'}]}";  
  43.   
  44.         try {  
  45.             JSONObject CommunityUsersResultObj = new JSONObject(jsonStr);  
  46.             JSONArray groupList = CommunityUsersResultObj.getJSONArray("CommunityUsersResult");  
  47.   
  48.             for (int i = 0; i < groupList.length(); i++) {  
  49.                 JSONObject groupObj = (JSONObject) groupList.get(i);  
  50.                 Group group = new Group(groupObj.getString("id"), groupObj.getString("title"));  
  51.                 JSONArray childrenList = groupObj.getJSONArray("CommunityUsersList");  
  52.   
  53.                 for (int j = 0; j < childrenList.length(); j++) {  
  54.                     JSONObject childObj = (JSONObject) childrenList.get(j);  
  55.                     Child child = new Child(childObj.getString("userid"), childObj.getString("fullname"),  
  56.                             childObj.getString("username"));  
  57.                     group.addChildrenItem(child);  
  58.                 }  
  59.   
  60.                 groups.add(group);  
  61.             }  
  62.         } catch (JSONException e) {  
  63.             Log.d("allenj", e.toString());  
  64.         }  
  65.     }  
  66.   
  67.     @Override  
  68.     public boolean onCreateOptionsMenu(Menu menu) {  
  69.         getMenuInflater().inflate(R.menu.activity_main, menu);  
  70.         return true;  
  71.     }  
  72. }  


activity_main.xml

[java]  view plain copy
  1. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  2.     xmlns:tools="http://schemas.android.com/tools"  
  3.     android:layout_width="match_parent"  
  4.     android:layout_height="match_parent" >  
  5.   
  6.     <ExpandableListView  
  7.         android:id="@+id/listView"  
  8.         android:layout_width="match_parent"  
  9.         android:layout_height="wrap_content" >  
  10.     </ExpandableListView>  
  11.   
  12. </RelativeLayout>  

group_layout.xml

[java]  view plain copy
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:layout_width="match_parent"  
  4.     android:layout_height="match_parent"  
  5.     android:orientation="horizontal" >  
  6.   
  7.     <TextView  
  8.         android:id="@+id/tvGroup"  
  9.         android:layout_width="280dp"  
  10.         android:layout_height="45dip"  
  11.         android:gravity="center_vertical|left"  
  12.         android:paddingLeft="45dp"  
  13.         android:textSize="17dip"  
  14.         android:textStyle="bold" >  
  15.     </TextView>  
  16.   
  17.     <CheckBox  
  18.         android:id="@+id/chbGroup"  
  19.         android:layout_width="wrap_content"  
  20.         android:layout_height="wrap_content"  
  21.         android:focusable="false" />  
  22.   
  23. </LinearLayout>  

child_layout.xml

[java]  view plain copy
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:layout_width="match_parent"  
  4.     android:layout_height="match_parent"  
  5.     android:orientation="horizontal" >  
  6.   
  7.     <TextView  
  8.         android:id="@+id/tvChild"  
  9.         android:layout_width="280dp"  
  10.         android:layout_height="45dip"  
  11.         android:gravity="center_vertical"  
  12.         android:paddingLeft="45dp"  
  13.         android:textSize="17dip"  
  14.         android:textStyle="bold" >  
  15.     </TextView>  
  16.   
  17.     <CheckBox  
  18.         android:id="@+id/chbChild"  
  19.         android:layout_width="wrap_content"  
  20.         android:layout_height="wrap_content"  
  21.         android:clickable="false"  
  22.         android:focusable="false" />  
  23.   
  24. </LinearLayout>  
标题SpringBoot智能在线预约挂号系统研究AI更换标题第1章引言介绍智能在线预约挂号系统的研究背景、意义、国内外研究现状及论文创新点。1.1研究背景与意义阐述智能在线预约挂号系统对提升医疗服务效率的重要性。1.2国内外研究现状分析国内外智能在线预约挂号系统的研究与应用情况。1.3研究方法及创新点概述本文采用的技术路线、研究方法及主要创新点。第2章相关理论总结智能在线预约挂号系统相关理论,包括系统架构、开发技术等。2.1系统架构设计理论介绍系统架构设计的基本原则和常用方法。2.2SpringBoot开发框架理论阐述SpringBoot框架的特点、优势及其在系统开发中的应用。2.3数据库设计与管理理论介绍数据库设计原则、数据模型及数据库管理系统。2.4网络安全与数据保护理论讨论网络安全威胁、数据保护技术及其在系统中的应用。第3章SpringBoot智能在线预约挂号系统设计详细介绍系统的设计方案,包括功能模块划分、数据库设计等。3.1系统功能模块设计划分系统功能模块,如用户管理、挂号管理、医生排班等。3.2数据库设计与实现设计数据库表结构,确定字段类型、主键及外键关系。3.3用户界面设计设计用户友好的界面,提升用户体验。3.4系统安全设计阐述系统安全策略,包括用户认证、数据加密等。第4章系统实现与测试介绍系统的实现过程,包括编码、测试及优化等。4.1系统编码实现采用SpringBoot框架进行系统编码实现。4.2系统测试方法介绍系统测试的方法、步骤及测试用例设计。4.3系统性能测试与分析对系统进行性能测试,分析测试结果并提出优化建议。4.4系统优化与改进根据测试结果对系统进行优化和改进,提升系统性能。第5章研究结果呈现系统实现后的效果,包括功能实现、性能提升等。5.1系统功能实现效果展示系统各功能模块的实现效果,如挂号成功界面等。5.2系统性能提升效果对比优化前后的系统性能
在金融行业中,对信用风险的判断是核心环节之一,其结果对机构的信贷政策和风险控制策略有直接影响。本文将围绕如何借助机器学习方法,尤其是Sklearn工具包,建立用于判断信用状况的预测系统。文中将涵盖逻辑回归、支持向量机等常见方法,并通过实际操作流程进行说明。 一、机器学习基本概念 机器学习属于人工智能的子领域,其基本理念是通过数据自动学习规律,而非依赖人工设定规则。在信贷分析中,该技术可用于挖掘历史数据中的潜在规律,进而对未来的信用表现进行预测。 二、Sklearn工具包概述 Sklearn(Scikit-learn)是Python语言中广泛使用的机器学习模块,提供多种数据处理和建模功能。它简化了数据清洗、特征提取、模型构建、验证与优化等流程,是数据科学项目中的常用工具。 三、逻辑回归模型 逻辑回归是一种常用于分类任务的线性模型,特别适用于二类问题。在信用评估中,该模型可用于判断借款人是否可能违约。其通过逻辑函数将输出映射为0到1之间的概率值,从而表示违约的可能性。 四、支持向量机模型 支持向量机是一种用于监督学习的算法,适用于数据维度高、样本量小的情况。在信用分析中,该方法能够通过寻找最佳分割面,区分违约与非违约客户。通过选用不同核函数,可应对复杂的非线性关系,提升预测精度。 五、数据预处理步骤 在建模前,需对原始数据进行清理与转换,包括处理缺失值、识别异常点、标准化数值、筛选有效特征等。对于信用评分,常见的输入变量包括收入水平、负债比例、信用历史记录、职业稳定性等。预处理有助于减少噪声干扰,增强模型的适应性。 六、模型构建与验证 借助Sklearn,可以将数据集划分为训练集和测试集,并通过交叉验证调整参数以提升模型性能。常用评估指标包括准确率、召回率、F1值以及AUC-ROC曲线。在处理不平衡数据时,更应关注模型的召回率与特异性。 七、集成学习方法 为提升模型预测能力,可采用集成策略,如结合多个模型的预测结果。这有助于降低单一模型的偏差与方差,增强整体预测的稳定性与准确性。 综上,基于机器学习的信用评估系统可通过Sklearn中的多种算法,结合合理的数据处理与模型优化,实现对借款人信用状况的精准判断。在实际应用中,需持续调整模型以适应市场变化,保障预测结果的长期有效性。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值