【Android】说做就做:带图标的list item这几天在搞带有icon的list item,但实现方法貌似很复杂,照着国外达人
【Android】说做就做:带图标的list item
这几天在搞带有icon的list item,但实现方法貌似很复杂,照着国外达人的一些code snippet也搞不定,他们也没把全部的code发出了,NND。。。怒!今天终于集众家之大成。。。搞定一个了。。。想想还是GWT好,一个composite widget就很轻松搞定了。。。Android目前还算是垃圾滴。。。
做个ImageItem class存放icon和text:
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="horizontal" android:layout_width="fill_parent"android:layout_height="fill_parent"><TextView id="@+id/text1" android:layout_width="0dip"android:layout_height="fill_parent"android:layout_weight="1"/><TextView id="@+id/text2" android:layout_width="0dip"android:layout_height="fill_parent"android:layout_weight="2"/></LinearLayout>
这里是用2个TextView来做横向排列的组合
在Activity里面就可以这样写了:
public void onCreate(Bundle icicle) {super.onCreate(icicle);List items = new ArrayList();Map i1 = new HashMap();i1.put("text", "text1");i1.put("icon", "icon1");items.add(i1);Map i2 = new HashMap();i2.put("text", "text2");i2.put("icon", "icon2");items.add(i2);ListAdapter adapter = new SimpleAdapter(this, items, R.layout.row, new String[] { "icon", "text" }, new int[] { R.id.text1, R.id.text2 });setListAdapter(adapter);}
这里用了SDK提供的SimpleAdapter,来把一个Map通过key值绑定到了layout id上,这样出来了附件的显示效果,距离我们想要的最终效果就是文字和图标的区别。
下一步就是把row.xml中的其中一个TextView替换成ImageView:
<ImageView id="@+id/icon1" android:layout_width="0dip"android:layout_height="fill_parent"android:layout_weight="1"/>
由于SimpleAdapter只能绑定到TextView,我们还需要自己写一个IconTextAdapter extends SimpleAdapter,重写里面的绑定数据到ImageView的方法,就能够实现想要的效果了。
可惜SDK里面的android.jar还没有放出源代码来,也没有相关的例子,光看api文档摸索需要一些时间,我就偷懒了, 这个实验就做到此,
public class IconTextAdapter extends SimpleAdapter {private int[] mIcons;private int mIconId;/** * @param icons要显示的Icon资源id * @param iconIdicon在layout中的id */public IconTextAdapter(Context context, List data,int resource, String[] from, int[] to,int[] icons, int iconId) {super(context, data, resource, from, to);mIcons = icons;mIconId = iconId;}public View getView(int position, View convertView, ViewGroup parent) {View v = super.getView(position, convertView, parent);ImageView img = (ImageView) v.findViewById(mIconId);img.setImageResource(mIcons[position]);return v;}}
[img][/i
gsdfgsdgdsgsdgsdfg
mg][/url][url][flash=200,200][/flash]color]
dfsgsdfgfsdg<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<ListView id="@id/android:list"
android:layout_width="fill_parent"
android:layout_height="0dip"
android:layout_weight="1"
android:drawSelectorOnTop="false"
/>
</LinearLayout>
另一个是:list_row.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<ImageView id="@+id/icon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
<TextView id="@+id/city"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
</LinearLayout>
另外还有一个icon,icon_smail.jpg文件
icon_smile.jpg
还有一个问题,List,Map可以如下这样使用吗?
private List fillMaps(){
List items = new ArrayList();
Map i1 = new HashMap();
i1.put("icon", getResources().getDrawable(R.drawable.icon_smile));
i1.put("city", "Beijing");
items.add(i1);
Map i2 = new HashMap();
i2.put("icon", getResources().getDrawable(R.drawable.icon_smile));
i2.put("city", "Tokyo");
items.add(i2);
return items;
}
多谢各位了!!!<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<ListView id="@id/android:list"
android:layout_width="fill_parent"
android:layout_height="0dip"
android:layout_weight="1"
android:drawSelectorOnTop="false"
/>
</LinearLayout>
另一个是:list_row.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<ImageView id="@+id/icon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
<TextView id="@+id/city"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
</LinearLayout>
另外还有一个icon,icon_smail.jpg文件
icon_smile.jpg
还有一个问题,List,Map可以如下这样使用吗?
private List fillMaps(){
List items = new ArrayList();
Map i1 = new HashMap();
i1.put("icon", getResources().getDrawable(R.drawable.icon_smile));
i1.put("city", "Beijing");
items.add(i1);
Map i2 = new HashMap();
i2.put("icon", getResources().getDrawable(R.drawable.icon_smile));
i2.put("city", "Tokyo");
items.add(i2);
return items;
}
多谢各位了!!!
HashMap j2me好像不支持吧!