自定义Android ListView控件:ExpandableListView
一个比较实用的EapandableListView,样式如附件:
1、在xml添加EapandalbeListView,然后添加一个每项的内容 search_result_item.xml
Main.xml代码
<ExpandableListView android:id="@+id/searchResultsort"
android:layout_height="fill_parent"
android:layout_width="fill_parent"
style="@style/view"
android:background="#FFFFFF" />...
2、代码片段
Main代码
public class Main extends LinearLayout implements ImageRecyle
{
/**
* 封装分类的搜索结果类的实例
*/
private ExpandableListView listView;
private SearchExpandableAdapter seadapter;
/**
* 上下文对象
*/
private Context mContext;
/**
* 选项被选中是的背景色
*/
public static final int SELECTED_ITEM_COLOR = 0xFFaaddFF;
/**
* 构造函数
*
* @param context 上下文对象
*/
public SearchResultSort(final Context context)
{
super(context);
mContext = context;
// 获取页面布局
View mainView = LayoutInflater.from(context).inflate(
R.main, this);
// 获取封装好的搜索结果列表
listView = (ExpandableListView) findViewById(R.id.searchResultsort);
seadapter=new SearchExpandableAdapter(mContext);
listView.setAdapter(seadapter);
// 获取搜索列表的分组数量
int groupCount = listView.getCount();
if (groupCount > 0)
{
// 展开第一个组
listView.expandGroup(0);
}
// 设置子元素被点击的事件监听
listView.setOnChildClickListener(new OnChildClickListener()
{
public boolean onChildClick(ExpandableListView parent, View v, int groupPosition,
int childPosition, long id)
{
//对选中项进行操作 // 将所有的列表项中的颜色清空
int visStart = listView.getFirstVisiblePosition();
int visEnd = listView.getLastVisiblePosition();
View viewTemp;
for (int i = 0; i <= visEnd - visStart; i++)
{
viewTemp = listView.getChildAt(i);
if (viewTemp != null && viewTemp.getTag() != null)
{
viewTemp.setBackgroundColor((Integer) viewTemp.getTag());
}
}
// 设置点击的子元素
listView.setSelectedChild(groupPosition, childPosition, true);
// 设置被点击子元素的背景颜色
v.setBackgroundColor(SELECTED_ITEM_COLOR);
return true;
}
});
}
/**
* 分类列表适配器
*/
private class SearchExpandableAdapter extends BaseExpandableListAdapter
{
// 上下文对象
private Context mContext;
// 分类的组集合
private String[] groups =
{ "Music(3", "Video(5" };
/**
* 构造函数
*
* @param context 上下文对象
*/
public SearchExpandableAdapter(Context context)
{
super();
mContext = context;
}
/**
* 获取子元素对象
*
* @param groupPosition 子元素所在的组集合位置
* @param childPosition 子元素所在元素集合的位置
* @return 子元素对象
*/
public Object getChild(int groupPosition, int childPosition)
{
return null;
}
/**
* 获取子元素所在元素集合的位置
*
* @param groupPosition 子元素所在的组集合位置
* @param childPosition 子元素所在元素集合的位置
* @return 子元素所在元素集合的位置
*/
public long getChildId(int groupPosition, int childPosition)
{
return childPosition;
}
/**
* 获取给定组的子元素的个数
*
* @param groupPosition 组的位置
* @return 该组子元素的个数
*/
public int getChildrenCount(int groupPosition)
{
return picIds[groupPosition].length;
}
/**
* 获取组的视图
*
* @return 组的视图
*/
public TextView getGroupView()
{
AbsListView.LayoutParams lp = new AbsListView.LayoutParams(
ViewGroup.LayoutParams.FILL_PARENT, 38);
TextView textView = new TextView(mContext);
textView.setBackgroundResource(R.drawable.search_bg_list_small);
textView.setTextSize(14f);
textView.setLayoutParams(lp);
textView.setTextColor(0xBB000000);
textView.setTypeface(Typeface.defaultFromStyle(Typeface.BOLD));
textView.setGravity(Gravity.CENTER_VERTICAL | Gravity.LEFT);
textView.setPadding(35, 0, 0, 0);
return textView;
}
/**
* 获取分组的视图
*
* @param groupPosition 分组的位置
* @param isExpanded 是否已经展开
* @param convertView 转换视图
* @param parent 父元素视图
* @return 分组的视图
*/
public View getGroupView(int groupPosition, boolean isExpanded,
View convertView, ViewGroup parent)
{
TextView textView = getGroupView();
textView.setText(getGroup(groupPosition).toString());
return textView;
}
/**
* 获取子元素的视图
*
* @param groupPosition 子元素所在的组集合位置
* @param childPosition 子元素所在元素集合的位置
* @param isLastChild 是否是最后一个子元素
* @param convertView 转换视图
* @param parent 父元素视图
* @return 子元素的视图
*/
public View getChildView(int groupPosition, int childPosition,
boolean isLastChild, View convertView, ViewGroup parent)
{
ImageView listImage;
TextView searchTitle;
TextView searchSinger;
TextView searchPay;
final RatingBar searchStars;
if (convertView == null)
{//获得view
convertView = LayoutInflater.from(mContext).inflate(
R.layout.search_result_item, parent, false);
}
listImage = (ImageView) convertView.findViewById(R.id.searchImage);
searchTitle = (TextView) convertView.findViewById(R.id.searchTitle);
searchStars = (RatingBar) convertView
.findViewById(R.id.searchStars);
searchPay = (TextView) convertView.findViewById(R.id.searchPay);
if (listImage != null)
{
Bitmap temp = BitmapFactory.decodeResource(mContext
.getResources(), picIds[groupPosition][childPosition]);
listImage.setImageBitmap(temp);
}
if (searchTitle != null)
{
String ellipsisStr = (String) TextUtils.ellipsize(
titles[groupPosition][childPosition],
(TextPaint) searchTitle.getPaint(), 150,
TextUtils.TruncateAt.END);
searchTitle.setText(ellipsisStr);
ellipsisStr = (String) TextUtils.ellipsize(
singers[groupPosition][childPosition],
(TextPaint) searchTitle.getPaint(), 150,
TextUtils.TruncateAt.END);
searchSinger.setText(ellipsisStr);
}
if (searchStars != null)
{
searchStars.setNumStars(5);
searchStars.setRating(stars[groupPosition][childPosition]);
}
if (childPosition % 2 == 1)
{
convertView.setBackgroundColor(0xfff6f6f6);
convertView.setTag(0xfff6f6f6);
}
else
{
convertView.setBackgroundColor(0xFFFFFFFF);
convertView.setTag(0xFFFFFFFF);
}
return convertView;
}
/**
* 获取组对象
*
* @param groupPosition 所在组的位置
* @return 组对象
*/
public Object getGroup(int groupPosition)
{
return groups[groupPosition];
}
/**
* 获取分组的个数
*
* @return 分组的个数
*/
public int getGroupCount()
{
return groups.length;
}
/**
* 获取分组的位置
*
* @param groupPosition 分组的位置
* @return 分组的位置
*/
public long getGroupId(int groupPosition)
{
return groupPosition;
}
/**
* 子元素是否可选
*
* @param groupPosition 子元素所在的组集合位置
* @param childPosition 子元素所在元素集合的位置
* @return ture
*/
public boolean isChildSelectable(int groupPosition, int childPosition)
{
return true;
}
public boolean hasStableIds()
{
return true;
}
}
// 组包含的子元素集合
private String[][] titles =
{
{ "Scarborough Fair", "Gloomy Sunday", "Fleurs Du Mai" },
{ "Time ", "You", } };
private int[][] picIds =
{
{ R.drawable.pic_list_01, R.drawable.pic_list_02,
R.drawable.pic_list_03 },
{ R.drawable.pic_list_04, R.drawable.music_list_06,
R.drawable.music_list_13 }};
private float[][] stars =
{
{ 4, 5, 4 },
{ 4, 4 } };
search_result_item.xml代码:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="fill_parent"
android:layout_height="145px" android:gravity="center_vertical">
<LinearLayout android:orientation="horizontal"
android:layout_width="fill_parent" android:gravity="center"
android:layout_marginRight="17px" android:layout_marginLeft="17px"
android:layout_height="144px">
<LinearLayout android:orientation="vertical"
android:layout_width="88px" android:background="@drawable/book_biankuang"
android:layout_height="122px" android:gravity="center">
<ImageView android:id="@+id/mobile_search_book_pic"
android:layout_width="86px" android:layout_height="120px"
style="@style/font_style_black_normal" android:src="@drawable/mobile_bookpic" />
</LinearLayout>
<LinearLayout android:orientation="vertical"
android:layout_width="fill_parent" android:layout_marginLeft="30dip"
android:layout_height="fill_parent" android:gravity="center">
<RelativeLayout android:orientation="horizontal"
android:layout_width="fill_parent" android:layout_height="wrap_content">
<TextView android:id="@+id/mobile_search_text_bookname"
android:layout_width="300px" android:layout_height="wrap_content"
android:singleLine="true" style="@style/mobile_font_style_black_title_big"
android:text="@string/mobilebookstore_book_unknown" />
<ImageView android:id="@+id/mobile_search_star"
android:layout_width="wrap_content" android:layout_height="wrap_content"
android:layout_alignParentRight="true" android:singleLine="true"
style="@style/font_style_black_normal" android:src="@drawable/star_zero" />
</RelativeLayout>
<RelativeLayout android:orientation="horizontal"
android:layout_width="fill_parent" android:layout_height="wrap_content"
android:layout_marginTop="15dip">
<TextView android:id="@+id/temp_id_c" android:layout_width="wrap_content"
android:layout_height="wrap_content" style="@style/mobile_font_style_black_middle"
android:text="@string/mobilebookstore_book_author" />
<TextView android:id="@+id/mobile_search_text_authorname"
android:layout_width="wrap_content" android:layout_height="wrap_content"
android:layout_marginLeft="7px" android:layout_toRightOf="@id/temp_id_c"
style="@style/mobile_font_style_black_middle" android:text="@string/mobilebookstore_book_unknown" />
<TextView android:id="@+id/mobile_search_text_price"
android:layout_width="wrap_content" android:layout_height="wrap_content"
android:layout_alignParentRight="true"
style="@style/mobile_font_style_black_middle" android:text="@string/mobilebookstore_book_unknown" />
<TextView android:id="@+id/unknown_info"
android:layout_width="wrap_content" android:layout_height="wrap_content"
android:layout_toLeftOf="@id/mobile_search_text_price" style="@style/mobile_font_style_black_middle"
android:text="@string/mobilebookstore_book_price" />
</RelativeLayout>
</LinearLayout>
</LinearLayout>
<ImageView android:layout_width="fill_parent"
android:layout_height="wrap_content" android:gravity="left"
style="@style/font_style_black_normal" android:src="@drawable/dashed" />
</LinearLayout>

浙公网安备 33010602011771号