环信集成自定义发送类似淘宝商品信息条目

1.项目背景

出于项目的需要,今日一直研究环信集成的IM 发送类似淘宝商品链接的item ,小有成就 特在此分享: 电商中的及时聊天一般都要把商品的信息发送给卖家,以方便双方的交流,由于之前借鉴 了网上的一些例子,故个别字段和主题有点出入:
这里写图片描述

2.具体实现步骤

1.环信的消息扩展,首先我们要定义消息的扩展字段代码如下:

    public class MinPianConstant {
    public static final String MYTEXTTYPE="MYTEXTTYPE";//名片扩展
    public static final String ICON="img";
    public static final String GOODSNAME="goodsName";
    public static final String PRICE="goodsprice";
    public  static final String DESC="goodsdesc";
}

2.定义EaseMessageAdapter 常量

private static final int REQUEST_TYPE_RECV_CALL=5;
    private static final int REQUEST_TYPE_SEND_CALL=6;

3.创建发送的消息

由于从商品详情也跳转到聊天页面都需要发送商品item 所以每次创建时都发送消息给对方,但是有些可能从信息列表跳转到聊天页面这里给了标志位以作判别:
对话创建时发送商品详情的item
  @Override
    public void onActivityCreated(Bundle savedInstanceState) {

        fragmentArgs = getArguments();
        // check if single chat or group chat
        chatType = fragmentArgs.getInt(EaseConstant.EXTRA_CHAT_TYPE, EaseConstant.CHATTYPE_SINGLE);
        // userId you are chat with or group id
        toChatUsername = fragmentArgs.getString(EaseConstant.EXTRA_USER_ID);
        aNew=fragmentArgs.getString("new");
        if (aNew!=null){
          sendMIngPianMessage("万聚鲜城 冰岛进口新鲜冷冻海参斑鱼 去脏去砂开背600-800g/条","http://dynamic-image.yesky.com/740x-/uploadImages/2014/289/01/IGS09651F94M.jpg","不错");
        }
        super.onActivityCreated(savedInstanceState);
    }

  发送消息的方法
  protected void sendMIngPianMessage(String name, String imv, String desc) {
        EMMessage message = EMMessage.createTxtSendMessage(name,toChatUsername);
        message.setAttribute(MinPianConstant.ICON,imv);
        message.setAttribute(MinPianConstant.MYTEXTTYPE,"mingPianType");
        message.setAttribute(MinPianConstant.GOODSNAME,name);
        message.setAttribute(MinPianConstant.DESC,desc);
        EMClient.getInstance().chatManager().sendMessage(message);
       // sendMessage(message);
        Log.e("at22","成功");
    }

3.消息发送后下面就要对消息进行显示

接下来这个非常重要,这个是名片消息的ChatRow,就是载体
对,就是new一个chatRow出来,这个chatRow在easeui里面是没有的,所以需要我们自己写

必须注意,一定要继承EaseChatRow,不然就调不出onInflatView,onFindViewById,onUpdateView,onSetUpView,onBubbleClick这几个方法

package com.hyphenate.easeui.widget.chatrow;

import android.content.Context;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

import com.bumptech.glide.Glide;
import com.hyphenate.chat.EMMessage;
import com.hyphenate.chat.EMTextMessageBody;
import com.hyphenate.easeui.DemoHelper;
import com.hyphenate.easeui.MinPianConstant;
import com.hyphenate.easeui.R;

/**
 * Created by Administrator on 2017/12/6/006.
 */

public class MingPianChatRow extends EaseChatRow {

    public MingPianChatRow(Context context, EMMessage message, int position, BaseAdapter adapter) {
        super(context, message, position, adapter);
    }

    @Override
    protected void onInflateView() {

        if (DemoHelper.getInstance().isMingPianMessage(message)){
            inflater.inflate(message.direct()==EMMessage.Direct.RECEIVE? R.layout.easy_rec_mingpian:R.layout.easy_send_minpian,this);
        }
    }

    ImageView imv;
    TextView tv;
    @Override
    protected void onFindViewById() {

       imv= (ImageView) findViewById(R.id.imv);
       tv= (TextView) findViewById(R.id.tv);


    }

    @Override
    protected void onUpdateView() {

    }

    @Override
    protected void onSetUpView() {

       EMTextMessageBody textMessageBody= (EMTextMessageBody) message.getBody();
        if (message.direct()==EMMessage.Direct.RECEIVE){
            setMessageSendCallback();
            if (textMessageBody.getMessage()!=null){
                tv.setText(textMessageBody.getMessage()+"");
            }

        }
        if (message.getBooleanAttribute("mingPianType",true)){
            String message = this.message.getStringAttribute(MinPianConstant.GOODSNAME, null);
            String imageurl = this.message.getStringAttribute(MinPianConstant.ICON, null);
            tv.setText(message);
            Glide.with(context).load(imageurl).into(imv);
        }

    }

    @Override
    protected void onBubbleClick() {
        Toast.makeText(context,"跳转页面",Toast.LENGTH_SHORT).show();
    }
}

布局文件 发送和接受布局文件一样这里不在说明


> <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:gravity="center_horizontal"
    android:orientation="vertical"
    android:paddingTop="13dp" >

    <TextView
        android:id="@+id/timestamp"
        style="@style/chat_text_date_style"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="@dimen/margin_chat_activity" >

        <ImageView
            android:id="@+id/iv_userhead"
            android:layout_width="@dimen/size_avatar"
            android:layout_height="@dimen/size_avatar"
            android:layout_alignParentRight="true"
            android:layout_alignParentTop="true"
            android:layout_marginRight="@dimen/margin_chat_activity"
            android:background="@drawable/ease_default_avatar"
            android:scaleType="fitXY" />

        <RelativeLayout
            android:id="@+id/bubble"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginRight="@dimen/margin_chat_activity"
            android:layout_toLeftOf="@id/iv_userhead"
            >
            <TextView
                android:layout_toRightOf="@+id/imv"
                android:layout_alignParentRight="true"
                android:id="@+id/tv"
                android:text="123"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content" />
            <ImageView
                android:id="@+id/imv"
                android:layout_width="100dp"
                android:layout_height="100dp" />
            <TextView
                android:textColor="@color/holo_red_light"
                android:gravity="center"
                android:text="商品链接"
                android:layout_below="@+id/imv"
                android:layout_width="match_parent"
                android:layout_height="wrap_content" />
        </RelativeLayout>

        <!--  <TextView
             android:id="@+id/tv_userid"
             android:visibility="gone"
             style="@style/chat_text_name_style"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:layout_marginRight="15dp"
             android:layout_toLeftOf="@id/iv_userhead"
             android:text="xxx" /> -->

        <ImageView
            android:id="@+id/msg_status"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerVertical="true"
            android:layout_toLeftOf="@id/bubble"
            android:clickable="true"
            android:src="@drawable/ease_msg_state_failed_resend"
            android:visibility="gone" />

        <TextView
            android:id="@+id/tv_ack"
            style="@style/chat_text_name_style"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerVertical="true"
            android:layout_toLeftOf="@id/bubble"
            android:text="@string/text_ack_msg"
            android:textSize="12sp"
            android:visibility="invisible" />

        <TextView
            android:id="@+id/tv_delivered"
            style="@style/chat_text_name_style"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerVertical="true"
            android:layout_toLeftOf="@id/bubble"
            android:text="@string/text_delivered_msg"
            android:textSize="12sp"
            android:visibility="invisible" />

        <ProgressBar
            android:id="@+id/progress_bar"
            android:layout_width="25dp"
            android:layout_height="25dp"
            android:layout_centerVertical="true"
            android:layout_toLeftOf="@id/bubble"
            android:visibility="visible" />
    </RelativeLayout>

</LinearLayout>

根据不同的类型进行创建:

protected EaseChatRow createChatRow(Context context, EMMessage message, int position) {
        EaseChatRow chatRow = null;
        if(customRowProvider != null && customRowProvider.getCustomChatRow(message, position, this) != null){
            return customRowProvider.getCustomChatRow(message, position, this);
        }
        boolean mingPianMessage = DemoHelper.getInstance().isMingPianMessage(message);
        Log.e("at22",mingPianMessage+"---"+message.getType());
        if (DemoHelper.getInstance().isMingPianMessage(message)){

            return new MingPianChatRow(context,message,position,this);
        }

接下来就是在适配器中显示了:

    /**
     * get type of item
     */
    public int getItemViewType(int position) {
        EMMessage message = getItem(position); 
        if (message == null) {
            return -1;
        }

        if(customRowProvider != null && customRowProvider.getCustomChatRowType(message) > 0){
            return customRowProvider.getCustomChatRowType(message) + 13;
        }

        if (message.getType() == EMMessage.Type.TXT) {
            if(message.getBooleanAttribute(EaseConstant.MESSAGE_ATTR_IS_BIG_EXPRESSION, false)){
                return message.direct() == EMMessage.Direct.RECEIVE ? MESSAGE_TYPE_RECV_EXPRESSION : MESSAGE_TYPE_SENT_EXPRESSION;
            }
             if(DemoHelper.getInstance().isMingPianMessage(message)){
                return message.direct()==EMMessage.Direct.RECEIVE?REQUEST_TYPE_RECV_CALL:REQUEST_TYPE_SEND_CALL;
            }//这个很重要
        return -1;// invalid
    }

到最后,我们还需要一个步骤,就是去DemoHelper里面监听消息是不是名片扩展消息

public   class DemoHelper {
    private static final DemoHelper ourInstance = new DemoHelper();

   public   static DemoHelper getInstance() {
        return ourInstance;
    }

    private DemoHelper() {

    }

    public boolean isMingPianMessage(EMMessage emMessage){

        String TYPE = emMessage.getStringAttribute(MinPianConstant.MYTEXTTYPE, null);
        Log.e("at22",TYPE+"");
        if (TYPE==null){
            return false;
        }
        if (TYPE.equals("mingPianType")){
            return true;
        }

        return false;
    }

这样一个完整的商品扩展信息就写完了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值