package com.partynetwork.iparty.contacts;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.os.Parcelable;
import android.text.Editable;
import android.text.TextUtils;
import android.text.TextWatcher;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.view.ViewGroup.MarginLayoutParams;
import android.widget.AbsListView;
import android.widget.AbsListView.OnScrollListener;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.AlphabetIndexer;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.RelativeLayout;
import android.widget.TextView;
import com.partynetwork.dataprovider.DataProvider.IJsonResultListener;
import com.partynetwork.dataprovider.json.NetworkEntity;
import com.partynetwork.dataprovider.json.struct.Contacts_getUserByGroupIdRequest;
import com.partynetwork.dataprovider.json.struct.Contacts_getUserByGroupIdResponse;
import com.partynetwork.dataprovider.json.struct.Contacts_getUserTypeArrayRequest;
import com.partynetwork.dataprovider.json.struct.Contacts_getUserTypeArrayResponse;
import com.partynetwork.dataprovider.util.ActionUtil;
import com.partynetwork.dataprovider.util.IndexCursor;
import com.partynetwork.dataprovider.util.PinyinComparator;
import com.partynetwork.dataprovider.util.PinyinUtil;
import com.partynetwork.dataprovider.util.T;
import com.partynetwork.iparty.R;
import com.partynetwork.iparty.app.AppContext;
import com.partynetwork.iparty.app.common.UIHelper;
import com.partynetwork.iparty.app.entities.CommonUser;
import com.partynetwork.iparty.app.manager.UserManager;
import com.partynetwork.iparty.info.ContactsInfo;
import com.partynetwork.myview.mysidebar.MySideBar;
import com.partynetwork.myview.mysidebar.MySideBar.OnTouchingLetterChangedListener;
import com.lidroid.xutils.ViewUtils;
import com.lidroid.xutils.util.LogUtils;
import com.lidroid.xutils.view.annotation.ViewInject;
import com.lidroid.xutils.view.annotation.event.OnClick;
/**
* 人脉列表界面
*/
public class ContactsListActivity extends Activity implements
IJsonResultListener, OnTouchingLetterChangedListener,
OnItemClickListener {
public static final String USER_TYPE = "userType";
public static final String PAGE_TYPE = "pageType";
public static final String GROUP_ID = "groupId";
public static final String GROUP_NAME = "groupName";
/**
* 返回按钮
*/
@ViewInject(R.id.menu_head_left)
private LinearLayout backBtn;
/**
* 页面标题
*/
@ViewInject(R.id.menu_head_middle_text)
private TextView headTitle;
/**
* 确定按钮
*/
@ViewInject(R.id.menu_head_right)
private RelativeLayout sureBtn;
/**
* 确定的文本框
*/
@ViewInject(R.id.menu_head_right_tv)
private TextView rightTv;
/**
* 设置按钮
*/
@ViewInject(R.id.menu_head_right_iv)
private ImageView rightIv;
/**
* 搜索文本输入框
*/
@ViewInject(R.id.search_et)
private EditText search_et;
/**
* 下方显示内容的listview
*/
@ViewInject(R.id.listview)
private ListView listview;
/**
* 分级布局
*/
@ViewInject(R.id.title_layout)
private LinearLayout title_layout;
/**
* 顶部的文字
*/
@ViewInject(R.id.title)
private TextView title;
/**
* 侧边栏滑动对象
*/
@ViewInject(R.id.mysidebar)
private MySideBar mySideBar;
/**
* 存放所有好友
*/
private List<ContactsInfo> contacts = new ArrayList<ContactsInfo>();
/**
* 存放当前显示好友
*/
private List<ContactsInfo> filterDateList = new ArrayList<ContactsInfo>();
/**
* 好友列表适配器
*/
private ContactsListAdapter adapter;
/**
* 用于进行字母表分组
*/
private AlphabetIndexer indexer;
/**
* 定义字母表的排序规则
*/
private String alphabet = "#ABCDEFGHIJKLMNOPQRSTUVWXYZ";
/**
* 上次第一个可见元素,用于滚动时记录标识。
*/
private int lastFirstVisibleItem = -1;
/**
* 用户需要显示的用户类别
*/
private int userType;
/** 页面的类型 */
private int pageType;
/** 如果是分组,需要组Id */
private int groupId;
/** 如果是分组,需要组名称 */
private String groupName;
/**
* 记录点击的好友
*/
private List<ContactsInfo> chooseUserList = new ArrayList<ContactsInfo>();
public static final int CONTACTS_REQUEST_CODE = 130;
public static final String CONTACTS_ARRAY = "contacts_array";
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_contacts);
ViewUtils.inject(this);
init();
sendRequest();
}
/**
* 初始化
*/
private void init() {
userType = getIntent().getIntExtra(USER_TYPE,
ActionUtil.Contacts.FRIEND);
pageType = getIntent().getIntExtra(PAGE_TYPE,
ActionUtil.Contacts.DEFAULT);
groupId = getIntent().getIntExtra(GROUP_ID, 0);
groupName = getIntent().getStringExtra(GROUP_NAME);
rightIv.setVisibility(View.GONE);
switch (userType) {
case ActionUtil.Contacts.CHOOSE_FRIEND:
headTitle.setText("选择好友");
break;
case ActionUtil.Contacts.FRIEND:
headTitle.setText("i好友");
break;
case ActionUtil.Contacts.ATTENTION:
headTitle.setText("我关注的人");
break;
case ActionUtil.Contacts.FANS:
headTitle.setText("粉丝");
break;
case ActionUtil.Contacts.BLACK_LIST:
headTitle.setText("去你妹名单");
break;
case ActionUtil.Contacts.GROUP:
rightIv.setVisibility(View.VISIBLE);
if (groupName == null || groupName.equals("")) {
groupName = "未命名分组";
}
headTitle.setText(groupName);
break;
default:
headTitle.setText("选择好友");
break;
}
mySideBar.setOnTouchingLetterChangedListener(this);
try {
Parcelable[] par = getIntent().getParcelableArrayExtra(
CONTACTS_ARRAY);
for (Parcelable a : par) {
chooseUserList.add((ContactsInfo) a);
}
int size = chooseUserList.size();
if (size > 0) {
rightTv.setText("确定(" + size + ")");
} else {
rightTv.setText("确定");
}
} catch (Exception e) {
}
// 根据输入框输入值的改变来过滤搜索
search_et.addTextChangedListener(new TextWatcher() {
public void onTextChanged(CharSequence s, int start, int before,
int count) {
// 当输入框里面的值为空,更新为原来的列表,否则为过滤数据列表
filterData(s.toString());
}
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
}
public void afterTextChanged(Editable s) {
}
});
// 用于清除EditText的焦点
listview.setOnTouchListener(new OnTouchListener() {
public boolean onTouch(View arg0, MotionEvent arg1) {
listview.setFocusable(true);
listview.setFocusableInTouchMode(true);
listview.requestFocus();
return false;
}
});
listview.setOnItemClickListener(this);
}
/**
* 根据输入框中的值来过滤数据并更新ListView
*
* @param filterStr
*/
private void filterData(String filterStr) {
if (TextUtils.isEmpty(filterStr)) {
filterDateList = contacts;
} else {
filterDateList = new ArrayList<ContactsInfo>();
for (ContactsInfo info : contacts) {
String name = info.getUserName();
if (name.indexOf(filterStr.toString()) != -1
|| PinyinUtil.getPingYin(name).startsWith(
filterStr.toString())) {
filterDateList.add(info);
}
}
}
// 根据a-z进行排序
Collections.sort(filterDateList, new PinyinComparator());
initListView();
}
/**
* 发送获取用户的请求
*/
private void sendRequest() {
AppContext context = (AppContext) getApplication();
if (userType == ActionUtil.Contacts.GROUP) {
Contacts_getUserByGroupIdRequest request = new Contacts_getUserByGroupIdRequest();
request.setUserId(context.getLoginUid());
request.setGroupId(groupId);
context.getmDataProvider().getJsonFromNetwork(request, this);
} else {
Contacts_getUserTypeArrayRequest request = new Contacts_getUserTypeArrayRequest();
request.setUserId(context.getLoginUid());
request.setUserType(userType);
context.getmDataProvider().getJsonFromNetwork(request, this);
}
}
/**
* 初始化listview
*/
private void initListView() {
if (pageType == ActionUtil.Contacts.MULTIPLE) {
rightTv.setVisibility(View.VISIBLE);
sureBtn.setClickable(true);
} else {
rightTv.setVisibility(View.GONE);
sureBtn.setClickable(false);
}
adapter = new ContactsListAdapter(this, filterDateList);
adapter.setPageType(pageType);
listview.setAdapter(adapter);
if (filterDateList.size() > 0) {
indexer = new AlphabetIndexer(new IndexCursor(adapter), 0, alphabet);
adapter.setIndexer(indexer);
setupContactsListView();
}
}
/**
* 为好友ListView设置监听事件,根据当前的滑动状态来改变分组的显示位置,从而实现挤压动画的效果。
*/
private void setupContactsListView() {
listview.setOnScrollListener(new OnScrollListener() {
public void onScrollStateChanged(AbsListView view, int scrollState) {
}
public void onScroll(AbsListView view, int firstVisibleItem,
int visibleItemCount, int totalItemCount) {
int section = indexer.getSectionForPosition(firstVisibleItem);
int nextSecPosition = indexer
.getPositionForSection(section + 1);
if (firstVisibleItem != lastFirstVisibleItem) {
MarginLayoutParams params = (MarginLayoutParams) title_layout
.getLayoutParams();
params.topMargin = 0;
title_layout.setLayoutParams(params);
title.setText(String.valueOf(alphabet.charAt(section)));
}
if (nextSecPosition == firstVisibleItem + 1) {
View childView = view.getChildAt(0);
if (childView != null) {
int titleHeight = title_layout.getHeight();
int bottom = childView.getBottom();
MarginLayoutParams params = (MarginLayoutParams) title_layout
.getLayoutParams();
if (bottom < titleHeight) {
float pushedDistance = bottom - titleHeight;
params.topMargin = (int) pushedDistance;
title_layout.setLayoutParams(params);
} else {
if (params.topMargin != 0) {
params.topMargin = 0;
title_layout.setLayoutParams(params);
}
}
}
}
lastFirstVisibleItem = firstVisibleItem;
}
});
}
/**
* 点击事件监听
*
* @param v
*/
@OnClick({ R.id.menu_head_left, R.id.menu_head_right })
public void btnClick(View v) {
switch (v.getId()) {
case R.id.menu_head_left:
// 返回
finish();
break;
case R.id.menu_head_right:
// 确定
if (pageType == ActionUtil.Contacts.MULTIPLE) {
Intent intent = new Intent();
intent.putExtra(CONTACTS_ARRAY, (ContactsInfo[]) chooseUserList
.toArray(new ContactsInfo[chooseUserList.size()]));
this.setResult(CONTACTS_REQUEST_CODE, intent);
finish();
} else {
pageType = ActionUtil.Contacts.MULTIPLE;
initListView();
}
break;
default:
break;
}
}
/**
* listview的逐项监听
*
* @param parent
* @param view
* @param position
* @param id
*/
public void onItemClick(AdapterView<?> parent, View view, int position,
long id) {
ContactsListView contactsView = (ContactsListView) view;
if (pageType == ActionUtil.Contacts.MULTIPLE) {
try {
contactsView.itemClick();
if (contactsView.getInfo().getIsChoose() == 1) {
chooseUserList.add(contactsView.getInfo());
} else {
for (int i = 0; i < chooseUserList.size(); i++) {
if (chooseUserList.get(i).getUserId() == contactsView
.getInfo().getUserId()) {
chooseUserList.remove(i);
}
}
}
int size = chooseUserList.size();
if (size > 0) {
rightTv.setText("确定(" + size + ")");
} else {
rightTv.setText("确定");
}
} catch (Exception e) {
LogUtils.i("转换失败");
}
} else {
if (userType == ActionUtil.Contacts.FRIEND) {
UIHelper.showChatSplash(this, contactsView.getInfo()
.getUserId());
finish();
}
}
}
/**
* 请求开始
*/
public void onNetworkRequest() {
T.showLoading(this);
}
/**
* 请求成功后的回调方法
*/
public void onResultSuccess(NetworkEntity entity) {
T.hideLoading();
ContactsInfo[] infoArray = null;
if (entity.getRequest().getAction()
.equals(new Contacts_getUserTypeArrayRequest().getAction())) {
Contacts_getUserTypeArrayResponse tResponse = (Contacts_getUserTypeArrayResponse) entity
.getResponse();
infoArray = tResponse.getDetails();
}
if (entity.getRequest().getAction()
.equals(new Contacts_getUserByGroupIdRequest().getAction())) {
Contacts_getUserByGroupIdResponse tResponse = (Contacts_getUserByGroupIdResponse) entity
.getResponse();
infoArray = tResponse.getDetails();
}
if (infoArray == null) {
return;
}
// 保存到数据库中
for (ContactsInfo info : infoArray) {
CommonUser user = new CommonUser();
user.setUserAge(info.getUserAge());
user.setUserHeadUrl(info.getUserHeadUrl());
user.setUserId(info.getUserId());
user.setUserName(info.getUserName());
user.setUserSex(info.getUserSex());
user.setUserState(info.getUserState());
UserManager.getInstance(this).saveOrUpdateUser(user);
}
// 排序
Arrays.sort(infoArray, new PinyinComparator());
contacts = Arrays.asList(infoArray);
filterDateList = contacts;
if (chooseUserList != null) {
for (ContactsInfo con : chooseUserList) {
for (ContactsInfo con2 : filterDateList) {
if (con.getUserId() == con2.getUserId()) {
con2.setIsChoose(1);
}
}
}
}
initListView();
}
/**
* 请求失败后的回调方法
*/
public void onResultFail(String result) {
T.hideLoading();
}
public void onTouchingLetterChanged(String s) {
if (alphaIndexer(s) > 0) {
int position = alphaIndexer(s);
listview.setSelection(position);
}
}
private int alphaIndexer(String s) {
int position = 0;
for (int i = 0; i < filterDateList.size(); i++) {
if (PinyinUtil.getSortKey(filterDateList.get(i).getUserName())
.startsWith(s)) {
position = i;
break;
}
}
return position;
}
}