ListView的使用
注:本书的学习以《android第一行代码》为基础,如果实例代码和书上一样,算是借鉴。
ListView的用处已经知道了,就不再赘述,重点记录个人对ListView使用方法的体会,更好的使用ListView。说实话,程序开发,程序设计语言只是工具。
ListView无非就三个方面:
1)子项中的数据:每一个子项需要显示什么内容
2)子项的布局:这些内容应该怎样排版
3)子项管理与装配:数据和布局怎样装配,子项怎么进行管理
在android中,这三个方面是分开的,分别进行开发。可以使用一个类抽象出子项的数据,比如子项展示水果,那么设计一个水果类,其中包括水果图片,名字等。子项的布局用一个布局文件即可。数据与布局的装配交给适配器就好了,同时适配器对子项进行管理。下面以一个例子说明,比如使用ListView实现下面好友列表:
第一步:数据,抽象成一个好友类,包括好友的头像,昵称,最后一条聊天消息。代码如下
public class Message { private int head_image; //好友头像 private String name; //昵称 private String message; //最后一条聊天信息 public Message(int head_image, String name, String message){ this.head_image = head_image; this.name = name; this.message = message; } public String getName(){ return name; } public int getHead_image(){ return head_image; } public String getMessage(){ return message; } }
在活动中创建对象:
private String[] name = {"柯南", "萤火虫", "秋思", "云淡风轻", "道友请留步", "记得笑", "一叶知秋", "小小孩", "消失在黎明", "菇凉别逗了", "抛物线", "奋斗必经之路", "白开水", "蹲街", "时光慢走", "眼泪也成诗", "男儿当自强", "我的梦", "天使的微笑", "古道印残灯", "共眼前无憾", "阿Q精神", "无悔我心"}; private String[] message = {"这么多年的兄弟 有谁比我更了解你 太多太多不容易", "太多太多不容易", "磨平了岁月和脾气", "时间转眼就过去", "这身后不散的筵席", "只因为我们还在", "心留在原地", "张开手 需要拓大的勇气", "这片天 你我一起撑起", "更努力 只为了我们想要的明天", "好好的 这份情好好珍惜", "我们不一样", "每个人都有不同的境遇", "我们在这里", "在这里等你", "我们不一样", "虽然会经历不同的事情", "我们都希望", "来生还能相遇", "这么多年的兄弟", "有谁比我更了解你", "太多太多不容易", "磨平了岁月和脾气"};
private int a = R.drawable.head1; //头像图片的命名都以head开后,在R文件中,图像顺序排列 public void initMessage(){ for(int i = 0; i < 22; ++i, ++a){ messageList.add(new Message(a, name[i], message[i]));} }
第二部:子项布局,规定了内容的放置位置
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="horizontal" android:layout_width="match_parent" android:layout_height="wrap_content"> <!--ListView(活动二中个人信息)的子项布局--> <ImageView android:id="@+id/head_image" android:layout_width="65dp" android:layout_height="65dp" android:layout_marginTop="7dp" android:layout_marginBottom="7dp"/> <LinearLayout android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:orientation="vertical" android:layout_gravity="center_vertical" android:layout_marginLeft="15dp"> <TextView android:id="@+id/nane_text" android:layout_width="match_parent" android:layout_height="wrap_content" android:textSize="18sp" android:ellipsize="end" android:maxLines="1"/> <TextView android:id="@+id/message_text" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="5dp" android:ellipsize="end" android:maxLines="1" /> </LinearLayout> </LinearLayout>
第三步:装配(适配器),从子项布局的视图View中获取相关的控件,然后为控件赋予对应的值接装配成功。
public class messageAdapter extends ArrayAdapter<Message> { private int resourceId; //子项的布局,在这个类中没有讲解为子项设置布局的语句,不像创建活动时onCreate方法中调用setContentView方法为活动添加一个布局。但是在适配器的内部, //肯定有相关的回调函数为子项设置布局,这里先不用管,以后深入再讲。 public messageAdapter(Context context, int textViewResourced, List<Message> messageList){ //参数:上下文,子项布局,数据 super(context, textViewResourced, messageList); resourceId = textViewResourced; } @Override public View getView(int position, View convertView, ViewGroup parent){ //每次子项滑动到屏幕就执行这个方法 Message message = getItem(position); View view; ViewHolder viewHolder; if(null == convertView){ view = LayoutInflater.from(getContext()).inflate(resourceId, parent, false); //获取子项布局的视图 viewHolder = new ViewHolder(); viewHolder.headImage = (ImageView)view.findViewById(R.id.head_image); viewHolder.nameText = (TextView)view.findViewById(R.id.nane_text); viewHolder.messageText = (TextView)view.findViewById(R.id.message_text); view.setTag(viewHolder); }else{ view = convertView; viewHolder = (ViewHolder) view.getTag(); } //装配过程:赋值 viewHolder.nameText.setText(message.getName()); viewHolder.nameText.setTextSize(18); viewHolder.nameText.setTextColor(android.graphics.Color.BLACK); viewHolder.messageText.setText(message.getMessage()); viewHolder.messageText.setTextSize(15); viewHolder.headImage.setImageResource(message.getHead_image()); return view; } class ViewHolder { //将子项中所需要的控件保存下来 private ImageView headImage; private TextView nameText; private TextView messageText; } }
关于ListView最难的部分已经结束。接下来只需要给listView这个控件设置一个适配器就行,代码如下
messageAdapter adapter = new messageAdapter(SecondActivity.this,R.layout.message_item,messageList); ListView listView = (ListView)findViewById(R.id.list_view); listView.setAdapter(adapter);
最后,ListView设置事件监听器,重写onItemClick函数
listView.setOnItemClickListener(new AdapterView.OnItemClickListener(){ @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id){ //当点击某个子项时,就会执行这个函数。参数position表示对应子项的位置编号 Message friend = messageList.get(position); Intent intent = new Intent(SecondActivity.this, ThridActivity.class); intent.putExtra("name", friend.getName()); intent.putExtra("head_image", friend.getHead_image()); intent.putExtra("lastMessage", friend.getMessage()); startActivity(intent); } });
上述就是ListView的基本用法。