package com.talk.demo; import android.accounts.Account; import android.content.Context; import android.os.Handler; import android.text.TextUtils; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.ImageView; import android.widget.ProgressBar; import android.widget.TextView; import com.talk.demo.CloudKite.taskListener; import com.talk.demo.talk.DialogCache; import com.talk.demo.talk.DialogItem; import com.talk.demo.talk.TalkViewItem; import com.talk.demo.time.DateInfo; import com.talk.demo.util.AccountUtils; import com.talk.demo.util.TalkUtil; import java.util.ArrayList; import java.util.HashMap; import java.util.List; public class TalkListAdapter extends BaseAdapter { private static String TAG = "TalkListAdapter"; private final Context context; private ViewHolder viewHolder; private LayoutInflater inflater; private ArrayList<TalkViewItem> mTalkItems; private HashMap<String, ArrayList<DialogCache>> mDialogCache; final static Handler mHandler = new Handler(); public TalkListAdapter(Context context, ArrayList<TalkViewItem> items, HashMap<String, ArrayList<DialogCache>> cache) { this.context = context; this.mTalkItems = items; this.mDialogCache = cache; inflater = (LayoutInflater) context .getSystemService(Context.LAYOUT_INFLATER_SERVICE); } @Override public View getView(int position, View convertView, final ViewGroup parent) { if (convertView == null) { convertView = inflater.inflate(R.layout.talk_listitem, parent, false); viewHolder = new ViewHolder(convertView); convertView.setTag(viewHolder); DialogItem dialog_item = mTalkItems.get(position).getListViewItem().get(0); viewHolder.friendName.setText(dialog_item.getLink()); DateInfo dateinfo = new DateInfo(dialog_item.getCreateTime()); dateinfo.parseCreateTime(); viewHolder.dialogTime.setText(dateinfo.getTimeTalk()); viewHolder.dialogContent.setText(dialog_item.getContent()); } else { viewHolder = (ViewHolder) convertView.getTag(); } final List<CloudKite> tasks = initTasks(mTalkItems.get(position)); for (CloudKite t : tasks) { new Thread(t).start(); } viewHolder.setNewTask(tasks); return convertView; } List<CloudKite> initTasks(TalkViewItem views) { ArrayList<DialogItem> items = views.getListViewItem(); List<CloudKite> result = new ArrayList<CloudKite>(); Account accout = AccountUtils.getPasswordAccessibleAccount(context); if (accout != null && !TextUtils.isEmpty(accout.name)) { Log.d(TAG,"ccount name: "+accout.name); } for(DialogItem item : items) { if(item.getSender().equals(accout.name) && !TalkUtil.isSendDone(item.getDoneTime())) { CloudKite ck = new CloudKite(item.getContent(), item.getIntervalTime(), item.getDoneTime()); result.add(ck); } } return result; } final static class ViewHolder { public ImageView imageType; public TextView friendName; public TextView dialogTime; public TextView dialogContent; public ProgressBar pbTask; public List<CloudKite> linkTask; public CloudKite.taskListener listener; public void removeListener() { if (linkTask != null && listener != null) { for(CloudKite ck: linkTask) { ck.removeListener(listener); } } } public void addListener() { if (linkTask != null) { for(CloudKite ck: linkTask) { ck.addListener(listener); } } } public void setNewTask(List<CloudKite> ts) { removeListener(); this.linkTask = ts; for(CloudKite ck: linkTask) { this.pbTask.setProgress(ck.getProgress()); } addListener(); } public ViewHolder(View convertView) { this.imageType = (ImageView) convertView.findViewById(R.id.icon); this.friendName = (TextView) convertView .findViewById(R.id.friend_name); this.dialogTime = (TextView) convertView .findViewById(R.id.dialog_time); this.dialogContent = (TextView) convertView .findViewById(R.id.dialog_content); this.pbTask = (ProgressBar) convertView.findViewById(R.id.pbTask); this.listener = new taskListener() { @Override public void onProgressChanged(final int progress) { mHandler.post(new Runnable() { @Override public void run() { pbTask.setProgress(progress); } }); } }; } } @Override public int getCount() { return mTalkItems.size(); } @Override public Object getItem(int position) { return null; } @Override public long getItemId(int position) { return position; } }