/*
* 官网地站:http://www.ShareSDK.cn
* 技术支持QQ: 4006852216
* 官方微信:ShareSDK (如果发布新版本的话,我们将会第一时间通过微信将版本更新内容推送给您。如果使用过程中有任何问题,也可以通过微信与我们取得联系,我们将会在24小时内给予回复)
*
* Copyright (c) 2013年 ShareSDK.cn. All rights reserved.
*/
package com.kaixin.android.view;
import java.util.ArrayList;
import com.kaixin.android.R;
import android.content.Context;
import android.graphics.drawable.ColorDrawable;
import android.util.AttributeSet;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AbsListView;
import android.widget.AbsListView.OnScrollListener;
import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.RelativeLayout;
import android.widget.TextView;
/**自定义联系人的列表控件*/
public class ContactsListView extends RelativeLayout {
private ListView lvBody;
private InnerAdapter innerAdapter;
private GroupAdapter adapter;
private TextView tvTitle;
private int curFirstItem;
private int titleHeight;
private OnScrollListener osListener;
public ContactsListView(Context context) {
super(context);
init(context);
}
public ContactsListView(Context context, AttributeSet attrs) {
super(context, attrs);
init(context);
}
public ContactsListView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init(context);
}
private void init(Context context) {
lvBody = new ListView(context);
lvBody.setCacheColorHint(0);
lvBody.setSelector(new ColorDrawable());
lvBody.setDivider(context.getResources().getDrawable(R.drawable.smssdk_cl_divider));
lvBody.setDividerHeight(1);
lvBody.setVerticalScrollBarEnabled(false);
lvBody.setOnScrollListener(new OnScrollListener() {
public void onScrollStateChanged(AbsListView view, int scrollState) {
if (osListener != null) {
osListener.onScrollStateChanged(view, scrollState);
}
}
public void onScroll(AbsListView view, int firstVisibleItem,
int visibleItemCount, int totalItemCount) {
curFirstItem = firstVisibleItem;
if (tvTitle != null) {
ContactsListView.this.onScroll();
}
if (osListener != null) {
osListener.onScroll(view, firstVisibleItem, visibleItemCount, totalItemCount);
}
}
});
lvBody.setLayoutParams(new LayoutParams(
LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
addView(lvBody);
}
public void setAdapter(GroupAdapter adapter) {
this.adapter = adapter;
innerAdapter = new InnerAdapter(adapter);
lvBody.setAdapter(innerAdapter);
setTitle();
}
public GroupAdapter getAdapter() {
return adapter;
}
private void notifyDataSetChanged() {
innerAdapter.notifyDataSetChanged();
setTitle();
}
//设置标题
private void setTitle() {
if (tvTitle != null) {
removeView(tvTitle);
}
if(innerAdapter.getCount() == 0 ){
return;
}
int group = innerAdapter.getItemGroup(curFirstItem);
int position = innerAdapter.titleIndex.get(group);
tvTitle = (TextView) innerAdapter.getView(position, null, this);
LayoutParams lp = new LayoutParams(
LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
lp.addRule(ALIGN_PARENT_LEFT);
lp.addRule(ALIGN_PARENT_TOP);
addView(tvTitle, lp);
tvTitle.measure(0, 0);
titleHeight = tvTitle.getMeasuredHeight();
onScroll();
}
public void setSelection(int group) {
setSelection(group, -1);
}
public void setSelection(int group, int position) {
int titleIndex = innerAdapter.titleIndex.get(group);
int selection = titleIndex + position + 1;
lvBody.setSelection(selection);
}
//滚动时,改变标题栏
private void onScroll() {
LayoutParams lp = (LayoutParams) tvTitle.getLayoutParams();
if (innerAdapter.isLastItem(curFirstItem)) { // 上一组最后一项
int group = innerAdapter.getItemGroup(curFirstItem);
String title = adapter.getGroupTitle(group);
tvTitle.setText(title);
int top = lvBody.getChildAt(1).getTop();
if (top < titleHeight) {
lp.setMargins(0, top - titleHeight, 0, 0);
tvTitle.setLayoutParams(lp);
return;
}
}
lp.topMargin = 0;
tvTitle.setLayoutParams(lp);
if (innerAdapter.isTitle(curFirstItem)) { // 标题项
int group = innerAdapter.getItemGroup(curFirstItem);
String title = adapter.getGroupTitle(group);
tvTitle.setText(title);
}
}
//设置滚动监听
public void setOnScrollListener(OnScrollListener l) {
osListener = l;
}
/**自定义listview的适配器*/
private static class InnerAdapter extends BaseAdapter {
private GroupAdapter adapter;
private ArrayList<Object> listData;
private ArrayList<Integer> titleIndex;
private ArrayList<Integer> lastItemIndex;
public InnerAdapter(GroupAdapter adapter) {
this.adapter = adapter;
listData = new ArrayList<Object>();
titleIndex = new ArrayList<Integer>();
lastItemIndex = new ArrayList<Integer>();
init();
}
private void init() {
listData.clear();
titleIndex.clear();
lastItemIndex.clear();
for (int g = 0, gc = adapter.getGroupCount(); g < gc; g++) {
int c = adapter.getCount(g);
if (c > 0) {
titleIndex.add(listData.size());
listData.add(adapter.getGroupTitle(g));
for (int i = 0; i < c; i++) {
listData.add(adapter.getItem(g, i));
}
lastItemIndex.add(listData.size() - 1);
}
}
}
public int getCount() {
return listData.size();
}
public Object getItem(int position) {
return listData.get(position);
}
public long getItemId(int position) {
return position;
}
public int getItemGroup(int position) {
int size = titleIndex.size();
for (int i = 0; i < size; i++) {
int titleIndex = this.titleIndex.get(i);
if (position < titleIndex) {
return i - 1;
}
}
return size - 1;
}
public boolean isTitle(int position) {
for (int i = 0, size = titleIndex.size(); i < size; i++) {
if (titleIndex.get(i) == position) {
return true;
}
}
return false;
}
public int getViewTypeCount() {
return 2;
}
public int getItemViewType(int position) {
return isTitle(position) ? 0 : 1;
}
public View getView(int position, View convertView, ViewGroup parent) {
int group = getItemGroup(position);
if (isTitle(position)) {
if (convertView != null && (convertView instanceof TextView)) {
convertView = adapter.getTitleView(group, (TextView) convertView, parent);
} else {
convertView = adapter.getTitleView(group, null, parent);
}
} else {
int item = position - titleIndex.get(group) - 1;
convertView = adapter.getView(group, item, convertView, parent);
}
return convertView;
}
public void notifyDataSetChanged() {
init();
super.notifyDataSetChanged();
}
public boolean isLastItem(int position) {
for (int i = 0, size = lastItemIndex.size(); i < size; i++) {
if (lastItemIndex.get(i) == position) {
return true;
}
}
return false;
}
}
/**自定义组的abstract类,用于填充listview的item*/
public static abstract class GroupAdapter {
protected final ContactsListView view;
public GroupAdapter(ContactsListView view) {
this.view = view;
}
/**获取组的数据个数*/
public abstract int getGroupCount();
/**
* 获取某组的item个数
* @param group
* @return
*/
public abstract int getCount(int group);
/**
* 获取某组的title标签
* @param group
* @return
*/
public abstract String getGroupTitle(int group);
/**
* 获取某组第positon的位置的数据对象
* @param group
* @param position
* @return
*/
public abstract Object getItem(int group, int position);
/**
* 获取某组的title的View
* @param group
* @param convertView
* @param parent
* @return
*/
public abstract TextView getTitleView(int group, TextView convertView, ViewGroup parent);
/**
* 获取某组第positon的位置的item View
* @param group
* @param position
* @param convertView
* @param parent
* @return
*/
public abstract View getView(int group, int position, View convertView, ViewGroup parent);
public void notifyDataSetChanged() {
view.notifyDataSetChanged();
}
}
}