首页 > 代码库 > ListView:聊天界面

ListView:聊天界面

一.最终成型图

 技术分享

 

二.主界面xml布局

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

    android:id="@+id/activity_main"

    android:layout_width="match_parent"

    android:layout_height="match_parent"

    android:orientation="vertical"

    >

 

 

    <ListView

        android:layout_width="match_parent"

        android:layout_height="0dp"

        android:id="@+id/msgList"

        android:layout_weight="1"

        android:divider="#0000"

        />

    <LinearLayout

        android:layout_width="match_parent"

        android:layout_height="wrap_content"

        android:orientation="horizontal">

        <EditText

            android:id="@+id/send_msg"

            android:layout_width="wrap_content"

            android:layout_height="wrap_content"

            android:layout_weight="1"

            android:maxLines="2"

            android:hint="请输入内容"/>

        <Button

            android:layout_width="wrap_content"

            android:layout_height="wrap_content"

            android:text="发送"

            android:id="@+id/send"

            android:onClick="btnClick"

            />

 

 

    </LinearLayout>

</LinearLayout>

 

 

三.Msg类:

public class Msg {

    public static final int TYPE_RECEIVED = 0;

    public static final int TYPE_SEND = 1;

 

    private String content;

    private int type;

 

    public Msg(String content, int type) {

        this.content = content;

        this.type = type;

    }

 

    public String getContent() {

        return content;

    }

 

    public int getType() {

        return type;

    }

}

 

 

四.ListView 子项的布局,msg_item.xml:

<?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:padding="15dp">

 

    <LinearLayout

        android:id="@+id/left_layout"

        android:layout_height="wrap_content"

        android:layout_width="wrap_content"

        android:layout_gravity="left"

        android:background="@drawable/left">

    <TextView

        android:id="@+id/left_msg"

        android:layout_width="wrap_content"

        android:layout_height="wrap_content"

        android:layout_gravity="center"

        android:layout_margin="10dp"/>

    </LinearLayout>

 

    <LinearLayout

        android:id="@+id/right_layout"

        android:layout_height="wrap_content"

        android:layout_width="wrap_content"

        android:layout_gravity="right"

        android:background="@drawable/right">

        <TextView

            android:id="@+id/right_msg"

            android:layout_width="wrap_content"

            android:layout_height="wrap_content"

            android:layout_gravity="center"

            android:layout_margin="10dp"

            android:textColor="#000000"/>

    </LinearLayout>

 

</LinearLayout>

 

 

五.ListView 的适配器类,让它继承自ArrayAdapter,并将泛型指定为Msg 类。新建类MsgAdapter,代码如下:

public class MsgAdapter extends ArrayAdapter<Msg> {

 

    private int resourceId;

 

    public MsgAdapter(Context context, int resource, List<Msg> objects) {

        super(context, resource, objects);

        resourceId = resource;

    }

 

    @NonNull

    @Override

    public View getView(int position, View convertView, ViewGroup parent) {

        View view;

        Msg msg = getItem(position);

        ViewHolder viewHolder;

 

        if( convertView == null ){

            view = LayoutInflater.from(getContext()).inflate(resourceId,null);

            viewHolder = new ViewHolder();

            viewHolder.left_layout = (LinearLayout)view.findViewById(R.id.left_layout);

            viewHolder.right_layout = (LinearLayout)view.findViewById(R.id.right_layout);

            viewHolder.left_msg = (TextView)view.findViewById(R.id.left_msg);

            viewHolder.right_msg = (TextView)view.findViewById(R.id.right_msg);

            view.setTag(viewHolder);

        }else{

            view = convertView;

            viewHolder = (ViewHolder)view.getTag();

        }

 

        if( msg.getType() == Msg.TYPE_RECEIVED ){

            viewHolder.left_layout.setVisibility(View.VISIBLE);

            viewHolder.right_layout.setVisibility(View.GONE);

            viewHolder.left_msg.setText(msg.getContent());

        }else{

            viewHolder.left_layout.setVisibility(View.GONE);

            viewHolder.right_layout.setVisibility(View.VISIBLE);

            viewHolder.right_msg.setText(msg.getContent());

        }

 

        return view;

    }

 

    class ViewHolder{

        LinearLayout left_layout;

        LinearLayout right_layout;

        TextView left_msg;

        TextView right_msg;

    };

}

 

 

六.修改MainActivity 中的代码,来为ListView 初始化一些数据,并给发送按钮加入事件响应

 

public class MainActivity extends Activity {

 

    private List<Msg> msgList = new ArrayList<Msg>();

    private MsgAdapter msgAdapter;

    private ListView listView;

 

    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

        initList();

        listView = (ListView)findViewById(R.id.msgList);

        msgAdapter = new MsgAdapter(MainActivity.this,

                R.layout.msg_item,

                msgList);

        listView.setAdapter(msgAdapter);

    }

 

    protected void btnClick(View view){

        if( view.getId() == R.id.send ){

            EditText send_msg = (EditText)findViewById(R.id.send_msg);

            String message = send_msg.getText().toString().trim();

            if( message.length() >0 ){

                Msg msg = new Msg(message, Msg.TYPE_SEND);

                msgList.add(msg);

                msgAdapter.notifyDataSetChanged();

                listView.setSelection(msgList.size());

                send_msg.setText("");

            }

        }

    }

 

    private  void initList(){

        Msg msg;

        msg = new Msg("你好啊,朋友", 0);

        msgList.add(msg);

 

        msg = new Msg("我很好", 1);

        msgList.add(msg);

 

        msg = new Msg("what are you doing?", 0);

        msgList.add(msg);

    }

}

 

ListView:聊天界面