Android学习笔记(四)——ListView

时间:2021-10-17 00:30:17

一、写在前面的话

好久没更新了,最近也是懒惰了点,再加上这几天突然的赶项目,这才开始写这一篇。ListView是android使用里基本最常用的组件了,使用起来也是有很多用法。这里我们就先说最基本的使用。

二、初探ListView

ListView顾名思义就是用于显示一个list,我们直接用代码来说。首先新建一个ListViewTest项目,首先我们来布局

<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" tools:context=".MainActivity">

    <ListView  android:id="@+id/listview" android:layout_width="match_parent" android:layout_height="match_parent"></ListView>

</LinearLayout>

布局文件里就只有一个listview就可以了。我们先来实现一个最简单的list。

public class MainActivity extends ActionBarActivity {

    private String[] data = {"AAA","BBB","CCC","DDD","EEE","FFF","GGG","HHH","III"};

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(
                MainActivity.this,android.R.layout.simple_list_item_1,data);
        ListView listView = (ListView) findViewById(R.id.listview);
        listView.setAdapter(adapter);
    }
}

这里我们实现了一个最简单的listview,只显示了些文字,先来看看效果
Android学习笔记(四)——ListView

listview是用来显示数据的,这里的数据可以是我们事先写好的,也可以是从服务器下载的。但数据并不是直接和listview发生联系,而是通过一个适配器adapter来实现。适配器有很多种类,这里我们使用了ArrayAdapter,他可以通过泛型来指定要适配的数据类型,这里我们选择了String,并传入了一些文字。在ArrayAdapter中我们传入了3个对象,第一个是上下文,第二个是listview的子项的布局文件,这里我们用的是系统默认的一个布局文件,第三个是我们要显示的数据。这样写好后,调用listview的setAdapter方法将构建好的适配器对象传递过去,这样listview就和数据之间就联系起来了。

我们这里显示了文字,未免闲的太单调,上面我们说到构建adapter时第二个参数传入的是listview的子项的布局文件,那么这个布局文件我们就是可以自定义的,下面我们来写一个自定义的listview。我们就直接在原项目上修改。

首先是布局,我们添加一个list_item布局,这个布局就是用于显示listview的子项

    <?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">

        <ImageView  android:id="@+id/head_image" android:layout_width="100dp" android:layout_height="100dp" />

        <TextView  android:id="@+id/text" android:textColor="#000" android:layout_gravity="center" android:textSize="20sp" android:layout_width="wrap_content" android:layout_height="wrap_content" />

    </LinearLayout>

这里设置了图片大小为100dp是为了图像显示大小统一好看。

接下来我们来自定义我们的adapter

public class MyAdapter extends ArrayAdapter<TangYan> {

    private int resourceId;

    public MyAdapter(Context context,int resourceId, List<TangYan> objects) {
        super(context,resourceId, objects);
        this.resourceId = resourceId;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        TangYan tangyan = getItem(position);
        View view;
        ViewHolder viewHolder;
        if (convertView == null){
            view = LayoutInflater.from(getContext()).inflate(resourceId,null);
            viewHolder = new ViewHolder();
            viewHolder.image = (ImageView) view.findViewById(R.id.head_image);
            viewHolder.name = (TextView) view.findViewById(R.id.text);
            view.setTag(viewHolder);
        } else {
            view = convertView;
            viewHolder = (ViewHolder) view.getTag();
        }
        viewHolder.image.setImageResource(tangyan.getImageId());
        viewHolder.name.setText(tangyan.getName());
        return view;
    }

    private class ViewHolder {
        ImageView image;
        TextView name;
    }
}

其中我们自定义了一个实体类TangYan用于适配器的适配类型

public class TangYan {

    private String name;
    private int imageId;

    public TangYan(String name, int imageId) {
        this.name = name;
        this.imageId = imageId;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getImageId() {
        return imageId;
    }

    public void setImageId(int imageId) {
        this.imageId = imageId;
    }
}

MyAdapter里首先要重写一个构造函数,将上下文,ListView的布局子项的id以及数据传递过来,然后重写getView()方法,这个方法是会在每个子项滚动到屏幕内的时候调用。在这个方法里首先通过getItem()方法获得当前的TangYan实例,然后用LayoutInflater来为这个子项来加载之前传入的布局,接着调用view的findViewById()方法来获取到image和name的实例,最后调用setImageResource()和setText()方法来设置显示图片和文字,接着返回view就完成了。这里我们使用了ViewHolder来对控件的实例进行缓存,这样就不会每次都会调用findViewById()方法,提高了运行的效率。
Android学习笔记(四)——ListView

适配器有很多种,这里再说一个SimpleAdapter,这个使用比较简单,也方便。我们仍在原工程上修改,新建一个SecondActivity

public class SecondActivity extends ActionBarActivity{

    private ListView listView;

    private String[] name = {"唐嫣11","唐嫣12","唐嫣13","唐嫣14","唐嫣15","唐嫣16","唐嫣17","唐嫣18","唐嫣19","唐嫣20"};

    private int[] id = {R.mipmap.t1,R.mipmap.t2,R.mipmap.t3,R.mipmap.t4,R.mipmap.t5,R.mipmap.t6,R.mipmap.t7,
            R.mipmap.t8,R.mipmap.t9,R.mipmap.t10};

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        listView = (ListView) findViewById(R.id.listview);

        SimpleAdapter adapter = new SimpleAdapter(this, getData(),
                R.layout.list_item, new String[] { "img", "text"},
                new int[] { R.id.head_image, R.id.text});
        listView.setAdapter(adapter);
    }

    public List<Map<String,Object>> getData() {
        List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
        for (int i = 0; i < name.length; i++){
            Map<String, Object> map = new HashMap<String, Object>();
            map.put("img",id[i]);
            map.put("text",name[i]);
            list.add(map);
        }
        return list;
    }
}

布局都用的是之前的布局,先来看看效果是不是一样的
Android学习笔记(四)——ListView

这里看到效果是一样的,SimpleAdapter的使用方法还有很多种,这里就不多说了。其实ListView的用法很多,我这里写的是最基本的运用。一个ListView显示出来了,那么我们就需要给他添加点击方法,这里我们来写一个点击显示toast。

        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                Toast.makeText(SecondActivity.this,name[position],Toast.LENGTH_SHORT).show();
            }
        });

listView.setAdapter(adapter);这句后我们加上点击方法,显示了当前点击的名字。

Android学习笔记(四)——ListView

看到这里我们就基本了解了ListView的使用方法,ListView还有其他很多使用方法,但万变不离其宗,掌握了最基本的方法,其他的也好理解了。

三、写在后面的话

好多天没有更新了,最近有点懈怠了,再就工作上新开个项目,晚上回到家也不怎么动,书也懒得看,东西也懒得写。这个月争取再写三篇。

刚看了个电影《烈日灼心》,挺好看的,几个演员都演的很好,邓超脱离逗比形象。发现最近这国产电影都挺不错的(《夏洛特烦恼》、《拯救吾先生》都很不错)。

有玩炉石的么(要成暴雪脑残粉了)。

转载请注明出处:http://blog.csdn.net/jiang89125/article/details/49386919

demo地址:http://download.csdn.net/detail/jiang89125/9209683