1、; /new一个ArrayAdapter,android.R.layout.simple_list_item_1为ListView显示的布局文件 ArrayAdapter adapter = new ArrayAdapter(this, android.R.layout.simple_list_item_1, items); /位ListView设置Adapter lvwSimple.setAdapter(adapter);二、自定义ListView上面的那种方法只能显示简单的文字信息,显然在很多场合下都不够用,比如你想要在一个item中显示图片,显示多行文字,这就需要你自定义ListView
2、的布局了。效果图如下:步骤:1、分析你想要实现的布局效果,自定义布局文件lvw_custom.xml,该布局文件针对的是ListView的item,而不是整个ListView:xml version=1.0 encoding=utf-8? verticalTextView +id/lvw_custom_namelayout_marginLeft=layout_marginRight=layout_marginTop=textSize=25diptext=item名称/+id/lvw_custom_description10dipitem描述. LinearLayoutLinearLayout2
3、、取得用于ListView的数据集合,类型是ArrayList,每一个Map对应于ListView的一个item,多个map就构成了ListView的数据集合:/* * 取得用于ListView的数据 * return */ private ArrayList getItems() ArrayList items = new ArrayList(); for(int i = 0; i 5; i+) /* /* 每一个map中的数据对应与ListView中的一个item * /* 在我自定义的布局文件中,一个item包括: * /* 1、图片(lvw_custom_img) * /* 2、名称(
4、lvw_custom_name) * /* 3、描述(lvw_custom_description) * /* 所以map中也至少需要包括这三项数据 * HashMap map = new HashMap(); /图片,key值可以随便取,映射关系会在实例化Adapter时定义,但我喜欢将key与布局文件中定义的id取同样的值 /value值为图片的资源id map.put(lvw_custom_img, R.drawable.custom); /名称lvw_custom_name); /描述lvw_custom_descriptionitem描述 items.add(map); return
5、 items; /hashmap/hashmap3、为ListView设置SimpleAdapter:/取得ListView实例 ListView lvwCustom = (ListView)findViewById(R.id.lvw_custom); items = getItems(); /* /* new一个SimpleAdapter * /* items为数据集合 * /* R.layout.lvw_custom为自定义的ListView布局文件 * /* 第四个参数为map中德key集合 * /* 第五个参数为自定义布局文件中空间的资源id集合,与第四个参数要一一对应 * Simpl
6、eAdapter adapter = new SimpleAdapter(this, items, R.layout.lvw_custom, new String , new int R.id.lvw_custom_img, R.id.lvw_custom_name, R.id.lvw_custom_description); lvwCustom.setAdapter(adapter);三、显示非资源id类型图片的ListView通过上面的例子可以看到Map中图片项的value是资源id,这是针对项目中已存在的图片文件,为什么要用资源id而不是其他(比如Bitmap类型)呢,这是因为adapt
7、er的bindView()方法是负责解析图片并将其显示到ImageView中,但它只针对资源id类型做了判断。然而有一种情况,比如你的图片是从网络读取的Bitmap类型,你就需要对代码进行改写了。分析SimpleAdapter的源码,发现getView()方法是负责够造界面布局的的,而getView又是调用bindView来往控件里填充值的,所以我这里对bindView()方法进行改写。新建一个类CustomImageAdapter,代码完全copy自SimpleAdapter,找到bindView方法,对其进行改写:private void bindView(int position, Vi
8、ew view) final Map dataSet = mData.get(position); if (dataSet = null) return; final ViewBinder binder = mViewBinder; final View holder = mHolders.get(view); final String from = mFrom; final int to = mTo; final int count = to.length; for (int i = 0; count; final View v = holderi; if (v != null) final
9、 Object data = String text = data = null ? : data.toString(); if (text = null) text = ; boolean bound = false; if (binder ! bound = binder.setViewValue(v, data, text); if (!bound) if (v instanceof Checkable) if (data instanceof Boolean) (Checkable) v).setChecked(Boolean) data); else throw new Illega
10、lStateException(v.getClass().getName() + should be bound to a Boolean, not a + data.getClass(); else if (v instanceof TextView) / Note: keep the instanceof TextView check at the bottom of these / ifs since a lot of views are TextViews (e.g. CheckBoxes). setViewText(TextView) v, text); else if (v ins
11、tanceof ImageView) if (data instanceof Integer) setViewImage(ImageView) v, (Integer) data); /这里增加对Bitmap类型的判断 else if(data instanceof Bitmap) (ImageView)v).setImageBitmap(Bitmap)data); else setViewImage(ImageView) v, text); throw new IllegalStateException(v.getClass().getName() + is not a + view tha
12、t can be bounds by this SimpleAdapter然后像自定义ListView的步骤一样使用就行了,只是把SimpleAdapter替换为CustomImageAdapter,Map中图片项的value变为Bitmap类型了。四、Item使用不同布局的ListView通过前面的例子可以看到,ListView的所有item使用的都是相同的布局,如果想使用不同的布局呢?这个例子是我从以前做的音乐播放器代码里找的,效果图:MP3的封面图片突然不显示了,不知道咋回事。1、在Map中存放的键值对中多增加一项布局类型: * 根据playlistId获得歌曲列表,用于ListView
13、显示 * * param playlistId * 0表示所有歌曲 private List getSongList(int playlistId) / 取得符合条件的所有歌曲 List songs = getSongs(playlistId); / 构造SongList的数据 List list = new ArrayList Map map1 = new HashMap(); /这里的Type是用于在getView方法中判断并构造布局的 map1.put(type, TYPE_BTN);id, ID_RANDOM_PLAY);mainlist_btn_name随机播放mainlist_bt
14、n_img, R.drawable.list_random_icon); list.add(map1); if (songs ! int size = songs.size(); size; Song song = songs.get(i); Map map = new HashMap();, TYPE_SONG_LIST);, song.getId(); Bitmap bm = MusicHelper.getArtwork(this, song.getId(), song .getAlbumId(), true);songlist_cover_img, bm);songlist_song_n
15、ame, song.getTitle();songlist_song_album, song.getAlbum();songlist_song_artist, song.getArtist(); list.add(map); return list;/map+id/songlist_song_album+id/songlist_song_artistTextViewRelativeLayoutlist_main_btn.xml:+id/mainlist_btn_name28dip+id/mainlist_btn_img3、自定义Adapter类SongListAdapter,继承自BaseAd
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1