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; } }