package com.fanxin.app.fx;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import android.annotation.SuppressLint;
import android.content.Intent;
import android.os.Bundle;
import android.support.v4.app.Fragment;
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.ListView;
import android.widget.RelativeLayout;
import android.widget.TextView;
import com.easemob.chat.EMContactManager;
import com.fanxin.app.Constant;
import com.fanxin.app.MYApplication;
import com.fanxin.app.R;
import com.fanxin.app.domain.User;
import com.fanxin.app.fx.CreatChatRoomActivity.PinyinComparator;
import com.fanxin.app.fx.others.ContactAdapter;
import com.fanxin.app.widget.Sidebar;
/**
* 联系人列表页
*
*/
@SuppressLint("InflateParams")
public class FragmentFriends extends Fragment {
private ContactAdapter adapter;
private List<User> contactList;
private ListView listView;
private boolean hidden;
private Sidebar sidebar;
private List<String> blackList;
private TextView tv_unread;
private TextView tv_total;
private LayoutInflater infalter;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
return inflater
.inflate(R.layout.fragment_contactlist, container, false);
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
// 防止被T后,没点确定按钮然后按了home键,长期在后台又进app导致的crash
if (savedInstanceState != null
&& savedInstanceState.getBoolean("isConflict", false))
return;
listView = (ListView) getView().findViewById(R.id.list);
// 黑名单列表
blackList = EMContactManager.getInstance().getBlackListUsernames();
contactList = new ArrayList<User>();
// 获取设置contactlist
getContactList();
infalter=LayoutInflater.from(getActivity());
View headView = infalter.inflate(R.layout.item_contact_list_header,
null);
listView.addHeaderView(headView);
View footerView = infalter.inflate(R.layout.item_contact_list_footer,
null);
listView.addFooterView(footerView);
sidebar = (Sidebar) getView().findViewById(R.id.sidebar);
sidebar.setListView(listView);
tv_unread = (TextView) headView.findViewById(R.id.tv_unread);
if(((MainActivity)getActivity()).unreadAddressLable.getVisibility()==View.VISIBLE){
tv_unread.setVisibility(View.VISIBLE);
tv_unread.setText(((MainActivity)getActivity()).unreadAddressLable.getText());
}else{
tv_unread.setVisibility(View.GONE);
}
tv_total = (TextView) footerView.findViewById(R.id.tv_total);
// 设置adapter
adapter = new ContactAdapter(getActivity(), R.layout.item_contact_list,
contactList);
listView.setAdapter(adapter);
listView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
if(position!=0&&position!=contactList.size()+1){
User user=contactList.get(position-1);
String username = user.getUsername();
startActivity(new Intent(getActivity(), UserInfoActivity.class)
.putExtra("hxid", username ).putExtra("nick", user.getNick() ).putExtra("avatar", user.getAvatar() ).putExtra("sex", user.getSex() ));
}
}
});
tv_total.setText(String.valueOf(contactList.size())+"位联系人");
RelativeLayout re_newfriends=(RelativeLayout) headView.findViewById(R.id.re_newfriends);
RelativeLayout re_chatroom=(RelativeLayout) headView.findViewById(R.id.re_chatroom);
re_newfriends.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v) {
startActivity(new Intent(getActivity(),NewFriendsActivity.class));
}
});
re_chatroom.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v) {
startActivity(new Intent(getActivity(),ChatRoomActivity.class));
}
});
}
@Override
public void onHiddenChanged(boolean hidden) {
super.onHiddenChanged(hidden);
this.hidden = hidden;
if (!hidden) {
refresh();
}
}
@Override
public void onResume() {
super.onResume();
if (!hidden) {
refresh();
}
}
// 刷新ui
public void refresh() {
try {
// 可能会在子线程中调到这方法
getActivity().runOnUiThread(new Runnable() {
public void run() {
getContactList();
adapter.notifyDataSetChanged();
tv_total.setText(String.valueOf(contactList.size())+"位联系人");
if(((MainActivity)getActivity()).unreadAddressLable.getVisibility()==View.VISIBLE){
tv_unread.setVisibility(View.VISIBLE);
tv_unread.setText(((MainActivity)getActivity()).unreadAddressLable.getText());
}else{
tv_unread.setVisibility(View.GONE);
}
}
});
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 获取联系人列表,并过滤掉黑名单和排序
*/
private void getContactList() {
contactList.clear();
// 获取本地好友列表
Map<String, User> users = MYApplication.getInstance().getContactList();
Iterator<Entry<String, User>> iterator = users.entrySet().iterator();
while (iterator.hasNext()) {
Entry<String, User> entry = iterator.next();
if (!entry.getKey().equals(Constant.NEW_FRIENDS_USERNAME)
&& !entry.getKey().equals(Constant.GROUP_USERNAME)
&& !blackList.contains(entry.getKey()))
contactList.add(entry.getValue());
}
// 对list进行排序
Collections.sort(contactList, new PinyinComparator() {
});
}
@SuppressLint("DefaultLocale")
public class PinyinComparator implements Comparator<User> {
@SuppressLint("DefaultLocale")
@Override
public int compare(User o1, User o2) {
// TODO Auto-generated method stub
String py1 = o1.getHeader();
String py2 = o2.getHeader();
// 判断是否为空""
if (isEmpty(py1) && isEmpty(py2))
return 0;
if (isEmpty(py1))
return -1;
if (isEmpty(py2))
return 1;
String str1 = "";
String str2 = "";
try {
str1 = ((o1.getHeader()).toUpperCase()).substring(0, 1);
str2 = ((o2.getHeader()).toUpperCase()).substring(0, 1);
} catch (Exception e) {
System.out.println("某个str为\" \" 空");
}
return str1.compareTo(str2);
}
private boolean isEmpty(String str) {
return "".equals(str.trim());
}
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
if (((MainActivity) getActivity()).isConflict) {
outState.putBoolean("isConflict", true);
} else if (((MainActivity) getActivity()).getCurrentAccountRemoved()) {
outState.putBoolean(Constant.ACCOUNT_REMOVED, true);
}
}
}