package net.dev123.yibo.service.adapter; import java.util.List; import net.dev123.commons.Paging; import net.dev123.commons.util.StringUtil; import net.dev123.commons.util.TimeSpanUtil; import net.dev123.mblog.entity.DirectMessage; import net.dev123.mblog.entity.User; import net.dev123.yibo.R; import net.dev123.yibo.common.EmotionLoader; import net.dev123.yibo.common.GlobalVars; import net.dev123.yibo.common.theme.ThemeUtil; import net.dev123.yibo.db.LocalAccount; import net.dev123.yibo.db.LocalDirectMessage; import net.dev123.yibo.service.cache.ConversationCache; import net.dev123.yibo.service.cache.wrap.DirectMessageWrap; import net.dev123.yibo.service.task.ConversationReadLocalTask; import net.dev123.yibo.service.task.ImageLoad4HeadTask; import net.dev123.yibo.service.task.InitAdapterTask; import android.content.Context; import android.text.Spannable; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.TextView; public class ConversationListAdapter extends CacheAdapter<DirectMessage> { private ConversationCache cache = null; public ConversationListAdapter(Context context, LocalAccount account, User conversationUser) { super(context, account); this.paging = new Paging<DirectMessage>(); cache = new ConversationCache(context, account, conversationUser); InitAdapterTask task = new InitAdapterTask(cache, this); task.execute(); } @Override public int getCount() { return cache.size(); } @Override public Object getItem(int position) { if (position < 0 || position > getCount() - 1) { return null; } Object obj = getItemWrap(position); if (obj != null) { obj = ((DirectMessageWrap)obj).getWrap(); } return obj; } public Object getItemWrap(int position) { if (position < 0) { position = 0; } if (position > getCount() - 1) { position = getCount() - 1; } return cache.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { Object obj = getItem(position); DirectMessage message = (DirectMessage)obj; int itemViewType = getItemViewType(position); if (itemViewType == ITEM_VIEW_TYPE_DATA) { convertView = fillInView(convertView, message); } else { convertView = fillInDividerView(convertView, message, position); } return convertView; } private View fillInView(View convertView, DirectMessage message) { DirectMessageHolder holder = null; if (convertView == null || !isDirectMessageView(convertView)) { convertView = inflater.inflate(R.layout.list_item_conversation, null); holder = new DirectMessageHolder(convertView); convertView.setTag(holder); } else { holder = (DirectMessageHolder)convertView.getTag(); } if (holder == null) { return null; } holder.reset(); String myId = account.getUser().getId(); User targetUser = message.getSender(); ImageView ivProfilePicture = holder.ivProfilePicture; if (myId.equals(targetUser.getId())) { ivProfilePicture = holder.ivMyProfilePicture; } if (GlobalVars.IS_SHOW_HEAD) { ivProfilePicture.setVisibility(View.VISIBLE); String profileUrl = targetUser.getProfileImageUrl(); if (StringUtil.isNotEmpty(profileUrl)) { ImageLoad4HeadTask headTask = new ImageLoad4HeadTask(ivProfilePicture, profileUrl, true); holder.headTask = headTask; headTask.execute(); } } holder.tvScreenName.setText(targetUser.getScreenName()); holder.tvCreateAt.setText(TimeSpanUtil.toTimeSpanString(message.getCreatedAt())); Spannable textSpan = EmotionLoader.getEmotionSpannable(message.getServiceProvider(), message.getText()); holder.tvMessageText.setText(textSpan); return convertView; } private View fillInDividerView(View convertView, DirectMessage message, final int position) { if (message == null || !(message instanceof LocalDirectMessage)) { return null; } final LocalDirectMessage divider = (LocalDirectMessage)message; if (!divider.isLocalDivider()) { convertView = inflater.inflate(R.layout.list_item_gap, null); ThemeUtil.setListViewGap(convertView); if (divider.isLoading()) { convertView.findViewById(R.id.llLoadingState).setVisibility(View.VISIBLE); } convertView.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { v.setClickable(false); v.findViewById(R.id.llLoadingState).setVisibility(View.VISIBLE); } }); } else { if (convertView == null) { convertView = inflater.inflate(R.layout.list_item_more, null); ThemeUtil.setListViewMore(convertView); } if (divider.isLoading()) { convertView.findViewById(R.id.llLoadingState).setVisibility(View.VISIBLE); convertView.findViewById(R.id.tvFooter).setVisibility(View.GONE); } else { convertView.findViewById(R.id.llLoadingState).setVisibility(View.GONE); convertView.findViewById(R.id.tvFooter).setVisibility(View.VISIBLE); } if (paging.hasNext()) { convertView.setOnClickListener(new OnClickListener(){ @Override public void onClick(View v) { if (divider.isLoading()) { return; } v.setClickable(false); v.findViewById(R.id.llLoadingState).setVisibility(View.VISIBLE); v.findViewById(R.id.tvFooter).setVisibility(View.GONE); DirectMessage max = (DirectMessage)getItem(position - 1); DirectMessage since = (DirectMessage)getItem(position + 1); ConversationReadLocalTask readLocalTask= new ConversationReadLocalTask( ConversationListAdapter.this, cache, divider ); readLocalTask.execute(max, since); } }); } else { ((TextView)convertView.findViewById(R.id.tvFooter)).setText(R.string.label_no_more); } } return convertView; } private boolean isDirectMessageView(View convertView) { boolean isStatusView = false; try { View view = convertView.findViewById(R.id.ivProfilePicture); if (view != null) { isStatusView = true; } } catch(Exception e) { } return isStatusView; } public void clear() { cache.clear(); this.notifyDataSetChanged(); } public LocalAccount getAccount() { return account; } public void setAccount(LocalAccount account) { this.account = account; } @Override public boolean addCacheToFirst(List<DirectMessage> list) { return false; } @Override public boolean addCacheToDivider(DirectMessage value, List<DirectMessage> list) { return false; } @Override public boolean addCacheToLast(List<DirectMessage> list) { return false; } @Override public DirectMessage getMax() { // TODO Auto-generated method stub return null; } @Override public DirectMessage getMin() { // TODO Auto-generated method stub return null; } @Override public boolean remove(DirectMessage message) { if (message == null) { return false; } DirectMessageWrap wrap = new DirectMessageWrap(message); cache.remove(wrap); this.notifyDataSetChanged(); return true; } @Override public int getItemViewType(int position) { DirectMessage message = (DirectMessage)getItem(position); if (message == null) { return ITEM_VIEW_TYPE_REMOTE_DIVIDER; } if (!(message instanceof LocalDirectMessage)) { return ITEM_VIEW_TYPE_DATA; } LocalDirectMessage localMessage = (LocalDirectMessage)message; if (!localMessage.isDivider()) { return ITEM_VIEW_TYPE_DATA; } if (localMessage.isLocalDivider()) { return ITEM_VIEW_TYPE_LOCAL_DIVIDER; } return ITEM_VIEW_TYPE_REMOTE_DIVIDER; } @Override public int getViewTypeCount() { return 3; } }