Android之ListView

来源:互联网 发布:读卡器端口打开失败 编辑:程序博客网 时间:2024/05/21 00:55
ListView
         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>



0 0
原创粉丝点击