android ExpandableListView使用

jerry Android 2015年11月23日 收藏

今天给大家讲讲android的目录实现方法,就像大家看到的小说目录一样,android 提供了ExpandableListView控件可以实现二级列表展示效果,现在给大家讲讲这个控件的用法,下面是XML定义:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout
  3. xmlns:android="http://schemas.android.com/apk/res/android"
  4. android:layout_width="fill_parent"
  5. android:layout_height="fill_parent"
  6. android:orientation="vertical"
  7. android:background="#FFFFFF"
  8. >
  9. <ExpandableListView
  10. android:id="@+id/elv_journal_catalog"
  11. android:layout_height="fill_parent"
  12. android:layout_width="fill_parent"
  13. android:cacheColorHint="#FFFFFF"
  14. />
  15. </LinearLayout>

这代码很简单,和写listView的方法差不多,接下来是ExpandableListView在activity中的代码:

  1. private ExpandableListView elv_journal_catalog;
  2. private List<List<Article>> childrenObj;
  3. private JournalCatalogListAdapter adapter;
  4. public void onCreate(Bundle savedInstanceState) {
  5. super.onCreate(savedInstanceState);
  6. setContentView(R.layout.journal_catalog);
  7. init();
  8. elv_journal_catalog.setGroupIndicator(null);
  9. elv_journal_catalog.setDivider(null);
  10.  
  11. loadData();
  12. }
  13.  
  14. private void init() {
  15. elv_journal_catalog = (ExpandableListView) findViewById(R.id.elv_journal_catalog);
  16. elv_journal_catalog.setOnChildClickListener(listener);
  17. }
  18. private void loadData() {
  19. Message msg = handler.obtainMessage();
  20. msg.what = 1;
  21. msg.sendToTarget();
  22.  
  23. childrenObj = new ArrayList<List<Article>>();
  24. new Thread() {
  25.  
  26. @Override
  27. public void run() {
  28. if (!isLoading) {
  29. queryArticleList();
  30. } else {
  31. queryArticleListFromSqlite();
  32. }
  33. }
  34.  
  35. }.start();
  36.  
  37. adapter = new JournalCatalogListAdapter(this, childrenObj);
  38. elv_journal_catalog.setAdapter(adapter);
  39. }

ExpandableListView展示数据的时候默认是每个模块下的列表项是闭合状态的,如果要实现初始化的时候就展开可以通过ExpandableListView.expandGroup(location)方法来实现,而且每个父级列表项左边会出现一个系统自带的图标,这个图标是用来表示列表展开和闭合的状态的,如果不显示或者要替换这个图标可以用ExpandableListView.setGroupIndicator(Drawable icon)方法来实现,我这里是直接是没有使用任何图标,你也可以在adapter中自己在xml中定义自己的图标.

ExpandableListView填充数据需要是二级菜单的模式所以数据结构大家可以根据项目情况而定,我这里由于标题是定死的所以只传的每个标题下的数据,下面是JournalCatalogListAdapter的代码:

  1. public class JournalCatalogListAdapter extends BaseExpandableListAdapter {
  2.  
  3. private LayoutInflater inflater;
  4.  
  5. private String[] parent = new String[] { "美颜美体", "潮流单品", "娱乐八卦", "情感",
  6. "观点", "健康生活" };
  7.  
  8. private List<List<Article>> clildren = new ArrayList<List<Article>>();
  9.  
  10. public JournalCatalogListAdapter(Context context,
  11. List<List<Article>> clildren) {
  12. this.clildren = clildren;
  13. inflater = LayoutInflater.from(context);
  14. }
  15.  
  16. @Override
  17. public Object getChild(int groupPosition, int childPosition) {
  18. return clildren.get(groupPosition).get(childPosition);
  19. }
  20.  
  21. @Override
  22. public long getChildId(int groupPosition, int childPosition) {
  23. return childPosition;
  24. }
  25.  
  26. @Override
  27. public View getChildView(int groupPosition, int childPosition,
  28. boolean isLastChild, View convertView, ViewGroup parent) {
  29. if (convertView == null) {
  30. convertView = inflater.inflate(
  31. R.layout.journal_catalog_list_item_content, null);
  32. }
  33. TextView textView = (TextView) convertView
  34. .findViewById(R.id.tv_journal_catalog_list_item_content);
  35. Article a = (Article) getChild(groupPosition, childPosition);
  36. textView.setText(a.getTitle());
  37. return convertView;
  38. }
  39.  
  40. @Override
  41. public int getChildrenCount(int groupPosition) {
  42. return clildren.get(groupPosition).size();
  43. }
  44.  
  45. @Override
  46. public Object getGroup(int groupPosition) {
  47. return parent[groupPosition];
  48. }
  49.  
  50. @Override
  51. public int getGroupCount() {
  52. return parent.length;
  53. }
  54.  
  55. @Override
  56. public long getGroupId(int groupPosition) {
  57. return groupPosition;
  58. }
  59.  
  60. @Override
  61. public View getGroupView(int groupPosition, boolean isExpanded,
  62. View convertView, ViewGroup parent) {
  63. if (convertView == null) {
  64. convertView = inflater.inflate(
  65. R.layout.journal_catalog_list_item_title, null);
  66. }
  67. TextView textView = (TextView) convertView
  68. .findViewById(R.id.tv_journal_catalog_list_item_title);
  69.  
  70. String title = String.valueOf(getGroup(groupPosition));
  71. textView.setText(title);
  72. convertView.setOnClickListener(null);
  73. return convertView;
  74. }
  75.  
  76. @Override
  77. public boolean hasStableIds() {
  78. return true;
  79. }
  80.  
  81. @Override
  82. public boolean isChildSelectable(int groupPosition, int childPosition) {
  83. return true;
  84. }
  85. }