package com.kaixin.android.activity;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.json.JSONArray;
import org.json.JSONObject;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextUtils;
import android.text.TextWatcher;
import android.util.TypedValue;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.SectionIndexer;
import android.widget.TextView;
import com.kaixin.android.KXActivity;
import com.kaixin.android.R;
import com.kaixin.android.common.Constants;
import com.kaixin.android.result.FriendsResult;
import com.kaixin.android.ui.base.MyLetterListView;
import com.kaixin.android.ui.base.MyLetterListView.OnTouchingLetterChangedListener;
import com.kaixin.android.utils.CallService;
import com.kaixin.android.utils.TextUtil;
import com.nostra13.universalimageloader.core.ImageLoader;
/**
* 选择好友类
*
* @author gyz
*
*/
public class SelectFriendsActivity extends KXActivity {
private Button mCancel;
private Button mSubmit;
private EditText mSearch;
private ListView mDisplay;
private MyLetterListView mLetter;
private LinearLayout mFriendsList;
private TextUtil mTextUtil;
private FriendsAdapter mAdapter;
// 当前显示的好友数据
private List<FriendsResult> mMyFriendsResults = new ArrayList<FriendsResult>();
// 当前显示的好友的姓名的首字母的在列表中的位置
private List<Integer> mMyFriendsPosition = new ArrayList<Integer>();
// 当前显示的好友的姓名的首字母数据
private List<String> mMyFriendsFirstName = new ArrayList<String>();
// 选择的好友的列表
private Map<String, Map<String, String>> mGiftFriendsList = new HashMap<String, Map<String, String>>();
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.selectfriends_activity);
findViewById();
setListener();
init();
}
private void findViewById() {
mCancel = (Button) findViewById(R.id.selectfriends_cancel);
mSubmit = (Button) findViewById(R.id.selectfriends_submit);
mSearch = (EditText) findViewById(R.id.selectfriends_search);
mDisplay = (ListView) findViewById(R.id.selectfriends_display);
mLetter = (MyLetterListView) findViewById(R.id.selectfriends_letter);
mFriendsList = (LinearLayout) findViewById(R.id.selectfriends_list);
}
private void setListener() {
mCancel.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
// 关闭当前界面并返回数据
setResult(RESULT_CANCELED);
finish();
}
});
mSubmit.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
// 赋值当前选择的好友列表,返回数据并关闭当前界面
mKXApplication.mGiftFriendsList = mGiftFriendsList;
setResult(RESULT_OK);
finish();
}
});
mSearch.addTextChangedListener(new TextWatcher() {
// 当文本改变时调用
public void onTextChanged(CharSequence s, int start, int before,
int count) {
// 清除当前所有的数据
mMyFriendsResults.clear();
mMyFriendsPosition.clear();
mMyFriendsFirstName.clear();
// 获取当前输入的内容并大写
String searchChar = s.toString().toUpperCase();
// 判断输入内容的长度
if (searchChar.length() > 0) {
// 判断是否是字母
if (searchChar.matches("^[a-z,A-Z].*$")) {
// 判断当前好友里是有存在这个字母,有的话则取出数据更新界面,否则直接更新界面
if (mKXApplication.mMyFriendsGroupByFirstName
.containsKey(searchChar)) {
List<FriendsResult> results = mKXApplication.mMyFriendsGroupByFirstName
.get(searchChar);
mMyFriendsResults.addAll(results);
mMyFriendsFirstName.add(searchChar);
mMyFriendsPosition.add(0);
mAdapter.notifyDataSetChanged();
} else {
mAdapter.notifyDataSetChanged();
}
} else {
mAdapter.notifyDataSetChanged();
}
} else {
// 输入框没内容时,获取全部好友并更新界面
mMyFriendsResults.addAll(mKXApplication.mMyFriendsResults);
mMyFriendsPosition
.addAll(mKXApplication.mMyFriendsPosition);
mMyFriendsFirstName
.addAll(mKXApplication.mMyFriendsFirstName);
mAdapter.notifyDataSetChanged();
}
}
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
}
public void afterTextChanged(Editable s) {
}
});
mDisplay.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
// 获取当前点击的好友数据
int section = mAdapter.getSectionForPosition(position);
final FriendsResult result = mKXApplication.mMyFriendsGroupByFirstName
.get(mMyFriendsFirstName.get(section))
.get(position - mAdapter.getPositionForSection(section));
// 判断是否是已经存在,存在则删除,否则则添加
if (mGiftFriendsList.containsKey(result.getUid())) {
mGiftFriendsList.remove(result.getUid());
} else {
Map<String, String> map = new HashMap<String, String>();
map.put("uid", result.getUid());
map.put("name", result.getName());
map.put("avatar", String.valueOf(result.getAvatar()));
mGiftFriendsList.put(result.getUid(), map);
}
// 更新界面
mAdapter.notifyDataSetChanged();
// 更新头像列表
initFriendsList();
}
});
mLetter.setOnTouchingLetterChangedListener(new OnTouchingLetterChangedListener() {
public void onTouchingLetterChanged(String s) {
// 根据触摸的字母,跳转到响应位置
if (mKXApplication.mMyFriendsFirstNamePosition.get(s) != null) {
mDisplay.setSelection(mKXApplication.mMyFriendsFirstNamePosition
.get(s));
}
}
});
}
private void init() {
// 获取当前已经选择的好友
mGiftFriendsList.putAll(mKXApplication.mGiftFriendsList);
// 实例化工具类
mTextUtil = new TextUtil(mKXApplication);
// 初始化头像列表
initFriendsList();
// 获取我的好友数据
getMyFriends();
// 添加适配器
mAdapter = new FriendsAdapter();
mDisplay.setAdapter(mAdapter);
}
/**
* 修改头像框显示内容
*/
private void initFriendsList() {
mFriendsList.removeAllViews();
for (Map.Entry<String, Map<String, String>> entry : mGiftFriendsList
.entrySet()) {
ImageView imageView = getImageView();
// imageView.setImageBitmap(mKXApplication.getAvatar(Integer
// .parseInt(entry.getValue().get("avatar"))));
ImageLoader.getInstance().displayImage(Constants.getImageUrl() + entry.getValue().get("avatar"), imageView);
mFriendsList.addView(imageView);
mFriendsList.invalidate();
}
ImageView imageView = getImageView();
imageView.setImageBitmap(BitmapFactory.decodeResource(getResources(),
R.drawable.gifts_head_location));
mFriendsList.addView(imageView);
mFriendsList.invalidate();
}
/**
* 获取头像框控件
*
* @return
*/
private ImageView getImageView() {
ImageView imageView = new ImageView(SelectFriendsActivity.this);
int widthAndHeight = (int) TypedValue.applyDimension(
TypedValue.COMPLEX_UNIT_DIP, 35, getResources()
.getDisplayMetrics());
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
widthAndHeight, widthAndHeight);
imageView.setLayoutParams(params);
imageView.setPadding(4, 4, 4, 4);
return imageView;
}
/**
* 获取我的好友数据
*/
private void getMyFriends() {
if (mKXApplication.mMyFriendsResults.isEmpty()) {
String json = CallService.getMyFriends("");
try {
JSONObject object = new JSONObject(json);
JSONArray array = object.getJSONArray("data");
FriendsResult result = null;
for (int i = 0; i < array.length(); i++) {
result = new FriendsResult();
result.setUid(array.getJSONObject(i).getString("uid"));
result.setName(array.getJSONObject(i).getString("name"));
result.setAvatar(array.getJSONObject(i).getString("avatar"));
result.setName_pinyin(mTextUtil.getStringPinYin(result
.getName()));
if (!TextUtils.isEmpty(result.getName_pinyin())) {
result.setName_first(result.getName_pinyin()
.substring(0, 1).toUpperCase());
}
mKXApplication.mMyFriendsResults.add(result);
if (result.getName_first().matches("^[a-z,A-Z].*$")) {
if (mKXApplication.mMyFriendsFirstName.contains(result
.getName_first())) {
mKXApplication.mMyFriendsGroupByFirstName.get(
result.getName_first()).add(result);
} else {
mKXApplication.mMyFriendsFirstName.add(result
.getName_first());
List<FriendsResult> list = new ArrayList<FriendsResult>();
list.add(result);
mKXApplication.mMyFriendsGroupByFirstName.put(
result.getName_first(), list);
}
} else {
if (mKXApplication.mMyFriendsFirstName.contains("#")) {
mKXApplication.mMyFriendsGroupByFirstName.get("#")
.add(result);
} else {
mKXApplication.mMyFriendsFirstName.add("#");
List<FriendsResult> list = new ArrayList<FriendsResult>();
list.add(result);
mKXApplication.mMyFriendsGroupByFirstName.put("#",
list);
}
}
}
Collections.sort(mKXApplication.mMyFriendsFirstName);
int position = 0;
for (int i = 0; i < mKXApplication.mMyFriendsFirstName.size(); i++) {
mKXApplication.mMyFriendsFirstNamePosition
.put(mKXApplication.mMyFriendsFirstName.get(i),
position);
mKXApplication.mMyFriendsPosition.add(position);
position += mKXApplication.mMyFriendsGroupByFirstName.get(
mKXApplication.mMyFriendsFirstName.get(i)).size();
}
} catch (Exception e) {
}
}
//添加数据到当前显示的数据
mMyFriendsResults.addAll(mKXApplication.mMyFriendsResults);
mMyFriendsPosition.addAll(mKXApplication.mMyFriendsPosition);
mMyFriendsFirstName.addAll(mKXApplication.mMyFriendsFirstName);
}
private class FriendsAdapter extends BaseAdapter implements SectionIndexer {
public int getCount() {
return mMyFriendsResults.size();
}
public Object getItem(int position) {
return mMyFriendsResults.get(position);
}
public long getItemId(int position) {
return position;
}
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder = null;
if (convertView == null) {
convertView = LayoutInflater.from(SelectFriendsActivity.this)
.inflate(R.layout.selectfriends_activity_item, null);
holder = new ViewHolder();
holder.alpha = (TextView) convertView
.findViewById(R.id.selectfriends_item_alpha);
holder.alpha_line = (ImageView) convertView
.findViewById(R.id.selectfriends_item_alpha_line);
holder.avatar = (ImageView) convertView
.findViewById(R.id.selectfriends_item_avatar);
holder.name = (TextView) convertView
.findViewById(R.id.selectfriends_item_name);
holder.status = (ImageView) convertView
.findViewById(R.id.selectfriends_item_status);
holder.style = (CheckBox) convertView
.findViewById(R.id.selectfriends_item_style);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
int section = getSectionForPosition(position);
final FriendsResult result = mKXApplication.mMyFriendsGroupByFirstName
.get(mMyFriendsFirstName.get(section)).get(
position - getPositionForSection(section));
if (getPositionForSection(section) == position) {
holder.alpha.setVisibility(View.VISIBLE);
holder.alpha_line.setVisibility(View.VISIBLE);
holder.alpha.setText(mMyFriendsFirstName.get(section));
} else {
holder.alpha.setVisibility(View.GONE);
holder.alpha_line.setVisibility(View.GONE);
}
holder.name.setText(result.getName());
// holder.avatar.setImageBitmap(mKXApplication.getAvatar(result
// .getAvatar()));
ImageLoader.getInstance().displayImage(Constants.getImageUrl() + result
.getAvatar(), holder.avatar);
holder.status.setVisibility(View.GONE);
if (mGiftFriendsList.containsKey(result.getUid())) {
holder.style.setChecked(true);
} else {
holder.style.setChecked(false);
}
holder.style.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
if (mGiftFriendsList.containsKey(result.getUid())) {
mGiftFriendsList.remove(result.getUid());
} else {
Map<String, String> map = new HashMap<String, String>();
map.put("uid", result.getUid());
map.put("name", result.getName());
map.put("avatar", String.valueOf(result.getAvatar()));
mGiftFriendsList.put(result.getUid(), map);
}
notifyDataSetChanged();
initFriendsList();
}
});
return convertView;
}
class ViewHolder {
TextView alpha;
ImageView alpha_line;
ImageView avatar;
TextView name;
ImageView status;
CheckBox style;
}
public Object[] getSections() {
return mMyFriendsFirstName.toArray();
}
public int getPositionForSection(int section) {
if (section < 0 || section >= mMyFriendsFirstName.size()) {
return -1;
}
return mMyFriendsPosition.get(section);
}
public int getSectionForPosition(int position) {
if (position < 0 || position >= mMyFriendsResults.size()) {
return -1;
}
int index = Arrays.binarySearch(mMyFriendsPosition.toArray(),
position);
return index >= 0 ? index : -index - 2;
}
}
public void onBackPressed() {
setResult(RESULT_CANCELED);
finish();
}
}