ListView的使用

注:本书的学习以《android第一行代码》为基础,如果实例代码和书上一样,算是借鉴。

ListView的用处已经知道了,就不再赘述,重点记录个人对ListView使用方法的体会,更好的使用ListView。说实话,程序开发,程序设计语言只是工具。

ListView无非就三个方面:

1)子项中的数据:每一个子项需要显示什么内容

2)子项的布局:这些内容应该怎样排版

3)子项管理与装配:数据和布局怎样装配,子项怎么进行管理

在android中,这三个方面是分开的,分别进行开发。可以使用一个类抽象出子项的数据,比如子项展示水果,那么设计一个水果类,其中包括水果图片,名字等。子项的布局用一个布局文件即可。数据与布局的装配交给适配器就好了,同时适配器对子项进行管理。下面以一个例子说明,比如使用ListView实现下面好友列表:

                                                 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的基本用法。