一、写在前面的话
好久没更新了,最近也是懒惰了点,再加上这几天突然的赶项目,这才开始写这一篇。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,只显示了些文字,先来看看效果
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()方法,提高了运行的效率。
适配器有很多种,这里再说一个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;
}
}
布局都用的是之前的布局,先来看看效果是不是一样的
这里看到效果是一样的,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);
这句后我们加上点击方法,显示了当前点击的名字。
看到这里我们就基本了解了ListView的使用方法,ListView还有其他很多使用方法,但万变不离其宗,掌握了最基本的方法,其他的也好理解了。
三、写在后面的话
好多天没有更新了,最近有点懈怠了,再就工作上新开个项目,晚上回到家也不怎么动,书也懒得看,东西也懒得写。这个月争取再写三篇。
刚看了个电影《烈日灼心》,挺好看的,几个演员都演的很好,邓超脱离逗比形象。发现最近这国产电影都挺不错的(《夏洛特烦恼》、《拯救吾先生》都很不错)。
有玩炉石的么(要成暴雪脑残粉了)。
转载请注明出处:http://blog.csdn.net/jiang89125/article/details/49386919