消息聊天界面综合实例

在主布局中创建三个控件

<?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="match_parent"
    android:orientation="vertical"
    android:background="@drawable/beijing">//插入一张背景图片
    
     //添加一个RecyclerView控件
    <android.support.v7.widget.RecyclerView
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:id="@+id/msg_recycler_view"
        android:layout_weight="1"
        />
     //嵌套一个线性布局,用于放置一个编辑框和发送按钮
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
     //编辑框放置小技巧,使其权重为1,下面水平摆放的按钮包裹内容即可
        <EditText
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:hint="Type something here"
            android:maxLength="20"
            android:id="@+id/input_text"/>
        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="send"
            android:id="@+id/send"/>
    </LinearLayout>
</LinearLayout>

定义一个消息的实体类

public class Msg {
    public static final int TYPE_RECEIVED = 0;//表示收到一条信息
    public static final int TYPE_SENT  = 1;//表示发送一条数据
    //content表示消息的内容
    private String content;
    //表示消息的类型,是接收还是发送
    private int type;

    public Msg(String content, int type) {
        this.content = content;
        this.type = type;
    }

    public int getType() {
        return type;
    }

    public String getContent() {

        return content;
    }
}

定义一个消息的适配器

class MsgAdapter extends RecyclerView.Adapter<MsgAdapter.ViewHolder> {
    private List<Msg> mMsgList;
    static class ViewHolder extends RecyclerView.ViewHolder{
        //定义我们所需要的控件的变量
        LinearLayout leftLayout;
        LinearLayout rightLayout;
        TextView leftMsg;
        TextView rightMsg;

        public ViewHolder(View view){
            super(view);
            //找到我们所需要的控件变量,这里需要view.的形式调用findViewById
            leftLayout = (LinearLayout)view.findViewById(R.id.left_layout);
            rightLayout = (LinearLayout)view.findViewById(R.id.right_layout);
            leftMsg = (TextView)view.findViewById(R.id.left_msg);
            rightMsg = (TextView)view.findViewById(R.id.right_msg);
        }
    }
    //声明一个外部类的构造函数,这个方法用于把要展示的数据源传进来,并赋值给一个全局变量mFruitList
    //我们的后续操作都需要在这个数据源的基础上进行
    public MsgAdapter(List<Msg> msgList){
        mMsgList = msgList;
    }

    //把我们所创建的msg_item布局用打气筒给调用进来
    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view  = LayoutInflater.from(parent.getContext()).inflate(R.layout.msg_item,parent,false);
        return new ViewHolder(view);
    }

    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
        
        Msg msg = mMsgList.get(position);
        //通过msg实例判断消息的类型是属于接收还是发送
        if (msg.getType() == Msg.TYPE_RECEIVED){
            holder.leftLayout.setVisibility(View.VISIBLE);//显示左边的消息布局
            holder.rightLayout.setVisibility(View.GONE);//隐藏右边的消息布局
            holder.leftMsg.setText(msg.getContent());//设置消息内容
        }else{
            holder.rightLayout.setVisibility(View.VISIBLE);
            holder.leftLayout.setVisibility(View.GONE);
            holder.rightMsg.setText( msg.getContent());
        }
    }

    //放回item的数量
    @Override
    public int getItemCount() {
        return mMsgList.size();
    }
}

在主活动中写入逻辑

public class MainActivity extends AppCompatActivity {
    
    //创建一个消息集合,每当从inputText输入数据的时候,便把消息添加进集合中
    private List<Msg> msgList = new ArrayList<>();
    //定义控件变量
    private EditText inputText;
    private Button send;
    private RecyclerView msgRecyclerView;
    //定义适配器
    private MsgAdapter adapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initMsgs();//初始化消息数据
        //找到我么所需要的控件
        inputText = (EditText)findViewById(R.id.input_text);
        send = (Button)findViewById(R.id.send);
        msgRecyclerView = (RecyclerView)findViewById(R.id.msg_recycler_view);
        这里我们指定为线性布局管理,固定写法
        LinearLayoutManager layoutManager = new LinearLayoutManager(this);
        msgRecyclerView.setLayoutManager(layoutManager);
        adapter = new MsgAdapter(msgList);
        msgRecyclerView.setAdapter(adapter);
        //编写发送按钮逻辑
        send.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //获得inputText的数据
                String content = inputText.getText().toString().trim();
                //挡content不为空的时候,则进行添加数据
                if(!"".equals(content)){
                    Msg msg = new Msg(content, Msg.TYPE_SENT);
                    msgList.add(msg);
                    //用于通知列表有新的数据插入,这样才能在RecyclerView上显示
                    adapter.notifyItemInserted(msgList.size() - 1);
                    inputText.setText("");
                }
            }
        });
    }

    //先初始化几条数据在Item上显示
    private void initMsgs(){
        Msg msg1 = new Msg("Hello gui.", Msg.TYPE_RECEIVED);
        msgList.add(msg1);
        Msg msg2 = new Msg("Hello. Who is that?",Msg.TYPE_SENT);
        msgList.add(msg2);
        Msg msg3 = new Msg("Thsi is Tom.Nice talking to you",Msg.TYPE_RECEIVED);
        msgList.add(msg3);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值