您的位置:首页 > 移动开发 > Android开发

Android ListView使用小结

2016-08-21 21:06 211 查看
ListView用于在AndroidUI上进行大量数据的展示,本文为整理《第一行代码Android》3.7节中的例子。
ListView基本设置其实只有一句:listView.setAdapter(adapter)
也就是说设置ListView实质就是设置adapter,下面我们来看adapter默认的设置方法(以T类型为例):
ArrayAdapter<T>adapter =new ArrayAdapter<T>(MainActivity.this,android.layout.simple_list_item_1,data), //data为类型T的集合

因此为了显示更丰富的内容我们需要重写以下内容:
(1)T的类型
(2)ListView中每行的布局
(3)显示的数据集合data
(4)更据(1)(2)(3)中的内容重写adapter
(5)在onCreate方法中为ListView设置adapter

参考《第一行代码Android》3.7节的例子我们来一一对应上面的步骤
(1)重写T的类型,新建Msg类,该类表示每行显示的消息,因此需要定义String类型的content表示消息内容,int类型的 type表示消息是发送还是接收,同时定义静态属性TYPE_RECEIVED与TYPE_SENT标识type可能的两种值。

public class Msg {
public static final int TYPE_RECEIVED=0;
public static final int TYPE_SENT=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;
}

}


(2)重写ListView的布局,layout文件夹中新建msg_item.xml布局文件,两个线性布局分别位于左右,其中有一个TextView用于显示消息。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">

<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/left_layout"
android:layout_gravity="left"
android:background="@drawable/message_left">

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/left_msg"
android:layout_gravity="center"
android:layout_margin="10dp"
android:textColor="#fff"/>

</LinearLayout>

<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/right_layout"
android:layout_gravity="right"
android:background="@drawable/message_right">

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/right_msg"
android:layout_gravity="center"
android:layout_margin="10dp"/>

</LinearLayout>

</LinearLayout>


(3)数据集合data,在此例中直接定义一个List<msg> msgList后赋值

private void initMsg(){
Msg msg1=new Msg("Hello guy",Msg.TYPE_RECEIVED);
msgList.add(msg1);
Msg msg2=new Msg("Hello, Who is that?",Msg.TYPE_SENT);
msgList.add(msg2);
Msg msg3=new Msg("This is Tom. Nice talking to you.",Msg.TYPE_RECEIVED);
msgList.add(msg3);
}


(4)重写adapter,新的MsgAdapter继承ArrayAdapter<Msg>,主要重写两个部分构造函数和getView方法
        构造函数:

public MsgAdapter(Context context, int textViewResourceId, List<Msg> objects){
super(context,textViewResourceId,objects);
resourceId=textViewResourceId;
}

唯一要强调的一点,textViewResourceId表示ListView每行的布局文件,具体为什么是int类型我也没弄清楚

    getView()方法:

@Override
public View getView(int position, View convertView, ViewGroup parent){
Msg msg=getItem(position);
View view;
ViewHolder viewHolder;
if(convertView==null){
view= LayoutInflater.from(getContext()).inflate(resourceId,null);
viewHolder=new ViewHolder();
viewHolder.leftLayout=(LinearLayout)view.findViewById(R.id.left_layout);
viewHolder.rightLayout=(LinearLayout)view.findViewById(R.id.right_layout);
viewHolder.leftMsg=(TextView)view.findViewById(R.id.left_msg);
viewHolder.rightMsg=(TextView)view.findViewById(R.id.right_msg);
view.setTag(viewHolder);
}else{
view=convertView;
viewHolder=(ViewHolder)view.getTag();
}

if(msg.getType()==Msg.TYPE_RECEIVED){
//如果收到消息则显示左边的消息布局,将右边的消息布局隐藏
viewHolder.leftLayout.setVisibility(View.VISIBLE);
viewHolder.rightLayout.setVisibility(View.GONE);
viewHolder.leftMsg.setText(msg.getContent());
}else if(msg.getType()==Msg.TYPE_SENT){
viewHolder.rightLayout.setVisibility(View.VISIBLE);
viewHolder.leftLayout.setVisibility(View.GONE);
viewHolder.rightMsg.setText(msg.getContent());
}
return view;
}

viewHolder和convertView的使用是为了提高ListView的效率,可以看出getView主要做的事情就是将布局放入view中,再为布局中各组件赋值,比如Layout是否可见,TextView显示的数据等

(5)完成上面的工作后,我们就可以在onCreate方法中像设置默认ListView一样为ListView设置adapter了。

protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//getSupportActionBar().hide();
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_main);
initMsg();
adapter=new MsgAdapter(MainActivity.this,R.layout.msg_item,msgList);
inputText=(EditText)findViewById(R.id.input_text);
send=(Button)findViewById(R.id.send);
msgListView=(ListView)findViewById(R.id.msg_list_view);
msgListView.setAdapter(adapter);
send.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String content=inputText.getText().toString();
if(!"".equals(content)){
Msg msg=new Msg(content,Msg.TYPE_SENT);
msgList.add(msg);
adapter.notifyDataSetChanged();//当有新消息时,刷新ListView中的显示
msgListView.setSelection(msgList.size());//将ListView定位到最后一行
inputText.setText("");//清空输入框内容
}
}
});
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息