ExpandableListView的使用

    xiaoxiao2021-03-25  103

    Expandable意思我们理解为可扩展的。需要注意的就是Adapter中各个View的填充。 ExpandableListView使用场景就是类似于QQ上的分组,点击可展开显示列表项,效果图如下:


    需要资源如下:

    左侧头像资源(自行复制加入Drawable文件夹)昵称资源(Strings.xml加入String-array资源)个性签名(Strings.xml加入String-array资源)

    代码如下: res-values下修改Strings.xml

    Strings.xml

    <resources> <string name="app_name">ExpandableListViewDemo</string> <string-array name="list"> <item>我欲乘风(王麻子)</item> <item>勇往直前(刘能)</item> <item>意义(王五)</item> <item>十年(李四)</item> <item>此处应有(张三)</item> <item>无名山(张的)</item> <item>放弃(李总)</item> </string-array> <string-array name="list2"> <item>每一天都是新的开始!!!</item> <item>努力做最好的自己!</item> <item>活着就是做有意义的事。</item> <item>十年之后,我来找你。</item> <item>无话不说</item> <item>一个人</item> <item>没那么简单</item> </string-array> <array name="friend"> <item>我的好友</item> </array> </resources>

    MainActivity.java

    package com.alphathink.qq311; import android.database.DataSetObserver; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.view.Gravity; import android.view.View; import android.view.ViewGroup; import android.widget.AbsListView; import android.widget.ExpandableListAdapter; import android.widget.ExpandableListView; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.RelativeLayout; import android.widget.TextView; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //构造Adapter ExpandableListAdapter adapter = new ExpandableListAdapter() { //获取列表名字 private String[] types = getResources().getStringArray(R.array.friend); //二维数组存储昵称+个性签名 private String[][] names = {getResources().getStringArray(R.array.list), getResources().getStringArray(R.array.list2)}; //头像信息 private int[] pics = new int[]{ R.drawable.image1,R.drawable.image2,R.drawable.image3,R.drawable.image4, R.drawable.image5,R.drawable.image6,R.drawable.image7 }; //定义分组上显示字体信息 private TextView getTextView(){ AbsListView.LayoutParams lp = new AbsListView.LayoutParams( ViewGroup.LayoutParams.MATCH_PARENT,150); TextView textView = new TextView(MainActivity.this); textView.setLayoutParams(lp); textView.setGravity(Gravity.CENTER_VERTICAL); textView.setPadding(120,0,0,0); textView.setTextSize(20); return textView; } //这两个方法是注册和解除注册观察者模式,方便通知数据改变,这里没有用到 @Override public void registerDataSetObserver(DataSetObserver observer) { } @Override public void unregisterDataSetObserver(DataSetObserver observer) { } //获取分组数目 这里type.length = 1,所以只显示一个列表项 @Override public int getGroupCount() { return types.length; } //获取子列表数目 @Override public int getChildrenCount(int groupPosition) { return names[groupPosition].length; } //获取分组名称 @Override public Object getGroup(int groupPosition) { return types[groupPosition]; } //指定位置列表项数据 @Override public Object getChild(int groupPosition, int childPosition) { return names[groupPosition][childPosition]; } //获取组列表id @Override public long getGroupId(int groupPosition) { return groupPosition; } //获取子视图id @Override public long getChildId(int groupPosition, int childPosition) { return childPosition; } //通过设置返回false再getView重量级操作时会执行类似局部刷新的效果来优化响应 @Override public boolean hasStableIds() { return true; } /** * 这个方法获取分组的信息,解析并显示分组的信息,不涉及分组下的子项目 * @param groupPosition * @param isExpanded * @param convertView * @param parent * @return */ @Override public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) { LinearLayout ll = new LinearLayout(MainActivity.this); ll.setOrientation(LinearLayout.HORIZONTAL); TextView textView = getTextView(); textView.setText(getGroup(groupPosition).toString()); ll.addView(textView); return ll; } /** * 这个方法用来显示分组下的子项目信息 * @param groupPosition * @param childPosition * @param isLastChild * @param convertView * @param parent * @return */ @Override public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) { //此处基本上都是利用java代码布置layout布局,以及数据填充等操作,布局设计比较费神,理清思路一层一层来就是 RelativeLayout relativeLayout = new RelativeLayout(MainActivity.this); relativeLayout.setPadding(10,10,10,10); RelativeLayout.LayoutParams a = new RelativeLayout.LayoutParams( ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT); ImageView img = new ImageView(MainActivity.this); img.setPadding(20,10,10,10); img.setImageResource(pics[childPosition]); LinearLayout b = new LinearLayout(MainActivity.this); b.setOrientation(LinearLayout.VERTICAL); relativeLayout.addView(img,a); RelativeLayout.LayoutParams ll = new RelativeLayout.LayoutParams( ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT); ll.setMargins(200,5,0,0); ll.addRule(LinearLayout.VERTICAL); TextView textView = new TextView(MainActivity.this); textView.setText(getChild(groupPosition,childPosition).toString()); TextView textView2 = new TextView(MainActivity.this); //返回+1操作主要是前边定义的数组签名资源在后一项中 textView2.setText(names[groupPosition+1][childPosition]); b.addView(textView,ll); b.addView(textView2,ll); relativeLayout.addView(b); return relativeLayout; } //子选项是否选中 @Override public boolean isChildSelectable(int groupPosition, int childPosition) { return false; } @Override public boolean areAllItemsEnabled() { return false; } @Override public boolean isEmpty() { return false; } @Override public void onGroupExpanded(int groupPosition) { } @Override public void onGroupCollapsed(int groupPosition) { } @Override public long getCombinedChildId(long groupId, long childId) { return 0; } @Override public long getCombinedGroupId(long groupId) { return 0; } }; //配置适配器 ExpandableListView listView = (ExpandableListView) findViewById(R.id.expand_list); listView.setAdapter(adapter); } }

    布局文件只需加入ExpandableListView控件即可 activity_main.xml

    <?xml version="1.0" encoding="utf-8"?> <android.support.constraint.ConstraintLayout 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" tools:context="com.alphathink.qq311.MainActivity"> <ExpandableListView android:id="@+id/expand_list" android:layout_width="368dp" android:layout_height="495dp" tools:layout_editor_absoluteY="8dp" tools:layout_editor_absoluteX="8dp" /> </android.support.constraint.ConstraintLayout>

    源码上传到GitHub:https://github.com/NameSpace5/ExpandableListViewDemo.git

    转载请注明原文地址: https://ju.6miu.com/read-10364.html

    最新回复(0)