package com.fanxin.easeui.widget; import android.content.Context; import android.content.res.TypedArray; import android.graphics.drawable.Drawable; import android.support.v4.widget.SwipeRefreshLayout; import android.util.AttributeSet; import android.view.LayoutInflater; import android.widget.ListView; import android.widget.RelativeLayout; import com.fanxin.easeui.adapter.EaseMessageAdapter; import com.fanxin.easeui.utils.EaseCommonUtils; import com.fanxin.easeui.widget.chatrow.EaseCustomChatRowProvider; import com.hyphenate.chat.EMClient; import com.hyphenate.chat.EMConversation; import com.hyphenate.chat.EMMessage; import com.hyphenate.easeui.R; public class EaseChatMessageList extends RelativeLayout{ protected static final String TAG = "EaseChatMessageList"; protected ListView listView; protected SwipeRefreshLayout swipeRefreshLayout; protected Context context; protected EMConversation conversation; protected int chatType; protected String toChatUsername; protected EaseMessageAdapter messageAdapter; protected boolean showUserNick; protected boolean showAvatar; protected Drawable myBubbleBg; protected Drawable otherBuddleBg; public EaseChatMessageList(Context context, AttributeSet attrs, int defStyle) { this(context, attrs); } public EaseChatMessageList(Context context, AttributeSet attrs) { super(context, attrs); parseStyle(context, attrs); init(context); } public EaseChatMessageList(Context context) { super(context); init(context); } private void init(Context context){ this.context = context; LayoutInflater.from(context).inflate(R.layout.ease_chat_message_list, this); swipeRefreshLayout = (SwipeRefreshLayout) findViewById(R.id.chat_swipe_layout); listView = (ListView) findViewById(R.id.list); } /** * init widget * @param toChatUsername * @param chatType * @param customChatRowProvider */ public void init(String toChatUsername, int chatType, EaseCustomChatRowProvider customChatRowProvider) { this.chatType = chatType; this.toChatUsername = toChatUsername; conversation = EMClient.getInstance().chatManager().getConversation(toChatUsername, EaseCommonUtils.getConversationType(chatType), true); messageAdapter = new EaseMessageAdapter(context, toChatUsername, chatType, listView); messageAdapter.setShowAvatar(showAvatar); messageAdapter.setShowUserNick(showUserNick); messageAdapter.setMyBubbleBg(myBubbleBg); messageAdapter.setOtherBuddleBg(otherBuddleBg); messageAdapter.setCustomChatRowProvider(customChatRowProvider); // set message adapter listView.setAdapter(messageAdapter); refreshSelectLast(); } protected void parseStyle(Context context, AttributeSet attrs) { TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.EaseChatMessageList); showAvatar = ta.getBoolean(R.styleable.EaseChatMessageList_msgListShowUserAvatar, true); myBubbleBg = ta.getDrawable(R.styleable.EaseChatMessageList_msgListMyBubbleBackground); otherBuddleBg = ta.getDrawable(R.styleable.EaseChatMessageList_msgListMyBubbleBackground); showUserNick = ta.getBoolean(R.styleable.EaseChatMessageList_msgListShowUserNick, false); ta.recycle(); } /** * refresh */ public void refresh(){ if (messageAdapter != null) { messageAdapter.refresh(); } } /** * refresh and jump to the last */ public void refreshSelectLast(){ if (messageAdapter != null) { messageAdapter.refreshSelectLast(); } } /** * refresh and jump to the position * @param position */ public void refreshSeekTo(int position){ if (messageAdapter != null) { messageAdapter.refreshSeekTo(position); } } public ListView getListView() { return listView; } public SwipeRefreshLayout getSwipeRefreshLayout(){ return swipeRefreshLayout; } public EMMessage getItem(int position){ return messageAdapter.getItem(position); } public void setShowUserNick(boolean showUserNick){ this.showUserNick = showUserNick; } public boolean isShowUserNick(){ return showUserNick; } public interface MessageListItemClickListener{ void onResendClick(EMMessage message); /** * there is default handling when bubble is clicked, if you want handle it, return true * another way is you implement in onBubbleClick() of chat row * @param message * @return */ boolean onBubbleClick(EMMessage message); void onBubbleLongClick(EMMessage message); void onUserAvatarClick(String username); void onUserAvatarLongClick(String username); } /** * set click listener * @param listener */ public void setItemClickListener(MessageListItemClickListener listener){ if (messageAdapter != null) { messageAdapter.setItemClickListener(listener); } } /** * set chat row provider * @param rowProvider */ public void setCustomChatRowProvider(EaseCustomChatRowProvider rowProvider){ if (messageAdapter != null) { messageAdapter.setCustomChatRowProvider(rowProvider); } } }