package com.partynetwork.iparty.friendslist; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.List; import com.baidu.mobstat.StatService; 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; 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.BitmapManager; 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.contacts.ContactsListActivity; import com.partynetwork.iparty.contacts.ContactsListAdapter; import com.partynetwork.iparty.contacts.ContactsListView; import com.partynetwork.iparty.info.ContactsInfo; import com.partynetwork.myview.mysidebar.MySideBar; import com.partynetwork.myview.mysidebar.MySideBar.OnTouchingLetterChangedListener; import android.app.Activity; import android.content.Context; import android.content.Intent; import android.os.Handler; import android.os.Parcelable; import android.support.v4.app.FragmentActivity; import android.text.Editable; import android.text.TextUtils; import android.text.TextWatcher; import android.view.Gravity; import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; import android.view.View.OnTouchListener; import android.view.ViewGroup.MarginLayoutParams; import android.widget.AbsListView.OnScrollListener; import android.widget.AdapterView.OnItemClickListener; import android.widget.AbsListView; import android.widget.AdapterView; import android.widget.AlphabetIndexer; import android.widget.EditText; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.ListView; import android.widget.TextView; import android.view.View.OnClickListener; public class FriendsListPage extends LinearLayout implements OnTouchingLetterChangedListener, OnItemClickListener, IJsonResultListener, OnClickListener { private Context mContext; private AppContext appContext; 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_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 Activity mActivity; /** * 记录点击的好友 */ private List<ContactsInfo> chooseUserList = new ArrayList<ContactsInfo>(); public static final int CONTACTS_REQUEST_CODE = 130; public static final String CONTACTS_ARRAY = "contacts_array"; private View view1; private View view2; public FriendsListPage(FragmentActivity activity) { super(activity); View.inflate(activity, R.layout.friendslistpage, this); ViewUtils.inject(this); mActivity=activity; pageType=ActionUtil.Contacts.FRIEND; initHeadView(); initView(); // sendRequest(); } private void initHeadView() { LayoutInflater layoutInflater = LayoutInflater.from(mActivity); view1 = layoutInflater.inflate(R.layout.listviewhead,null); view2 = layoutInflater.inflate(R.layout.listviewhead,null); ImageView imageView1=(ImageView)view1.findViewById(R.id.listviewhead_left); imageView1.setImageResource(R.drawable.friendlist_new); ImageView imageView2=(ImageView)view2.findViewById(R.id.listviewhead_left); imageView2.setImageResource(R.drawable.friendlist_icare); TextView textView2 = (TextView) view2.findViewById(R.id.listviewhead_text); textView2.setText("我关注的"); listview.addHeaderView(view1); listview.addHeaderView(view2); view1.setOnClickListener(this); view2.setOnClickListener(this); title_layout.setVisibility(GONE); } /** * 实例化控件 */ private void initView() { mContext=getContext(); mySideBar.setOnTouchingLetterChangedListener(this); try { Parcelable[] par = mActivity.getIntent().getParcelableArrayExtra( CONTACTS_ARRAY); for (Parcelable a : par) { chooseUserList.add((ContactsInfo) a); } } 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); initListView(); } /** * 根据输入框中的值来过滤数据并更新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(); } /** * 发送获取用户的请求 */ public void sendRequest() { AppContext context = (AppContext) mActivity.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() { adapter = new ContactsListAdapter(mActivity, 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) { if (firstVisibleItem<1) { title_layout.setVisibility(GONE); return; } 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()])); mActivity.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) { if (id<0) { return; } 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); } } } } catch (Exception e) { LogUtils.i("转换失败"); } } else { if (userType == ActionUtil.Contacts.FRIEND) { UIHelper.showChatSplash(mContext, contactsView.getInfo() .getUserId()); } } } /** * 请求开始 */ public void onNetworkRequest() { T.showLoading(mContext); } /** * 请求成功后的回调方法 */ 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(mActivity).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; } @Override public void onClick(View v) { if (v.equals(view1)) { //新的i好友 } if (v.equals(view2)) { //我关注的 Intent intent = new Intent(mActivity,ContactsListActivity.class); intent.putExtra(ContactsListActivity.USER_TYPE,1); mActivity.startActivity(intent); } } public void onResume() { StatService.onPageStart(mActivity, "friendsListPage"); } }