package com.sogou.sogouchat.ui; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Calendar; import java.util.Collections; import java.util.Comparator; import java.util.Date; import java.util.HashMap; import java.util.Iterator; import java.util.List; import com.sogou.sogouchat.R; import com.sogou.sogouchat.SogouChatApp; import com.sogou.sogouchat.bean.ContactNode; import com.sogou.sogouchat.bean.TelNode; import android.content.Context; import android.graphics.Color; import android.os.Bundle; import android.text.format.DateFormat; import android.text.format.Time; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.Button; import android.widget.ImageView; import android.widget.TextView; public class NewsListAdapter extends BaseAdapter { public final class ViewHolder{ public ImageView mImg; public TextView mName; public TextView mLastBody; public TextView mLastDate; public BadgeView mBadge; } public ArrayList<TelNode> mData = new ArrayList<TelNode>(); private LayoutInflater mInflater; private TabMainActivity mActivity; private SogouChatApp mApp; private static final int mDroidGreen = Color.parseColor("#A4C639"); private int mJuliaDay; public NewsListAdapter(Context context, SogouChatApp app){ mActivity =(TabMainActivity) context; mInflater = LayoutInflater.from(context); mApp = app; } public void extraList() { mData.clear(); int totalNew = 0; Iterator<TelNode> telIt = mApp.mTelList.iterator(); while (telIt.hasNext()) { TelNode telNode = telIt.next(); if (telNode.mMsgCnt > 0) { mData.add(telNode); if (telNode.mNewMsgCnt > 0) totalNew += telNode.mNewMsgCnt; } } // sort list Collections.sort(mData, new SortByDate()); sortDataByDate(); if (totalNew > 0) { mActivity.setTotalNewMsgCnt(totalNew); } // // Print // Iterator<TelNode> ii = mData.iterator(); // while (ii.hasNext()) { // TelNode telNode = ii.next(); // Log.i("NewsListAdapter", telNode.mName + telNode.mLastBody); // } } //倒序 class SortByDate implements Comparator { public int compare(Object o1, Object o2) { TelNode item1 = (TelNode) o1; TelNode item2 = (TelNode) o2; if (item1.mLastDate > item2.mLastDate) return -1; else return 1; } } ArrayList<TelNode> getData(){ return mData; } void setData(ArrayList<TelNode> data){ mData = data; } @Override public int getCount() { // TODO Auto-generated method stub return mData.size(); } @Override public Object getItem(int arg0) { // TODO Auto-generated method stub return null; } @Override public long getItemId(int arg0) { // TODO Auto-generated method stub return 0; } @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder = null; TelNode item = mData.get(position); if (convertView == null) { holder = new ViewHolder(); if (item.mTel != null) { convertView = mInflater.inflate(R.layout.item_news_list, null); } else { convertView = mInflater.inflate(R.layout.item_news_separator,null); } convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } if (holder == null) { holder = new ViewHolder(); } if (item.mTel != null) { if (holder.mName== null || holder.mName.getId() != R.id.news_text_name){ convertView = mInflater.inflate(R.layout.item_news_list, null); } holder.mImg = (ImageView) convertView.findViewById(R.id.news_icon); holder.mName = (TextView) convertView.findViewById(R.id.news_text_name); holder.mLastBody = (TextView) convertView .findViewById(R.id.news_text_msg); holder.mLastDate = (TextView) convertView.findViewById(R.id.news_text_date); holder.mBadge = new BadgeView(mActivity, holder.mImg); holder.mBadge.setBadgeBackgroundColor(mDroidGreen); holder.mBadge.setTextColor(Color.BLACK); holder.mName.setText(item.mName); holder.mLastBody.setText(item.mLastBody); String dateFormat = "MM/dd h:mmaa"; // if (isSameDay(item.mTelNode.mLastDate)){ // dateFormat = "h:mmaa"; // } // else { // dateFormat = "MM/dd h:mmaa"; // } SimpleDateFormat format1 = new SimpleDateFormat(dateFormat); String date = format1.format(item.mLastDate); holder.mLastDate.setText(date); if (item.mNewMsgCnt > 0) { holder.mBadge.setText(String.valueOf(item.mNewMsgCnt)); holder.mBadge.show(); } else { holder.mBadge.hide(); } } else{ if (holder.mName== null || holder.mName.getId() != R.id.news_text_separator){ convertView = mInflater.inflate(R.layout.item_news_separator,null); } holder.mName = (TextView) convertView.findViewById(R.id.news_text_separator); holder.mName.setText(item.mName); } return convertView; } private final void sortDataByDate(){ int sIndex=0; for(int i =0; i < mData.size(); i++){ TelNode item =mData.get(i); int ssIndex = beforeToday(item.mLastDate); if (ssIndex != sIndex){ sIndex = ssIndex; TelNode separator = new TelNode(); separator.mName = getSeparatorName(sIndex); separator.mTel = null; mData.add(i, separator); i++; } } } public static int beforeToday(long date) { int sIndex; int bDay; Time nTime = new Time(); nTime.setToNow(); Time oTime = new Time(); oTime.set(date); int dayNow = Time.getJulianDay(nTime.normalize(true), 0); int day = Time.getJulianDay(date, 0); //天数差 bDay = dayNow - day; int wDay = nTime.weekDay; int nMon= nTime.month; int oMon = oTime.month; if (bDay == 0){ sIndex = 0; } else if (bDay == 1){ sIndex = 1; } else if (bDay == 2){ sIndex = 2; } //一周之内 else if (bDay >2 && bDay<= wDay ){ sIndex = oTime.weekDay+10; } //上周 else if (bDay > wDay && bDay <= 7 + wDay && nMon == oMon ){ sIndex = 20; } //两周以前 else if (bDay > 7 + wDay && bDay <= 14 + wDay && nMon == oMon ){ sIndex = 30; } //三周以前 else if (bDay > 14 + wDay -2 && bDay <= 21 + wDay && nMon == oMon ){ sIndex = 40; } //上个月 else if (nMon - oMon == 1 ){ sIndex = 50; } //更早 else { sIndex = 100; } return sIndex; } private String getSeparatorName(int sIndex){ String name="更早"; switch(sIndex){ case 0: name = "今天"; break; case 1: name = "昨天"; break; case 2: name = "前天"; break; case 10: name = "周天"; break; case 11: name = "周一"; break; case 12: name = "周二"; break; case 13: name = "周三"; break; case 14: name = "周四"; break; case 15: name = "周五"; break; case 16: name = "周六"; break; case 20: name = "上周"; break; case 30: name = "两周以前"; break; case 40: name = "三周以前"; break; case 50: name = "上月"; break; default: name = "更早"; break; } return name; } }