一、ExpandableListView中group和child的item之间的间距可以通过xml来配置,如下:
<ExpandableListView android:id="@+id/listview" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_marginLeft="10dp" android:layout_marginRight="10dp" android:cacheColorHint="@color/transparent" android:childDivider="@color/transparent" android:divider="@color/transparent" android:dividerHeight="10dp" android:listSelector="@color/transparent" android:scrollbars="none" android:groupIndicator="@null" android:childIndicator="@null"> </ExpandableListView>
这样配置的话,会发现group和child的item之间的间距均为10dp,但是有时候我们需要group和child的item之间的间距设置为不一样的值,这个时候就不能单纯的通过配置xml来解决,解决方法如下:
a、配置expandablelistview
<ExpandableListView android:id="@+id/listview" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_marginLeft="10dp" android:layout_marginRight="10dp" android:cacheColorHint="@color/transparent" android:childDivider="@color/transparent" android:divider="@color/transparent" android:dividerHeight="0dp" android:listSelector="@color/transparent" android:scrollbars="none" android:groupIndicator="@null" android:childIndicator="@null"> </ExpandableListView>
b、配置group layout
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="55dp" android:minHeight="55dp"> <RelativeLayout android:id="@+id/lay" android:layout_width="match_parent" android:layout_height="45dp" android:layout_alignParentBottom="true" android:background="@drawable/shape_login_edit" android:paddingLeft="12dp" android:paddingRight="12dp"> <TextView android:id="@+id/key" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_centerVertical="true" android:text="@string/inverter_data_rated_power" android:textColor="@color/white" android:textSize="16sp" /> <TextView android:id="@+id/value" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentRight="true" android:layout_centerVertical="true" android:text="5KW" android:textColor="@color/white" android:textSize="16sp" /> </RelativeLayout> </RelativeLayout>
通过控制group item的padding或者margin,来改变group item之间的间距,10dp。
c、配置child layout
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/lay" android:layout_width="match_parent" android:layout_height="45dp" android:background="@drawable/shape_login_edit_all" android:minHeight="45dp" android:paddingLeft="12dp" android:paddingRight="12dp"> <TextView android:id="@+id/key" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_centerVertical="true" android:text="@string/inverter_data_rated_power" android:textColor="@color/white" android:textSize="16sp" /> <TextView android:id="@+id/value" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentRight="true" android:layout_centerVertical="true" android:text="5KW" android:textColor="@color/white" android:textSize="16sp" /> </RelativeLayout>
通过控制child item的padding或者margin,来改变child item之间的间距,0dp。
二、Expandablelistview 多种布局问题的解决
Listview多布局要求adapter必须实现以下两个函数:
1、getViewTypeCount():该方法返回多少个不同的布局。
2、getItemViewType(int position):根据数据列表的position返回需要展示的layout的对应的type。 type的值必须从0开始。
Expandablelistview多布局同样要求adapter必须实现以下两个函数:
1、getGroupTypeCount()
2、getGroupType(int groupPosition)
package com.invt.imarsphoneexpert.remote.adapter; import android.content.Context; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseExpandableListAdapter; import android.widget.ImageView; import android.widget.RelativeLayout; import android.widget.TextView; import java.util.ArrayList; import java.util.List; /** * Created by xl on 2018/3/15. */ public class RemoteInverterInfoAdapter extends BaseExpandableListAdapter { private Context mContext; private List<NameValueStatus> mList; private LayoutInflater mInflater; private final int VIEW_TYPE = 2; private final int VIEW_TYPE_1 = 0; private final int VIEW_TYPE_2 = 1; public RemoteInverterInfoAdapter(Context context) { this.mContext = context; this.mList = new ArrayList<NameValueStatus>(); this.mInflater = LayoutInflater.from(context); } public RemoteInverterInfoAdapter(Context context, List<NameValueStatus> list) { this.mContext = context; this.mList = list; this.mInflater = LayoutInflater.from(context); } @Override public int getGroupCount() { if (mList != null) { return mList.size(); } return 0; } @Override public int getChildrenCount(int groupPosition) { if (mList != null && mList.get(groupPosition).getList() != null) { return mList.get(groupPosition).getList().size(); } return 0; } @Override public Object getGroup(int groupPosition) { if (mList != null) { return mList.get(groupPosition); } return null; } @Override public Object getChild(int groupPosition, int childPosition) { if (mList != null && mList.get(groupPosition).getList() != null) { return mList.get(groupPosition).getList().get(childPosition); } return null; } @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 int getGroupType(int groupPosition) { if (groupPosition == 3 || groupPosition == 4) { return VIEW_TYPE_2; } return VIEW_TYPE_1; } @Override public int getGroupTypeCount() { return VIEW_TYPE; } @Override public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) { GroupViewHold group = null; int type = getGroupType(groupPosition); if (convertView == null) { group = new GroupViewHold(); switch (type) { case VIEW_TYPE_1: convertView = mInflater.inflate(R.layout.row_inverter_info1, null); group.value = (TextView) convertView.findViewById(R.id.value); break; case VIEW_TYPE_2: convertView = mInflater.inflate(R.layout.row_inverter_info2, null); group.indicator = (ImageView) convertView.findViewById(R.id.img); break; } group.key = (TextView) convertView.findViewById(R.id.key); group.lay = (RelativeLayout) convertView.findViewById(R.id.lay); //设置tag convertView.setTag(group); } else { group = (GroupViewHold) convertView.getTag(); } //设置控件 group.key.setText(mList.get(groupPosition).getName()); if (type == VIEW_TYPE_1) { group.value.setText(mList.get(groupPosition).getValue()); } else { if (isExpanded) { group.indicator.setImageResource(R.drawable.remote_close); group.lay.setBackgroundResource(R.drawable.shape_login_edit_up); } else { group.indicator.setImageResource(R.drawable.remote_open); group.lay.setBackgroundResource(R.drawable.shape_login_edit); } } return convertView; } @Override public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) { ChildViewHold child = null; if (convertView == null) { child = new ChildViewHold(); convertView = mInflater.inflate(R.layout.row_inverter_info_item, null); //查找控件 child.key = (TextView) convertView.findViewById(R.id.key); child.value = (TextView) convertView.findViewById(R.id.value); child.lay = (RelativeLayout) convertView.findViewById(R.id.lay); //设置tag convertView.setTag(child); } else { child = (ChildViewHold) convertView.getTag(); } //设置控件 if (getGroupType(groupPosition) == VIEW_TYPE_2) { child.key.setText(mList.get(groupPosition).getList().get(childPosition).getName()); child.value.setText(mList.get(groupPosition).getList().get(childPosition).getValue()); } if (childPosition == mList.get(groupPosition).getList().size() - 1) { child.lay.setBackgroundResource(R.drawable.shape_login_edit_down); } return convertView; } @Override public boolean isChildSelectable(int i, int i1) { return true; } static class GroupViewHold { private RelativeLayout lay; private ImageView indicator; private TextView key; private TextView value; } static class ChildViewHold { private RelativeLayout lay; private TextView key; private TextView value; } /** * 更新列表 * * @param list */ public void updateList(List<NameValueStatus> list) { this.mList.clear(); this.mList.addAll(list); this.notifyDataSetChanged(); } /** * 获取列表 * * @return */ public List<NameValueStatus> getList() { return mList; } /** * 刷新 */ public void updateList() { this.notifyDataSetChanged(); } }
三、listview和expandablelistview头部设置
头部lay_inverter_head1
<?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="150dp" android:layout_marginLeft="10dp" android:layout_marginRight="10dp" android:orientation="horizontal" android:weightSum="5"> …… </LinearLayout>
设置头部
//设置listView头部 mViewHeader = View.inflate(mActivity, R.layout.lay_inverter_head1, null); mListView.addHeaderView(mViewHeader);完!!!