分左右布局的聊天界面、并且添加表情

书接昨天,设计分左右布局的聊天界面,需要添加一个右边的listview,与左边的十分相似;添加表情,需要在原布局下添加一个GridView,并且写一个表情的布局文件,最后写一个表情的适配器ExpressionAdapter。

public class ExpressionAdapter extends BaseAdapter {
    private int[] mData = {R.mipmap.eca,R.mipmap.ecb,R.mipmap.ecc,R.mipmap.ecd,R.mipmap.ece,R.mipmap.ecf,
            R.mipmap.ecg,R.mipmap.ech,R.mipmap.eci, R.mipmap.ecj,R.mipmap.eck,R.mipmap.ecl,R.mipmap.ecm,
            R.mipmap.ecn,R.mipmap.eco,R.mipmap.ecp,R.mipmap.ecq,R.mipmap.ecr,R.mipmap.ecs,R.mipmap.ect,
            R.mipmap.ecu,R.mipmap.ecv,R.mipmap.ecw,R.mipmap.ecx,R.mipmap.ecy,R.mipmap.ecz} ;
    private LayoutInflater mInflater;

    public ExpressionAdapter(LayoutInflater layoutInflater) {
        this.mInflater = layoutInflater;
    }

    @Override
    public int getCount() {
        return mData.length;
    }

    @Override
    public Object getItem(int position) {
        return position;
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup viewGroup) {
        ViewHolder vh = null;
        if (convertView == null){
            convertView = mInflater.inflate(R.layout.item_image,null);
            vh = new ViewHolder();
            vh.imageview = (ImageView) convertView.findViewById(R.id.imageview_ex);
            convertView.setTag(vh);
        }else{
            vh = (ViewHolder) convertView.getTag();
            vh.imageview.setImageResource(mData[position]);
        }
        return convertView;
    }
    class ViewHolder{
        ImageView imageview;
    }
}

还需要在model中添加一个全局变量type,以区别左右的类型。

public class MessageAdapter extends BaseAdapter {
    private LayoutInflater mInflater;
    private List<ChatMessage> mData;
    private Html.ImageGetter mImageGetter;
    private SimpleDateFormat mFormat;
    public static final int MESSAGE_LEFT = 0;
    public static final int MESSAGE_RIGHT = 1;
    public static final int MAX_TYPE = 2;


    public MessageAdapter(LayoutInflater mInflater, List<ChatMessage> mData, Html.ImageGetter mImageGetter) {
        this.mInflater = mInflater;
        this.mData = mData;
        this.mImageGetter = mImageGetter;
        mFormat = new SimpleDateFormat("EEE HH:mm");
    }

    @Override
    public int getCount() {
        return mData.size();
    }

    @Override
    public Object getItem(int position) {
        return position;
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public int getViewTypeCount() {
        return MAX_TYPE;
    }

    @Override
    public int getItemViewType(int position) {
        return mData.get(position).getType();
    }

    @Override
    public View getView(int position, View convertView, ViewGroup viewGroup) {
        ViewHolder vh = null;
        ViewHolderRight vhRight = null;
        int type = getItemViewType(position);
        if (convertView == null){
            switch (type){
                case MESSAGE_LEFT:
                    convertView = mInflater.inflate(R.layout.item_message,null);
                    vh = new ViewHolder();
                    vh.imageview_head = (ImageView) convertView.findViewById(R.id.image_head);
                    vh.textview_time = (TextView) convertView.findViewById(R.id.textview_time);
                    vh.textview_title = (TextView) convertView.findViewById(R.id.textview_title );
                    vh.textview_nickname = (TextView) convertView.findViewById(R.id.textview_nickname);
                    vh.textview_message = (TextView) convertView.findViewById(R.id.textview_message);
                    convertView.setTag(vh);
                    break;
                case MESSAGE_RIGHT:
                    convertView = mInflater.inflate(R.layout.item_message_right,null);
                    vhRight = new ViewHolderRight();
                    vhRight.imageview_head = (ImageView) convertView.findViewById(R.id.image_head);
                    vhRight.textview_time = (TextView) convertView.findViewById(R.id.textview_time);
                    vhRight.textview_title = (TextView) convertView.findViewById(R.id.textview_title );
                    vhRight.textview_nickname = (TextView) convertView.findViewById(R.id.textview_nickname);
                    vhRight.textview_message = (TextView) convertView.findViewById(R.id.textview_message);
                    convertView.setTag(vhRight);
                    break;
                default:
                    break;
            }
        }
        ChatMessage msg = mData.get(position);
        switch (type){
            case MESSAGE_LEFT:
                vh = (ViewHolder) convertView.getTag();
                vh.imageview_head.setImageResource(msg.getImageHead());
                vh.textview_title.setText(msg.getTitle());
                vh.textview_nickname.setText(msg.getNickname());
                Spanned spanned = Html.fromHtml(msg.getTextMessage(),mImageGetter,null);
                vh.textview_message.setText(spanned);
                String time = mFormat.format(new Date(msg.getTime()));
                vh.textview_time.setText(time);
                break;
            case MESSAGE_RIGHT:
                vhRight = (ViewHolderRight) convertView.getTag();
                vhRight.imageview_head.setImageResource(msg.getImageHead());
                vhRight.textview_title.setText(msg.getTitle());
                vhRight.textview_nickname.setText(msg.getNickname());
                Spanned spanned1 = Html.fromHtml(msg.getTextMessage(),mImageGetter,null);
                vhRight.textview_message.setText(spanned1);
                String time1 = mFormat.format(new Date(msg.getTime()));
                vhRight.textview_time.setText(time1);
                break;
            default:
                break;
        }

//        vh.textview_message.setText(Html.fromHtml(msg.getTextMessage(), mImageGetter, null));
//        vh.textview_time.setText("时间"+msg.getTime());
        return convertView;
    }
    class ViewHolder{
        ImageView imageview_head;
        TextView textview_title;
        TextView textview_nickname;
        TextView textview_time;
        TextView textview_message;
    }
    class ViewHolderRight{
        ImageView imageview_head;
        TextView textview_title;
        TextView textview_nickname;
        TextView textview_time;
        TextView textview_message;
    }
}
public class MainActivity extends Activity implements View.OnClickListener{
    private EditText mEditTextContent;
    private ImageView mImageView;
    private Html.ImageGetter mImageGetter;
    private List<ChatMessage> mData;
    private ListView mListView;
    private Button mButtonSendLeft;
    private Button mButtonSendRight;
    private MessageAdapter mAdapter;
    private GridView mGridView;
    private ExpressionAdapter mExpressionAdapter;
    private String [] mImage = {"eca","ecb","ecc","ecd","ece","ecf","ecg","ech","eci","ecj","eck",
            "ecl","ecm","ecn","eco","ecp","ecq","ecr","ecs","ect","ecu","ecv","ecw","ecx","ecy","ecz",};


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mEditTextContent = (EditText) findViewById(R.id.edittext);
        mImageView = (ImageView) findViewById(R.id.imageview);
        mButtonSendLeft = (Button) findViewById(R.id.button_left);
        mButtonSendRight = (Button) findViewById(R.id.button_right);
        mListView = (ListView) findViewById(R.id.listview);
        mGridView = (GridView) findViewById(R.id.gridview);
        mImageView.setOnClickListener(this);
        mButtonSendLeft.setOnClickListener(this);
        mButtonSendRight.setOnClickListener(this);
        mImageGetter = new Html.ImageGetter() {
            @Override
            public Drawable getDrawable(String source) {
                Drawable drawable = null;
                if (source!=null){
                    Class clazz = R.mipmap.class;
                    try {
                        Field field = clazz.getDeclaredField(source);
                        int sourceId = field.getInt(clazz);
                        drawable = getResources().getDrawable(sourceId);
                        drawable.setBounds(0,0,drawable.getIntrinsicWidth(),drawable.getIntrinsicHeight());
                    } catch (NoSuchFieldException e) {
                        e.printStackTrace();
                    } catch (IllegalAccessException e) {
                        e.printStackTrace();
                    }
                }else{
                    drawable = getResources().getDrawable(R.mipmap.ic_launcher);
                    drawable.setBounds(0,0,drawable.getIntrinsicWidth(),drawable.getIntrinsicHeight());
                }
                return drawable;
            }
        };
        mData = new ArrayList<>();
        mAdapter = new MessageAdapter(getLayoutInflater(),mData,mImageGetter);
        mListView.setAdapter(mAdapter);
        mExpressionAdapter = new ExpressionAdapter(getLayoutInflater());
        mGridView.setAdapter(mExpressionAdapter);
        mGridView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int position, long id) {
                Spanned spanned = Html.fromHtml("<img src='"+mImage[position]+"'/>",mImageGetter,null);
                mEditTextContent.getText().insert(mEditTextContent.getSelectionStart(),spanned);//将表情插入到光标位置
            }
        });
    }
    @Override
    public void onClick(View view) {
        switch (view.getId()){
            case R.id.imageview:
                if (mGridView.getVisibility() == View.VISIBLE){
                    mGridView.setVisibility(View.GONE);
                }else{
                    mGridView.setVisibility(View.VISIBLE);
                }
                break;
            case R.id.button_left:
                ChatMessage message = new ChatMessage();
                message.setImageHead(R.mipmap.ic_launcher);
                message.setTitle("营长");
                message.setNickname("小明");
                message.setTime(System.currentTimeMillis());
                message.setType(MessageAdapter.MESSAGE_LEFT);
                message.setTextMessage(filterHtml(Html.toHtml(mEditTextContent.getText())));
                Log.d("设置的内容",Html.toHtml(mEditTextContent.getText()));
                mData.add(message);//将生成的信息添加到mData中去
                mAdapter.notifyDataSetChanged();//刷新listview
                mListView.setSelection(mData.size() - 1);//将信息拉倒最后一条
                mEditTextContent.setText("");//输入框清空
                break;
            case R.id.button_right:
                ChatMessage message2 = new ChatMessage();
                message2.setImageHead(R.mipmap.ic_launcher);
                message2.setTitle("营长");
                message2.setNickname("小明");
                message2.setTime(System.currentTimeMillis());
                message2.setType(MessageAdapter.MESSAGE_RIGHT);
                message2.setTextMessage(filterHtml(Html.toHtml(mEditTextContent.getText())));
                Log.d("设置的内容",Html.toHtml(mEditTextContent.getText()));
                mData.add(message2);//将生成的信息添加到mData中去
                mAdapter.notifyDataSetChanged();//刷新listview
                mListView.setSelection(mData.size() - 1);//将信息拉倒最后一条
                mEditTextContent.setText("");//输入框清空
                break;
            default:
                break;
        }
    }

    private String filterHtml(String str) {
        str = str.replaceAll("<(?!br|img)[^>]+>","").trim();//正则表达式
        return str;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
JSP课程设计 在线聊天系统 指导老师: 班 级: 学 号: 姓 名: 日 期:2010.1.8 在线聊天系统 开发设计 小组成员: 主要内容及拟解决的问题:四大模块的建立,数据库的读写,聊天模块的调试,以及一些代码的调等。 课程实际要求:网络聊天工具大多数由服务器程序和客户端程序组成。主要有两种类型,一种是类似QQ,MSN类型的,需要用户安装软件才能聊天,另一种即是只需打开WEB浏览器就可以聊天的,类似QQ聊天室的功能 ,本系统的目标即模仿QQ聊天室,开发一个简单的能在机房里供大家聊天的Web程序。 摘 要 随着计算机技术飞速发展的今天, 随着Internet的普及和发展, 人们的生活和工作也越来越离不开信息网络的支持, 而聊天室是人们最常见, 最直接的网上交流的方式。本网站以网络交友为主,为广大用户提供一个借助网络进行人际交往的平台,也是网络与现实最贴近的实用型平台。本文所介绍的网络聊天系统是基于开放的web服务器应用程序开发设计的,其主要特性是能动态完成信息的传递,且具有高效的交互性,更有效的处理客户请求, 且具有更简单, 更方便的数据库访问方法, 易于维护和更新.针对以上方案,本系统采用Html、JavaScript等语言开发网站页面,用JSP、Java的技术实现动态设计,采用现在很经典frame框架,用MySQL作为系统数据库。JSP是当前网络编程的主流语言,在现代企事业单位的网络应用程序的开发中起到了重要作用。本系统是根据实际的需求而设计,通过用户ID密码的论证解决方案,对实际应用领域进行深入的调查析,已经基本上成功地实现了设计要求,实现了语音,视频聊天等。 关键字 聊天室;JSP;Java;frame;Cookie;Application Abstract With the rapid development of computer technology today, with the Internet's popularity and development of people's life and work are increasingly inseparable from the support of the information network, while the chat room was the most common and most direct way of online communication. This site web dating mainly provide customers with a network of interpersonal relationships with the platform, but also network and the practical reality is most close to the platform. This paper described a network chat system is based on an open web server application development and design, and its main feature is dynamically complete the transmission of messages and has a highly efficient interactive, more effective handling of customer requests, and has a simpler and more easy database access methods, easy to maintain and update. view of the above program, the system uses Html, JavaScript and other language development web site pages, using JSP, Java dynamic design of the technology, using the framework is now very classic frame, using MySQL as a database. JSP is the current mainstream network programming language, in the modern enterprises in the development of web applications play an important role. This system is based on

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值