Android 讲解:ListView

来源:互联网 发布:新歌2016网络吐槽红歌 编辑:程序博客网 时间:2024/06/01 18:56

ListView 在Android 很是常用。但是也是比较难的一个。

简单的ListView


一个简单的ListView 由一个layout,和显示数据。

创建layout

main_layout.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:layout_height="match_parent" >   <ListView        android:id="@+id/list_view"       android:layout_width="match_parent"        android:layout_height="match_parent"       /></LinearLayout>

添加 item

adapter 对象为显示数据的格式对象。
R.layout.simple_list_item_1 系统的显示布局
obj 显示的数据

MainActivity.java

package cn.met0.android.chapter2.activity;import android.app.Activity;import android.os.Bundle;import android.widget.ArrayAdapter;import android.widget.ListView;public class MainActivity extends Activity {    String[] obj = {"aaaa","bbb","ccc","ddd","eee","fff","ggg","aaaa","bbb","ccc","ddd","eee","fff","ggg"};    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,obj);        ListView view = (ListView) findViewById(R.id.list_view);        view.setAdapter(adapter);    }}

ListView

使用自定义布局

系统布局太单一怎么办?Android 里面可以使用自己的布局创建ListView。

  • 创建ViewList 布局(省略)
  • 创建自己的布局
  • 创建自己的实体类
  • 创建自己的Adapter
  • 显示数据

创建自己布局

是不是很复杂?其实这就是个类似于QQ好友列表的布局,一个头像,一个昵称,一个签名。

friends_layout.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="wrap_content"    >  <!--       <ImageView         android:id="@+id/head_portrait"        android:layout_width="match_parent"        android:layout_height="match_parent"        /> -->    <ImageView        android:id="@+id/user_head_portrait"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:src="@drawable/ic_launcher"        />    <LinearLayout         android:layout_width="match_parent"        android:layout_height="wrap_content"        android:orientation="vertical"        >        <TextView        android:id="@+id/user_name"        android:layout_width="match_parent"        android:layout_height="match_parent"        android:textAppearance="?android:attr/textAppearanceLarge"         android:text="小明"        />    <TextView        android:id="@+id/user_info"        android:layout_width="match_parent"        android:layout_height="match_parent"        android:textAppearance="?android:attr/textAppearanceSmall"         android:text="明天要去打篮球"        />    </LinearLayout>    </LinearLayout>

自定义布局

创建自己的实体类

这个就很简单啦。不多说。
User.java

package cn.met0.android.chapter2.entity;public class User {    private int headPortrait;    private String name;    private String info;    public User(int headPortrait, String name, String info) {        this.headPortrait = headPortrait;        this.name = name;        this.info = info;    }    public int getHeadPortrait() {        return headPortrait;    }    public String getName() {        return name;    }    public String getInfo() {        return info;    }}

创建自己的Adapter

public UserAdapter(Context context, int textViewResourceId,
User[] objects)
实现父类的构造函数,执行父类的构造方法。resourceId 在getView能用到

public View getView(int position, View convertView, ViewGroup parent) 在加载Item 的时候会执行,执行的返回值就是现实的View。

User user = getItem(position) 获取一个要加载的数据
LayoutInflater.from(getContext()).inflate(resourceId,null) 获取一个Item View
userItemView.findViewById(*) 获取视图的控件
userName.set* 设置现实的内容

UserAdapter.java

package cn.met0.android.chapter2.Adapter;import cn.met0.android.chapter2.activity.R;import cn.met0.android.chapter2.entity.User;import android.content.Context;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.ArrayAdapter;import android.widget.ImageView;import android.widget.TextView;public class UserAdapter extends ArrayAdapter<User> {    private int resourceId;    public UserAdapter(Context context,  int textViewResourceId,            User[] objects) {        super(context,  textViewResourceId, objects);        resourceId = textViewResourceId;    }    @Override    public View getView(int position, View convertView, ViewGroup parent) {        //获取一个user 对象         User user = getItem(position);        //获取一个item View        View userItemView = LayoutInflater.from(getContext()).inflate(resourceId,null);        //通过item View 获取自定义item 的控件        ImageView userHeadPortrait =                (ImageView) userItemView.findViewById(R.id.user_head_portrait);        TextView userName = (TextView) userItemView.findViewById(R.id.user_name);        TextView userInfo = (TextView) userItemView.findViewById(R.id.user_info);        //设置控件值        userHeadPortrait.setImageResource(user.getHeadPortrait());        userName.setText(user.getName());        userInfo.setText(user.getInfo());        return userItemView;    }}

显示数据

MainActivity.java

package cn.met0.android.chapter2.activity;import android.app.Activity;import android.os.Bundle;import android.widget.ListView;import cn.met0.android.chapter2.Adapter.UserAdapter;import cn.met0.android.chapter2.entity.User;public class MainActivity extends Activity {    User[] users = {            new User(R.drawable.ic_launcher, "东哥", "今天天气好好哟~!"),            new User(R.drawable.ic_launcher, "东哥", "今天天气好好哟~!"),            new User(R.drawable.ic_launcher, "东哥", "今天天气好好哟~!"),            new User(R.drawable.ic_launcher, "东哥", "今天天气好好哟~!"),            new User(R.drawable.ic_launcher, "东哥", "今天天气好好哟~!"),            new User(R.drawable.ic_launcher, "东哥", "今天天气好好哟~!"),    };    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        UserAdapter adapter = new UserAdapter(this, R.layout.friends_layout,users );        ListView view = (ListView) findViewById(R.id.list_view);        view.setAdapter(adapter);    }}

这里写图片描述

优化ListView

ListView 优化主要在Adapter 里面优化,在getView 方法里面。

if(convertView == null) convertView 会把Item 使用缓存下来。解决每次获取Item 视图,和布局的控件。

UserAdapter.java

public class UserAdapter extends ArrayAdapter<User> {    private int resourceId;        @Override    public View getView(int position, View convertView, ViewGroup parent) {        //获取一个user 对象         User user = getItem(position);        //获取一个item View        View userItemView = null;        ViewHolder viewHolder = null;        if(convertView == null){            userItemView = LayoutInflater.from(getContext()).inflate(resourceId,null);            viewHolder = new ViewHolder();            viewHolder.userHeadPortrait = (ImageView) userItemView.findViewById(R.id.user_head_portrait);            viewHolder.userName = (TextView) userItemView.findViewById(R.id.user_name);            viewHolder.userInfo = (TextView) userItemView.findViewById(R.id.user_info);            userItemView.setTag(viewHolder);        }else{            userItemView = convertView;            viewHolder = (ViewHolder) convertView.getTag();        }        //设置控件值        userHeadPortrait.setImageResource(user.getHeadPortrait());        userName.setText(user.getName());        userInfo.setText(user.getInfo());        return userItemView;    }    class ViewHolder{        ImageView userHeadPortrait;        TextView userName;        TextView userInfo;    }}
0 0
原创粉丝点击