分左右佈局的聊天界面、並且添加表情

書接昨天,設計分左右佈局的聊天界面,需要添加一個右邊的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;
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章