Android学习笔记-listview实现方式之BaseAdapter
listview是Android开发中最为常用的组件,这里我们就学习一下用BaseAdapter的方式实现listview,
主布局activity_main.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="match_parent" android:orientation="vertical" > <ListView android:id="@+id/lv" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > </ListView> </LinearLayout>
定义一个listitem.xml,这用于在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="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="18sp" /> <LinearLayout android:layout_marginLeft="20dip" android:layout_width="fill_parent" android:layout_height="60dip" 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_number" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="5dip" android:text="号码" android:textColor="#880000" android:textSize="18sp" /> </LinearLayout> </LinearLayout>
那么activiy中的实现逻辑是这样的,由于我是在数据库中进行的取值,所以,定义的有dao类,而读者,完全可以自己定义一个arraylist进行数据的展示,
我们实现的是BaseDdapter,这里呢,这要实现类里面的两个方法,getCount():获取要展示的数据的个数,getView():对数据的展示,这里面有一个重要的方法:inflate(Context context, int resource, ViewGroup root)
context:是上下文,
resource:resource The resource ID to inflate,即要展示在listview中的资源文件的id,
root:root A view group that will be the parent. Used to properly inflate the * layout_* parameters,这个可以设置位空。
public class MainActivity extends Activity { private LinearLayout ll; private ListView lv; private List<Person> persons; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ll = (LinearLayout) findViewById(R.id.ll_root); lv = (ListView) findViewById(R.id.lv); //获取数据 PersonDao dao = new PersonDao(this); //persons的类型是List<Person> persons = dao.findAll(); lv.setAdapter(new MyAdapter()); } //默认实现类simplexxx,defaultxxx,basexxx. //当集成借口比较多的时候,可以继承base,simple,defaule,这些开头 private class MyAdapter extends BaseAdapter{ private static final String TAG = "MyAdapter"; //控制listview里总共有多少条目 @Override public int getCount() { // TODO Auto-generated method stub return persons.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; } @Override public View getView(int position, View convertView, ViewGroup parent) { //得到某个位置的person对象。 Person person = persons.get(position); //把xml加载进来 View view = View.inflate(MainActivity.this, R.layout.listitem, null); //一定要在view对象中寻找孩子的id TextView tv_id = (TextView) view.findViewById(R.id.tv_id); TextView tv_name = (TextView) view.findViewById(R.id.tv_name); TextView tv_number = (TextView) view.findViewById(R.id.tv_number); //person.getId(),是int的,+"" ,int一定要转化成String类型的。 //tv_id.setText(person.getId());会出错。 tv_id.setText("ID: "+person.getId()); tv_name.setText("姓名: "+person.getName()); tv_number.setText("电话: "+person.getNumber()); return view; } } }