Android之ListView
来源:互联网 发布:读卡器端口打开失败 编辑:程序博客网 时间:2024/05/21 00:55
1.三种Adapter构建ListView
ListView添加条目的时候, 可以使用setAdapter(ListAdapter)方法, 常用的ListAdapter有三种
BaseAdapter: 定义一个类继承BaseAdapter, 重写4个抽象方法, ListView的条目是由getView()方法构建出来的
SimpleAdapter: 创建SimpleAdapter对象时, 传入数据(List<Map<String, ?>>), 并指定数据的绑定关系
SimpleCursorAdapter: 创建SimpleCursorAdapter对象时, 传入一个Cursor, 指定数据的绑定关系
2.监听ListView的点击
调用ListView.setOnItemClickListener(OnItemClickListener)方法注册一个监听器
在监听器的onItemClick()方法中使用 parent.getItemAtPosition(position) 方法可以获取指定条目上的数据
BaseAdapter:返回的就是自定义的getItem()方法中返回的数据
SimpleAdapter:返回的是一个Map, 就是创建SimpleAdapter时List中的一个Map
SimpleCursorAdapter:返回的是一个Cursor, 这个Cursor就是创建时传入的Cursor, 但是已经通过moveToPosition()方法指定到点击的索引了
一:BaseAdapter添加方式:
1.查询出要被添加的数据
2.获取ListView对象
3.创建一个类继承BaseAdapter,实现其中的方法
4.给ListView对象设置适配器personLV.setAdapter(new MyBaseAdapter());
import java.util.List;import android.app.Activity;import android.os.Bundle;import android.view.View;import android.view.ViewGroup;import android.widget.AdapterView;import android.widget.AdapterView.OnItemClickListener;import android.widget.BaseAdapter;import android.widget.ListView;import android.widget.TextView;import android.widget.Toast;import com.xxc.dao.PersonDao;import com.xxc.domain.Person;/** * 注意: * BaseAdapter生成的条目,进行Item点击事件监听的时候, * parent.getItemAtPosition(position)返回的是person对象 * 因为调用的是生成条目对象MyBaseAdapter类中的getItem方法 * */public class BaseAdapterActivity extends Activity { private ListView personLV;private List<Person> persons;/** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); PersonDao dao = new PersonDao(getApplicationContext()); persons = dao.queryAll();//查询数据 personLV = (ListView) findViewById(R.id.personLV);//获取ListView personLV.setAdapter(new MyBaseAdapter());//给ListView添加适配器,按照adapter中的方法对ListView添加条目 personLV.setOnItemClickListener(new MyOnItemClickListener());//给条目添加条目点击监听器 } /** * 点击事件监听器 */ private class MyOnItemClickListener implements OnItemClickListener {public void onItemClick(AdapterView<?> parent, View view, int position,long id) {Person p = (Person) parent.getItemAtPosition(position);//其实就是调用了MyBaseAdapter中的getItem方法,返回指定条目上的数据Toast.makeText(getApplicationContext(), p.getId()+","+p.getName()+","+p.getBalance(), Toast.LENGTH_SHORT).show();} } /** * 将每个Person对象生成一个条目,将每个条目添加到ListView中 */ private class MyBaseAdapter extends BaseAdapter {public int getCount() {//返回ListView中要显示的条目数量(说白了就是,person集合元素的个数)return persons.size();}public Object getItem(int position) {//返回指定位置上的对象return persons.get(position);}public long getItemId(int position) {//返回条目的id,从0开始return position;}//返回指定位置上的View,添加到ListView中,也就是说Person集合有几个元素就调用这个方法几次,一次生成一个条目public View getView(int position, View convertView, ViewGroup parent) {//因为屏幕最多显示10个条目,上下移动的时候都是移动的时候创建的,而不是一次创建完的,convertView代表移出屏幕外的那个条目Person person = persons.get(position);/* * inflate充气的意思,理解为构建一个条目 * 参数一:上下文环境 * 参数二:item的布局文件 * 参数三:将item挂到哪个组件上,如果写null,默认挂到ListView上 *//** * 千万要注意: * 此时SQLiteNewActivity类中使用findViewById并不能找到条目中的id,name,balance组件 * 因为此时还没加载到Activity中 * 所以需要靠item(条目)来获取条目里的组件 * item.findViewById * */View item = View.inflate(getApplicationContext(), R.layout.item, null);TextView idTV = (TextView) item.findViewById(R.id.idTV);TextView nameTV = (TextView) item.findViewById(R.id.nameTV);TextView balanceTV = (TextView) item.findViewById(R.id.balanceTV);/** * 千万要注意: * setText(CharSequence text) * setText(int resid) * 这个方法有重载,如果传入int类型的值进去(比如person的id和balance) * 程序会去找R文件中内部类string中的值,所以肯定找不到 * 因此setText的时候务必转成字符串 */idTV.setText(person.getId()+"");nameTV.setText(person.getName());balanceTV.setText(person.getBalance()+"");return item;} }}
二.SimpleAdapter添加方式:
1.查询出要被添加的数据
2.创建一个Map元素的List集合 List<Map<String,Object>> data = new ArrayList<Map<String,Object>>();
3.遍历需要被添加的数据,将数据以键值对的方式加入到map集合中,再将Map集合加入到List集合
4.获取ListView对象 ListView personLV = (ListView) findViewById(R.id.personLV);
5.给ListView设置适配器
personLV.setAdapter(new SimpleAdapter(this, data , R.layout.item, new String[]{"id","name","balance"}, new int[]{R.id.idTV,R.id.nameTV,R.id.balanceTV}));
/* SimpleAdapter传入指定的数据和布局文件,以及匹配关系,自动生成View,装入LsitView
* 参数一:上下文环境
* 参数二:数据,List<Map<String,Object>>,每个Person的数据装入一个Map,将所有Map装入List
* 参数三:布局文件的资源id,因为每个条目也有自己的布局方式,这个布局指的是每个item的布局
* 参数四:Map中的key,和参数五中的id所对应的组件对应,将指定Key对应的Value,放入id对应的组件上
* 参数五:View中的id
*/
import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;import android.app.Activity;import android.os.Bundle;import android.view.View;import android.widget.AdapterView;import android.widget.AdapterView.OnItemClickListener;import android.widget.ListView;import android.widget.SimpleAdapter;import android.widget.Toast;import com.xxc.dao.PersonDao;import com.xxc.domain.Person;/** * 注意: * SimpleAdapter生成的条目,进行Item点击事件监听的时候, * parent.getItemAtPosition(position)返回的是map集合 * */public class SimpleAdapterActivity extends Activity { private ListView personLV;private List<Person> persons;/** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); PersonDao dao = new PersonDao(getApplicationContext()); persons = dao.queryAll();//查询数据 personLV = (ListView) findViewById(R.id.personLV);//获取ListView List<Map<String, Object>> data = new ArrayList<Map<String,Object>>(); //把每个Person的数据装入一个map,再将所有map装入list for (Person p : persons) {Map<String,Object> map = new HashMap<String, Object>();map.put("id", p.getId());map.put("name", p.getName());map.put("balance", p.getBalance());data.add(map);}/* * 参数一:上下文环境 * 参数二:遍历Person集合,将一个Person对象数据装入Map集合,再将所有Map集合装入List集合中 * 参数三:生成条目的布局文件 * 参数四:map中的key * 参数五:条目中的组件id * 参数四和参数五的意思是: * 根据key去找map集合找到对应的value值,将value放到参数五中的组件中(先后顺序) */ personLV.setAdapter(new SimpleAdapter(getApplicationContext(), data , R.layout.item, new String[]{"id","name","balance"}, new int[]{R.id.idTV,R.id.nameTV,R.id.balanceTV})); personLV.setOnItemClickListener(new MyOnItemClickListener());//给条目添加条目点击监听器 } /** * 点击事件监听器 */ private class MyOnItemClickListener implements OnItemClickListener {public void onItemClick(AdapterView<?> parent, View view, int position,long id) {Map<String,Object> map = (Map<String, Object>) parent.getItemAtPosition(position);//其实就是调用了MyBaseAdapter中的getItem方法,返回MapToast.makeText(getApplicationContext(), map.get("name").toString(), Toast.LENGTH_SHORT).show();} }}
三:SimpleCursorAdapter
1.查询出要被添加的数据,返回的是一个Cursor类型对象
2.获取ListView对象
3.在ListView上设置适配器
注意:查询出来的主键必须以_id命名,最好就是数据库表中的主键列名就是_id,如果不能改变,就在查询的时候取别名。
dao层
/** * 查询person表中所有记录,返回 Cursor类型 */public Cursor queryAllCursor(){SQLiteDatabase db = helper.getReadableDatabase();Cursor c = db.query("person", new String[]{"id _id ","name","balance"}, null, null, null, null, "id DESC");return c;}
Activity
import android.app.Activity;import android.database.Cursor;import android.os.Bundle;import android.view.View;import android.widget.AdapterView;import android.widget.AdapterView.OnItemClickListener;import android.widget.ListView;import android.widget.SimpleCursorAdapter;import android.widget.Toast;public class SimpleCursorAdapterActivity extends Activity { private ListView personLV; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); PersonDaoNew dao = new PersonDaoNew(getApplicationContext()); Cursor c = dao.queryAllCursor(); personLV = (ListView) findViewById(R.id.personLV); personLV.setAdapter(new SimpleCursorAdapter(this, R.layout.item, c,// new String[]{"_id","name","balance"}, // new int[]{R.id.idTV,R.id.nameTV,R.id.balanceTV}));// /* *参数一:上下文环境 *参数二:布局文件资源ID *参数三:包含数据的游标 *参数四:游标中的列名 *参数五:条目中的组件ID,游标中的数据就会放在这些组件上 */ personLV.setOnItemClickListener(new MyOnItemClickListener());//添加监听器 } //监听器的实现类 private class MyOnItemClickListener implements OnItemClickListener{public void onItemClick(AdapterView<?> parent, View view, int position,long id) {Cursor c = (Cursor) parent.getItemAtPosition(position);Toast.makeText(getApplicationContext(), c.getString(0), Toast.LENGTH_SHORT).show();} }}
item.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" android:padding="10dp"> <TextView android:id="@+id/idTV" android:textSize="20sp" android:layout_width="0dp" android:layout_weight="1" android:layout_height="wrap_content" android:text="1" /> <TextView android:layout_weight="2" android:id="@+id/nameTV" android:layout_width="0dp" android:textSize="20sp" android:layout_height="wrap_content" android:text="皮卡丘" /> <TextView android:layout_weight="2" android:id="@+id/balanceTV" android:layout_width="0dp" android:layout_height="wrap_content" android:text="1000" android:textSize="20sp" /></LinearLayout>
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" > <!-- 这个是表头的设置,下面拖动,表头不会动 --> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" android:padding="10dp"> <TextView android:textSize="20sp" android:layout_width="0dp" android:layout_weight="1" android:layout_height="wrap_content" android:text="序号" /> <TextView android:layout_weight="2" android:layout_width="0dp" android:textSize="20sp" android:layout_height="wrap_content" android:text="姓名" /> <TextView android:layout_weight="2" android:layout_width="0dp" android:layout_height="wrap_content" android:text="余额" android:textSize="20sp" /></LinearLayout><!-- 这个是表头的设置,下面拖动,表头不会动 --> <ListView android:id="@+id/personLV" android:layout_width="fill_parent" android:layout_height="fill_parent"/></LinearLayout>
四:ArrayAdapter
最简单的数据适配器
Activity
package com.xxc.day4;import android.app.Activity;import android.os.Bundle;import android.widget.ArrayAdapter;import android.widget.ListView;public class MainActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);ListView array_lv = (ListView) findViewById(R.id.array_lv);String[] objs = new String[]{"王立军1","王立军2","王立军3","王立军4","王立军5","王立军6"};/** * 参数一:上下文 * 参数二:资源文件,是一个TextView,由android自己定义的 * 参数三:要显示的数据 */ArrayAdapter<String> adapter = new ArrayAdapter<String>(getApplicationContext(), android.R.layout.simple_list_item_1, objs);array_lv.setAdapter(adapter);}}
main.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <ListView android:id="@+id/array_lv" android:layout_width="match_parent" android:layout_height="match_parent"> </ListView></LinearLayout>
- [ListView]android ListView之EmptyView
- Android 控件之ListView
- Android开发之ListView
- android之listview
- Android学习之ListView
- Android 之 ListView (一)
- android 之 ListView (二)
- Android开发之ListView
- Android控件之ListView
- Android控件之ListView
- android之ListView布局
- android控件之ListView
- Android控件之ListView
- android之ListView
- Android之ListView
- android 之 ListActivity & ListView
- Android学习之 Listview
- Android 之 ListView相关
- Github最流行的10,000个Java项目使用的类库
- 2. Android系统框架介绍
- CrawlScript爬虫脚本语言QQ群及邮箱
- 虚假价格低健康
- 如何让DIV水平和垂直居中
- Android之ListView
- JS的substr与substring的区别
- mmap的使用
- config guide:Catalyst 3560 & 3750 Switch Cisco IOS Commands
- Delphi 2009 新增的一个小函数: SysUtils.ByteLength
- Duilib学习笔记《05》— 消息响应处理
- Linux统计某文件夹下文件、文件夹的个数
- 盘点2013年IT界25个最古怪的面试题
- andriod-api翻译(一)--activity