Android 采用Layout Inflater创建一个View对象

时间:2022-04-01 17:04:58

接着上文《Android ListViewview入门》,本文使用android的Inflater来实现

在layouyt文件夹中新建一个list_item.xml的文件,添加如下代码:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/ll_root"
android:layout_width="match_parent"
android:layout_height="60dip"
android:gravity="center_vertical"
android:orientation="horizontal"> <TextView
android:id="@+id/tv_id"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="5dip"
android:text="id"
android:textColor="#ff0000"
android:textSize="16sp" /> <LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="20dip"
android:gravity="center_vertical"
android:orientation="vertical" > <TextView
android:id="@+id/tv_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="5dip"
android:text="姓名"
android:textColor="#000000"
android:textSize="18sp" /> <TextView
android:id="@+id/tv_phone"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="5dip"
android:layout_marginTop="5dip"
android:text="电话"
android:textColor="#88000000"
android:textSize="16sp" />
</LinearLayout> </LinearLayout>

界面布局如下:

Android 采用Layout Inflater创建一个View对象

代码如下:

package com.wuyudong.db;

import java.util.List;

import com.wuyudong.db.dao.PersonDao;
import com.wuyudong.db.domain.Person; import android.os.Bundle;
import android.text.style.LeadingMarginSpan;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.TextView;
import android.app.Activity;
import android.graphics.Color; public class MainActivity extends Activity { private ListView lv;
private List<Person> persons; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
PersonDao dao = new PersonDao(this);
persons = dao.findAll();
lv = (ListView) findViewById(R.id.lv); lv.setAdapter(new MyAdapter());
} // 默认实现类形如: simplexxx, basexxx, defaultxxx
private class MyAdapter extends BaseAdapter { private static final String TAG = "MyAdapter"; /**
* 控制ListView里面总共有多少条目
*/
@Override
public int getCount() {
return persons.size(); // 条目个数==集合的size
} @Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return null;
} @Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return 0;
} //控制每个条目所显示的内容,依据position表示的位置来显示
@Override
public View getView(int position, View convertView, ViewGroup parent) { // 得到某个位置对应的person对象
Person person = persons.get(position);
View view = View.inflate(MainActivity.this, R.layout.list_item, null);
//一定要在view对象里面寻找孩子的id
TextView tv_id = (TextView)view.findViewById(R.id.tv_id);
tv_id.setText("id:" +person.getId()); TextView tv_name = (TextView)view.findViewById(R.id.tv_name);
tv_name.setText("姓名:" +person.getName()); TextView tv_phone = (TextView)view.findViewById(R.id.tv_phone);
tv_phone.setText("电话:" +person.getNumber());
return view; } }
}

运行后的效果如下:

Android 采用Layout Inflater创建一个View对象

如果将上面的代码tv_id.setText("id:" +person.getId());改为tv_id.setText(person.getId()); 程序会报错。

原因:person.getId()返回值为int类型,而setText函数会从R资源文件中查找,显然是找不到的。

所以修改为tv_id.setText(person.getId()+""); 即可


总结:

##listview使用的步骤
1. 定义布局文件 xml声明 ListView节点
2. 找到listview
3. 设置数据适配器
4. 实现getCount() 返回有多少个条目
5. 实现getView() 返回每个位置显示的内容view对象。
6. 优化listview 复用 convertView