可张开的列表视图(分组)
可扩张列表ExpandableListView的使用:
/* 注意:不能为ExpandableListView控件设置setOnClickListener事件 */ public class MainActivity extends Activity { private ExpandableListView expandableLv; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); expandableLv = (ExpandableListView) findViewById(R.id.expandavleListView); final MyExpandableAdapter myAdapter = new MyExpandableAdapter(); expandableLv.setAdapter(myAdapter); //expandableLv.setGroupIndicator(null);设置组的指示器为空 //子项的点击事件 expandableLv.setOnChildClickListener(new OnChildClickListener() { @Override public boolean onChildClick(ExpandableListView parent, View v, int groupPosition, int childPosition, long id) { //因为适配器里的getChild方法返回的数据为String,所以这里可以直接强转得到 String str=(String) myAdapter.getChild(groupPosition, childPosition); System.out.println("子项的单机事件--"+str); return true; } }); /** * 组的点击事件,该方法会比下面的展开与收缩事件先执行 * 如果返回true,就不会展开列表,也不会执行下面的展开与收缩事件 ,注意这里的v,具体看下面的红色字体 */ expandableLv.setOnGroupClickListener(new OnGroupClickListener() { @Override public boolean onGroupClick(ExpandableListView parent, View v, int groupPosition, long id) { String str = (String) myAdapter.getGroup(groupPosition); System.out.println("点击了--"+str); return false; } }); //组的展开监听事件 expandableLv.setOnGroupExpandListener(new OnGroupExpandListener() { @Override public void onGroupExpand(int groupPosition) { String str = (String) myAdapter.getGroup(groupPosition); System.out.println("展开事件--点击了--"+str); } }); //组的收缩监听事件 expandableLv.setOnGroupCollapseListener(new OnGroupCollapseListener() { @Override public void onGroupCollapse(int groupPosition) { String str = (String) myAdapter.getGroup(groupPosition); System.out.println("收缩事件--点击了--"+str); } }); } //可扩展ListView的适配器 class MyExpandableAdapter extends BaseExpandableListAdapter{ //组数据 String [] group={"好友","同学"}; int[] icon_group={android.R.drawable.btn_minus,android.R.drawable.btn_minus}; //组员子数据 String [][] children={{"张三","李四","王五"},{"赵六","周七","王八"}}; int[][] icon_children={{android.R.drawable.ic_dialog_info,android.R.drawable.ic_popup_reminder,android.R.drawable.ic_dialog_map}, {android.R.drawable.ic_dialog_info,android.R.drawable.ic_popup_reminder,android.R.drawable.ic_dialog_map}}; @Override public int getGroupCount() { return group.length; } /** * groupPosition组的子数据 */ @Override public int getChildrenCount(int groupPosition) { return children[groupPosition].length; } /** * 同下,方便于监听器获取点击的数据 */ @Override public Object getGroup(int groupPosition) { return group[groupPosition]; } /** * @return 返回的数据就为子项的单击事件里getChild的数据 * 所以监听事件里就可以通过适配器获取这个返回的数据 */ @Override public Object getChild(int groupPosition, int childPosition) { return children[groupPosition][childPosition]; } @Override public long getGroupId(int groupPosition) { return groupPosition; } @Override public long getChildId(int groupPosition, int childPosition) { return childPosition; } /** * 是否相同的ID总是指的是同一个对象 */ @Override public boolean hasStableIds() { return false; } @Override //isExpanded代表这个组布局是否是展开的,并且没展开一个组,getGroupView会执行多次(多少组就多少次),所以如果想展开后改变组的显示效果就可以在此改变,具体看下面的红色字体 public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) { ViewHolder holder; if(convertView==null){ //得到组布局 convertView=View.inflate(MainActivity.this, R.layout.groud_layout, null); holder=new ViewHolder(); holder.img=(ImageView) convertView.findViewById(R.id.icon); holder.textView=(TextView) convertView.findViewById(R.id.textview); convertView.setTag(holder); }else{ holder=(ViewHolder) convertView.getTag(); } holder.img.setImageResource(icon_group[groupPosition]); holder.textView.setText(group[groupPosition]); return convertView; } @Override public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) { ViewHolder holder; if(convertView==null){ //得到子布局 convertView=View.inflate(MainActivity.this, R.layout.child_layout, null); holder=new ViewHolder(); holder.img=(ImageView) convertView.findViewById(R.id.icon); holder.textView=(TextView) convertView.findViewById(R.id.textview); convertView.setTag(holder); }else{ holder=(ViewHolder) convertView.getTag(); } holder.img.setImageResource(icon_children[groupPosition][childPosition]); holder.textView.setText(children[groupPosition][childPosition]); return convertView; } /** * 控制child是否可以被点击 true可以 */ @Override public boolean isChildSelectable(int groupPosition, int childPosition) { return true; } } class ViewHolder{ private ImageView img; private TextView textView; } }
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:layout_width="match_parent" android:layout_height="match_parent" android:background="#fff8dc" android:id="@+id/expandavleListView"/> </RelativeLayout>
child_layout.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="wrap_content" android:gravity="center_vertical" android:paddingLeft="30dp" android:orientation="horizontal" > <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/icon" android:src="@drawable/ic_launcher"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="not text" android:textColor="#0000ff" android:textSize="50sp" android:paddingLeft="5dp" android:id="@+id/textview"/> </LinearLayout>
groud_layout.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="wrap_content" android:gravity="center_vertical" android:orientation="horizontal" > <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/icon" android:src="@drawable/ic_launcher"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="not text" android:textColor="#ff00aa" android:textSize="60sp" android:paddingLeft="5dp" android:id="@+id/textview"/> </LinearLayout>
效果图:
如果想要展开第二个的时候把第一个给关闭,可以这样:
// 组的展开监听事件 expandableLv.setOnGroupExpandListener(new OnGroupExpandListener() { @Override public void onGroupExpand(int groupPosition) { String str = (String) myExpandableAdapter.getGroup(groupPosition); Log.i("tag", "展开事件--点击了---" + str); for (int i = 0; i < myExpandableAdapter.getGroupCount(); i++) { if (groupPosition != i) { expandableLv.collapseGroup(i);//关闭当前展开的其他项 } } } });
expandableLv.setOnGroupClickListener为扩展的listView设置组的点击事件,监听方法中的V,有时候是点击的布局,但有时候并不是,如果直接通过该v,去找该组布局中的控件,会出现错乱的现象,那么当我们想去找点击的组里面的控件的时候,只能通过适配器里的getGroupView方法,在该方法中获取展开的item
@Override public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) { ViewHolder holder; if (convertView == null) { // 得到组布局 convertView = LayoutInflater.from(TestActivity.this).inflate(R.layout.concrete_service_item_layout, parent, false); holder = new ViewHolder(); holder.concrete_service_lv_item_iv = (ImageView) convertView .findViewById(R.id.concrete_service_lv_item_iv); holder.concrete_service_lv_item_tv = (TextView) convertView .findViewById(R.id.concrete_service_lv_item_tv); holder.recyclerView = (RecyclerView) convertView.findViewById(R.id.concrete_service_recyclerview); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } holder.concrete_service_lv_item_tv.setText(group[groupPosition]); holder.concrete_service_lv_item_tv.setClickable(true);//设置为可点击 //根据enbled属性改变文本颜色 ColorStateList colorStateList = getResources().getColorStateList(R.drawable.red_black_color_selector); holder.concrete_service_lv_item_tv.setTextColor(colorStateList); if(isExpanded){ //获取展开的组,并找到改组的控件 holder.concrete_service_lv_item_tv.setEnabled(false); holder.concrete_service_lv_item_iv.setImageResource(R.drawable.icon_service_pull_up); currentExpandRecyclerView = holder.recyclerView;//记录展开的组的控件,这里也就是关键了 }else{ //没有展开 holder.concrete_service_lv_item_tv.setEnabled(true); holder.concrete_service_lv_item_iv.setImageResource(R.drawable.icon_service_pull); } //需要避免recyclerView数据显示的冲突,数据的保存与清空,groupPosition与Map来存 //holder.recyclerView TODO recyclerView的数据 return convertView; }