有时需要对ListView中的每个Item进行个性化,下面是个简单的例子。其中最重要的ArrayAdapter中的getView()方法的重写,参考了android中ArrayAdapter中的源码。
代码
1.首先是Layout,一个是主界面mian.xml,另一个是ListView中的单独的条目imagelayout.xml。代码如下:
★1 main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<ListView <!--※ 需要一个ListView -->
android:id= "@+id/listview"
android:layout_width="fill_parent"
android:layout_height="fill_parent"/>
</LinearLayout>
★2 imagelayout.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="match_parent"
android:orientation="horizontal" >
<ImageView
android:id="@+id/imageView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/ic_launcher" />
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
2.重写Adapter代码
public class DemoAdapter extends ArrayAdapter<String> {
private LayoutInflater mInflater;//★需要一个LayoutInflater来调整ListView中的LinearLayout
public DemoAdapter(Context context, int textViewResourceId,List<String> list) {
super(context, textViewResourceId,list);
// TODO Auto-generated constructor stub
mInflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);//★
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
//return super.getView(position, convertView, parent);
LinearLayout lv;
TextView tv;
if (convertView == null) {
lv = (LinearLayout) mInflater.inflate(R.layout.imagelayout, parent, false);//相当于new一个新的对象
//lv = new LinearLayout(getContext());
//mInflater.inflate(R.layout.imagelayout,lv,true);
} else {
lv = (LinearLayout) convertView;
}
String item = (String) getItem(position);
tv = (TextView) lv.findViewById(R.id.textView1);
tv.setText(item);
return lv;//返回LinearLayout
}
}
3.主程序中运行
public class mainActivity extends Activity {
/** Called when the activity is first created. */
private ListView lv;
private List<String> ls;
private ArrayAdapter<String> adp;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
lv = (ListView)findViewById(R.id.listview);
ls = new ArrayList<String>();
ls.add("one");
ls.add("two");
ls.add("three");
adp = new DemoAdapter(this,R.layout.imagelayout,ls);
//adp = new ArrayAdapter<String>(this,android.R.layout.simple_expandable_list_item_1,ls);
lv.setAdapter(adp);
}
}
结果如下图
总结
在写这个例子的过程中碰到了一些问题
1.需要一个ListView对象
2.如果ListView中显示的东西较复杂,要一个LinearLayout,将要显示的东西方总LinearLayout中
3.getView()中,最重要的是new 一个LinearLayout对象。这里参考了android源码用了mInflater.inflate(),其实也可以用lv = new LinearLayout(getContext()); 的。