++++++++++++++++++++效果一++++++++++++++++++++++++++++++
activity_app_helper.xml
<LinearLayout 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" android:orientation="vertical" > <LinearLayout android:id="@+id/ll_helper_top" android:layout_width="fill_parent" android:layout_height="48dp" android:background="@drawable/top_bg" > <LinearLayout android:id="@+id/ll_helper_return" android:layout_width="wrap_content" android:layout_height="48dp" android:gravity="center_vertical" > <ImageView android:layout_width="25dp" android:layout_height="25dp" android:background="@drawable/selector_top_return" android:padding="5dp" /> <TextView android:id="@+id/tv_top_content" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="3dp" android:text="帮助中心" android:textColor="#ffffff" android:textSize="20dp" /> </LinearLayout> </LinearLayout> <ExpandableListView android:id="@+id/expandablelistview_helper" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_weight="1" android:background="#ebebe9" android:cacheColorHint="#00000000" android:divider="@null" android:groupIndicator="@null" android:listSelector="#00000000" /> <ImageView android:layout_width="fill_parent" android:layout_height="wrap_content" android:background="@drawable/helper_line" /> <View android:layout_width="fill_parent" android:layout_height="20dp" android:background="#ebebe9" /> </LinearLayout>
<?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" android:orientation="vertical" > <TextView android:background="@drawable/helper_selector_listview" android:id="@+id/parent_textview" android:layout_width="match_parent" android:layout_height="45dp" android:textColor="#111111" android:textSize="16sp" android:text="xxxxx" android:paddingLeft="17dp" android:gravity="center_vertical" /> <ImageView android:id="@+id/iv_helper_line" android:layout_width="fill_parent" android:layout_height="wrap_content" android:background="@drawable/helper_line" /> </LinearLayout>
apphelper_children.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" android:orientation="vertical" > <TextView android:id="@+id/second_textview" android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center_vertical" android:paddingLeft="33dp" android:paddingRight="17dp" android:paddingBottom="10dp" android:textColor="#666666" android:lineSpacingExtra="7sp" android:textSize="14dp" android:background="#ebebe9" android:text="safsdfsdfsdhe呵呵呵呵好 萨芬打算林凤娇阿斯利康解放路卡死机的路口附近开始拉大家弗兰卡死机的快乐放假啊塑料袋解放看来撒大家弗兰卡死机打开xxx"/> <ImageView android:layout_width="fill_parent" android:layout_height="wrap_content" android:background="@drawable/helper_line" /> </LinearLayout>
<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:drawable="@color/background_bg9" android:state_pressed="true"/> <item android:drawable="@color/background_bg2"/> </selector>
AppHelperActivity
package com.godinsec.seland.ui.help; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.widget.BaseExpandableListAdapter; import android.widget.ExpandableListView; import android.widget.ExpandableListView.OnGroupExpandListener; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.TextView; import com.godinsec.seland.CASApplication; import com.godinsec.seland.R; import com.godinsec.seland.ui.BaseActivity; import com.godinsec.seland.utils.CASIntent; public class AppHelperActivity extends BaseActivity implements OnClickListener { private LinearLayout ll_helper_return; private ExpandableListView expandablelistview_helper; private LinearLayout ll_helper_top; // 父亲 List<String> parent = null; Map<String, List<String>> map = null; private MyAdapter adapter; private View godinServiceHeaderView; @Override protected void handleReceiver(Context context, Intent intent) { super.handleReceiver(context, intent); String action = intent.getAction(); if (CASIntent.INTENT_LOAD_SD.equals(action)) { if (!CASApplication.getInstance().isSDLoaded()) { ll_helper_top.setBackgroundResource(R.drawable.contact_1_top); } else { ll_helper_top.setBackgroundResource(R.drawable.contact_top); } } } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_app_helper); registerReceiver(new String[] { CASIntent.INTENT_LOAD_SD }); initView(); if (!CASApplication.getInstance().isSDLoaded()) { ll_helper_top.setBackgroundResource(R.drawable.contact_1_top); } else { ll_helper_top.setBackgroundResource(R.drawable.contact_top); } initData(); adapter = new MyAdapter(); expandablelistview_helper.setAdapter(adapter); ll_helper_return.setOnClickListener(this); expandablelistview_helper .setOnGroupExpandListener(new OnGroupExpandListener() { @Override public void onGroupExpand(int groupPosition) { for (int i = 0; i < adapter.getGroupCount(); i++) { if (groupPosition != i) { expandablelistview_helper.collapseGroup(i); } } } }); } class MyAdapter extends BaseExpandableListAdapter { private ImageView iv_helper_parentLine; @Override public int getGroupCount() { return parent.size(); } @Override public int getChildrenCount(int groupPosition) { String key = parent.get(groupPosition); int size = map.get(key).size(); return size; } @Override public Object getGroup(int groupPosition) { return parent.get(groupPosition); } @Override public Object getChild(int groupPosition, int childPosition) { String key = parent.get(groupPosition); return (map.get(key).get(childPosition)); } @Override public long getGroupId(int groupPosition) { return groupPosition; } @Override public long getChildId(int groupPosition, int childPosition) { return childPosition; } @Override public boolean hasStableIds() { return true; } @Override public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) { if (convertView == null) { LayoutInflater inflater = (LayoutInflater) AppHelperActivity.this .getSystemService(Context.LAYOUT_INFLATER_SERVICE); convertView = inflater.inflate(R.layout.apphelper_parent, null); } TextView tv = (TextView) convertView .findViewById(R.id.parent_textview); iv_helper_parentLine = (ImageView) convertView .findViewById(R.id.iv_helper_line); tv.setText(AppHelperActivity.this.parent.get(groupPosition)); iv_helper_parentLine.setVisibility(View.VISIBLE); return convertView; } @Override public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) { String key = AppHelperActivity.this.parent.get(groupPosition); String info = map.get(key).get(childPosition); if (convertView == null) { LayoutInflater inflater = (LayoutInflater) AppHelperActivity.this .getSystemService(Context.LAYOUT_INFLATER_SERVICE); convertView = inflater.inflate(R.layout.apphelper_children, null); } TextView tv = (TextView) convertView .findViewById(R.id.second_textview); ImageView iv_helper_line = (ImageView) convertView .findViewById(R.id.iv_helper_line); tv.setText(info); iv_helper_parentLine.setVisibility(View.GONE); return convertView; } @Override public boolean isChildSelectable(int groupPosition, int childPosition) { return false; } } /** 获取数据 */ private void initData() { parent = new ArrayList<String>(); List<HelpItem> helps = null; try { helps = HelpGetUtils.getHelpInfo(this); for (int i = 0; i < helps.size(); i++) { String question = helps.get(i).getQuestion(); parent.add(question); } } catch (Exception e1) { e1.printStackTrace(); } map = new HashMap<String, List<String>>(); for (int i = 0; i < helps.size(); i++) { List<String> list = new ArrayList<String>(); String answer = helps.get(i).getAnswer(); String question = helps.get(i).getQuestion(); list.add(answer); map.put(question, list); } } /** 初始化控件集合 */ private void initView() { ll_helper_return = (LinearLayout) findViewById(R.id.ll_helper_return); // 控件 expandablelistview_helper = (ExpandableListView) findViewById(R.id.expandablelistview_helper); ll_helper_top = (LinearLayout) findViewById(R.id.ll_helper_top); godinServiceHeaderView = View.inflate(this, R.layout.app_helper_topview, null); expandablelistview_helper.addHeaderView(godinServiceHeaderView); } /** 处理事件 */ @Override public void onClick(View v) { switch (v.getId()) { case R.id.ll_helper_return: finish(); break; default: break; } } }
package com.godinsec.seland.ui.help; import java.io.InputStream; import java.util.ArrayList; import java.util.List; import org.xmlpull.v1.XmlPullParser; import android.content.Context; import android.util.Xml; public class HelpGetUtils { public static List<HelpItem> getHelpInfo(Context mContext) throws Exception{ List<HelpItem> helps = null; InputStream is = mContext.getAssets().open("help_item.xml"); HelpItem item = null; XmlPullParser parser = Xml.newPullParser(); parser.setInput(is, "UTF-8"); int eventType = parser.getEventType(); while(eventType != XmlPullParser.END_DOCUMENT){ switch (eventType) { case XmlPullParser.START_DOCUMENT: helps = new ArrayList<HelpItem>(); break; case XmlPullParser.START_TAG: if(parser.getName().equals("Help")){ item = new HelpItem(); }else if(parser.getName().equals("question")){ item.setQuestion(parser.nextText()); }else if(parser.getName().equals("answer")){ item.setAnswer(parser.nextText()); } break; case XmlPullParser.END_TAG: if(parser.getName().equals("Help")){ helps.add(item); item = null; } break; } eventType = parser.next(); } return helps; } }
package com.godinsec.seland.ui.help; public class HelpItem { private String question; private String answer; public String getQuestion() { return question; } public void setQuestion(String question) { this.question = question; } public String getAnswer() { return answer; } public void setAnswer(String answer) { this.answer = answer; } @Override public String toString() { return "HelpItem [question=" + question + ", answer=" + answer + "]"; } }
<?xml version="1.0" encoding="utf-8"?> <Helps> <Help> <question>如何开启/关闭密锁?</question> <answer>该应用的大部分功能都需要密锁开启状态才可以使用。点击屏幕上带有开锁/关锁图案的浮动按钮可以开启或关闭密锁。当密锁处于开启状态时,点击浮动按钮可以关闭密锁;当密锁处于关闭状态时,点击浮动按钮可以开启密锁。</answer> </Help> <Help> <question>密锁对手势密码的输入错误尝试有什么规定?</question> <answer>要成功开启密锁需要输入正确的手势密码,手势密码输入错误次数不可超过8次,第8次输入错误,密卡将被锁死,只能返厂重置,如果没有密卡,是软加密用户,则应用将被锁死,所有数据清除并且无法恢复,除非您已将数据备份到云端。 手势密码在第一次使用该应用时要求设置,请牢记手势密码,您可以在设置中重设手势密码,如果手势密码忘记,可以通过手势密码找回问题来找回。</answer> </Help> <Help> <question>如何快速关闭密锁</question> <answer>锁屏动作可以关闭密锁,您可以立即锁屏来关闭密锁。</answer> </Help> <Help> <question>如何从系统通讯录导入联系人?</question> <answer>点击通讯录首页联系人列表屏幕底部页签栏上的添加联系人图标可以打开系统通讯录列表. 您可以勾选多个联系人或者全选联系人,然后点击屏幕底部的导入图标,将选中的联系人从系统通讯录导入。</answer> </Help> <Help> <question>如何查看密友/全部联系人?</question> <answer>在通讯录首页联系人列表界面,点击屏幕顶部的应用栏上的密友图标可以在查看密友和查看全部联系人之间切换。</answer> </Help> <Help> <question>如何手动刷新密友通讯录</question> <answer>在通讯录首页联系人列表界面,当列表已滑动显示到第一条,继续向下滑动屏幕可以刷新密友通讯录。</answer> </Help> <Help> <question>如何拨打加密通话?</question> <answer>点击屏幕底部页签栏上的拨号盘图标切换到通话记录首页,然后点击通话记录界面底部的拨号图标调出拨号盘,输入密友号码可以拨打加密通话。</answer> </Help> <Help> <question>如何查看某位密友的所有加密通话?</question> <answer>在查看密友详情页面,点击 查看通话记录 菜单,可以查看该密友的所有加密通话。</answer> </Help> <Help> <question>如何发送加密信息?</question> <answer>点击屏幕底部页签栏上的信息图标切换到信息列表首页,然后点击界面底部的新建信息图标打开新建信息界面,即可发送加密信息。</answer> </Help> <Help> <question>如何切换加密短信和加密即时聊天</question> <answer>在新建信息界面或者回复信息界面,屏幕底部信息输入栏前面有加密短信和加密即时聊天切换图标,点击该图标可以切换。</answer> </Help> <Help> <question>如何查看加密的信息?</question> <answer>如果密锁未开启,应用程序未在安全模式下,无法查看加密的信息,您可以点击屏幕上带有开锁图案的浮动按钮开启密锁即可查看。</answer> </Help> <Help> <question>如何移除密友通讯录里的联系人?</question> <answer>在通讯录首页联系人列表界面,向左或向右滑动某位联系人,可以选择移除,该动作只是从密友通讯录移除,并不会删除系统通讯录里的联系人。</answer> </Help> <Help> <question>如何把被移除的联系人再添加回密友通讯录?</question> <answer>点击通讯录首页联系人列表屏幕底部页签栏上的添加联系人图标可以打开系统通讯录列表,选择已被移除的联系人再次导入。 或者也可以在通讯录联系人列表界面,点击应用栏上的 更多 按钮,选择 “重置密友” 菜单。“重置密友”菜单将清空密友通讯录,然后重新将系统通讯录中所有密友导入进来。</answer> </Help> <Help> <question>如何邀请朋友成为密友</question> <answer>在查看联系人详情页面,点击 查看通话记录 菜单,可以查看该密友的所有加密通话。</answer> </Help> <Help> <question>如何判断通讯录好友是否已注册为密友</question> <answer>如果在查看联系人列表或联系人详情时,在联系人头像边缘带有“M”标记,则表示该联系人已注册为密友。</answer> </Help> <Help> <question>如何判断密友是否在线?</question> <answer>如果在查看联系人列表或联系人详情时,联系人头像边缘的“M”标记呈灰色,则表示该联系人不在线。</answer> </Help> <Help> <question>如何发送加密语音信息?</question> <answer>在新建信息界面或者回复信息界面,切换到发送加密即时聊天,点击信息输入栏旁边的 展开 图标打开功能按钮,选择语音。</answer> </Help> <Help> <question>如何发送图片,文件或名片?</question> <answer>在新建信息界面或者回复信息界面,切换到发送加密即时聊天,点击信息输入栏旁边的 展开 图标打开功能按钮,选择图片,或文件或名片。</answer> </Help> <Help> <question>如何转发信息?</question> <answer>在查看信息详情界面,长触某条信息,会从屏幕底部滑出菜单,点击 转发 菜单可以将该条信息转发给其他联系人。</answer> </Help> <Help> <question>如何群发信息?</question> <answer>查看通讯录联系人时,长按联系人可以进入多选模式,您可以勾选多个联系人,然后点击屏幕底端的群发信息图标。 在新建信息时,您可以点击收件人输入框右侧的联系人图标打开通讯录进行多选。</answer> </Help> <Help> <question>如何设置登录时不显示密友信息和通话记录</question> <answer>如果您希望登录进入密联应用界面以后,密友信息和通话记录不直接显示,您可以在设置中开启 信息隐藏 选项。点击应用栏上的 更多 按钮,可以找到 设置 菜单。</answer> </Help> <Help> <question>如何备份重要信息?</question> <answer>点击应用栏上的 更多 按钮,可以找到 备份 菜单。</answer> </Help> <Help> <question>如何导入已备份的信息?</question> <answer>点击应用栏上的 更多 按钮,可以找到 导入 菜单。</answer> </Help> </Helps>
+++++++++++++++++++++++++++++++++++效果二+++++++++++++++++++++++++++++++++++++
activity_main.xml
<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=".MainActivity" > <ExpandableListView android:id="@+id/main_expandablelistview" android:layout_width="match_parent" android:layout_height="wrap_content" android:groupIndicator="@drawable/group_icon_selector" /> </RelativeLayout>group_icon_selector.xml
<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:drawable="@drawable/emoji_85" android:state_expanded="true"/> <item android:drawable="@drawable/emoji_86"/> </selector>
<?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" android:orientation="vertical" > <TextView android:id="@+id/parent_textview" android:layout_width="match_parent" android:layout_height="50dp" android:layout_gravity="center" android:gravity="center" /> </LinearLayout>
<?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" android:orientation="vertical" > <TextView android:id="@+id/second_textview" android:layout_width="match_parent" android:layout_height="40dp" android:layout_gravity="center" android:gravity="center" /> </LinearLayout>
package com.example.expandablelistview; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import android.app.Activity; import android.content.Context; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseExpandableListAdapter; import android.widget.ExpandableListView; import android.widget.TextView; public class MainActivity extends Activity { ExpandableListView mainlistview = null; List<String> parent = null; Map<String, List<String>> map = null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //获取ExpandableListView mainlistview = (ExpandableListView) this .findViewById(R.id.main_expandablelistview); //初始化数据 initData(); //设置适配器 mainlistview.setAdapter(new MyAdapter()); } // 初始化数据 public void initData() { parent = new ArrayList<String>(); parent.add("parent1"); parent.add("parent2"); parent.add("parent3"); map = new HashMap<String, List<String>>(); List<String> list1 = new ArrayList<String>(); list1.add("child1-1"); list1.add("child1-2"); list1.add("child1-3"); map.put("parent1", list1); List<String> list2 = new ArrayList<String>(); list2.add("child2-1"); list2.add("child2-2"); list2.add("child2-3"); map.put("parent2", list2); List<String> list3 = new ArrayList<String>(); list3.add("child3-1"); list3.add("child3-2"); list3.add("child3-3"); map.put("parent3", list3); } class MyAdapter extends BaseExpandableListAdapter { //得到子item需要关联的数据 @Override public Object getChild(int groupPosition, int childPosition) { String key = parent.get(groupPosition); return (map.get(key).get(childPosition)); } //得到子item的ID @Override public long getChildId(int groupPosition, int childPosition) { return childPosition; } //设置子item的组件 @Override public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) { String key = MainActivity.this.parent.get(groupPosition); String info = map.get(key).get(childPosition); if (convertView == null) { LayoutInflater inflater = (LayoutInflater) MainActivity.this .getSystemService(Context.LAYOUT_INFLATER_SERVICE); convertView = inflater.inflate(R.layout.children, null); } TextView tv = (TextView) convertView .findViewById(R.id.second_textview); tv.setText(info); return tv; } //获取当前父item下的子item的个数 @Override public int getChildrenCount(int groupPosition) { String key = parent.get(groupPosition); int size=map.get(key).size(); return size; } //获取当前父item的数据 @Override public Object getGroup(int groupPosition) { return parent.get(groupPosition); } @Override public int getGroupCount() { return parent.size(); } @Override public long getGroupId(int groupPosition) { return groupPosition; } //设置父item组件 @Override public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) { if (convertView == null) { LayoutInflater inflater = (LayoutInflater) MainActivity.this .getSystemService(Context.LAYOUT_INFLATER_SERVICE); convertView = inflater.inflate(R.layout.parent, null); } TextView tv = (TextView) convertView .findViewById(R.id.parent_textview); tv.setText(MainActivity.this.parent.get(groupPosition)); return tv; } @Override public boolean hasStableIds() { return true; } @Override public boolean isChildSelectable(int groupPosition, int childPosition) { return true; } } }
+++++++++++++++++++++++++++++++案例二++++++++++++++++++++++++++++++++++