这是我的第一篇在CSDN博客写的内容。是关于在ListView中如何使用自定义的布局的问题。(本笔脑瓜不太好用,所以花了两天的时间去大概的弄明白了ListView的工作原理)我做了一个简单的聊天界面工参考,先放效果图跟代码!
效果图(Back按钮是生成左边文字,Go生成右边文字):
这是主函数类:MainActivity
package com.example.chat;
import java.util.ArrayList;
import java.util.List;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
public class MainActivity extends Activity {
Button buttonleft,buttonright ;
EditText edittext ;
List<Message> messagelist = new ArrayList<Message>() ;;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
buttonleft = (Button)findViewById(R.id.back) ;
buttonright = (Button)findViewById(R.id.go) ;
buttonleft.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
edittext = (EditText)findViewById(R.id.edittext);
String str = edittext.getText().toString();
initMessageleft(1,str);
MyAdapter adapter = new MyAdapter(MainActivity.this,R.layout.leftitem,messagelist);
ListView listview = (ListView)findViewById(R.id.listview) ;
listview.setAdapter(adapter);
edittext.setText("");
}
});
buttonright.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
edittext = (EditText)findViewById(R.id.edittext);
String str = edittext.getText().toString();
initMessageright(0,str);
MyAdapter adapter = new MyAdapter(MainActivity.this,R.layout.rightitem,messagelist);
ListView listview = (ListView)findViewById(R.id.listview) ;
listview.setAdapter(adapter);
edittext.setText("");
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
private void initMessageleft(int type,String meg) {
// TODO Auto-generated method stub
Message leftmes = new Message(type,meg) ;
messagelist.add(leftmes);
}
private void initMessageright(int type,String meg) {
// TODO Auto-generated method stub
Message rightmes = new Message(type,meg) ;
messagelist.add(rightmes);
}
}
适配器类MyAdapter(继承ArrayAdapter)
package com.example.chat;
import java.util.List;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.TextView;
public class MyAdapter extends ArrayAdapter{
int itemid ;
public MyAdapter(Context context, int resource, List<Message> objects) {
super(context, resource, objects);
itemid = resource ;
// TODO Auto-generated constructor stub
}
@Override
public View getView(int position,View convertVeiw,ViewGroup parent){
Message mes = (Message) getItem(position) ;
View view = null ;
if(mes.getType()==1){
view = LayoutInflater.from(getContext()).inflate(R.layout.leftitem, null);
TextView leftview=(TextView)view.findViewById(R.id.leftview);
String str = mes.getMessage();
leftview.setText(str);
}
if(mes.getType()==0){
view = LayoutInflater.from(getContext()).inflate(R.layout.rightitem, null);
TextView rightview=(TextView)view.findViewById(R.id.rightview);
String str = mes.getMessage();
rightview.setText(str);
}
return view ;
}
}
一个实体类Message,作为适配器的适配类型
package com.example.chat;
public class Message {
int type ;
String message ;
public Message(int type,String message){
this.type = type ;
this.message = message ;
}
public String getMessage(){
return message ;
}
public int getType(){
return type ;
}
}
一下是一个左边文字的自定义布局(leftitem.xml)跟一个右边文字的自定义布局(rightitem.xml)(是分开定义的,我这里只是把代码放一块了):
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="left"
android:orientation="vertical" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/ooooooo"
android:layout_margin="10dp"
android:id="@+id/leftview"
android:text="sjfsdfjisfhsoifd"
/>
</LinearLayout>
<?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" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/messagerightgg"
android:id="@+id/rightview"
android:layout_margin="10dp"
android:layout_gravity="right"
android:text="sjfsdfjisfhsoifd"
/>
</LinearLayout>
主活动布局layout_main.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<ListView
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:id="@+id/listview"
android:divider="#0000"
/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<Button
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:id="@+id/back"
android:text="Back"
/>
<EditText
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="3"
android:id="@+id/edittext"
/>
<Button
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:id="@+id/go"
android:text="Go"
/>
</LinearLayout>
</LinearLayout>
ListView中主要是适配器的编写比较麻烦,他是把数据和视图转换的媒介吧。通过getView()方法可以将你自定义的view放进ListView中。
起初我在编写的过程中遇到这样一个问题,按下Back生成左边的文字,然后在按下Go生成右边的文字,结果他把左边的文字都变到右边。就是按下了哪边的按钮,那上面存在的字就会全部重生成到按钮那边。(特意画了张图,希望能帮你们理解我的意思)
发生这个问题的原因是我在Myadapter编写中还没有在Message类中使用type成员,在Myadapter中原来判断条件是(itemid==R.layout.leftitem)(itemid==R.layout.rightitem)
所以在加载我的listmessage进去适配器的时候就通过我按按钮的位置把我全部的message加载到了一边。
修改方法上面给出的代码:使用type成员来区分。
本人也是android路上的一只小菜鸟。希望能和喜欢这门的人一起进步一起交流。
半夜1:30把这篇写完就该睡了,舍友被我清脆的键盘声音吵到不能安心玩手机了 ,哈哈!(大三狗,汪汪)