Android基础知识(三)之ListView

来源:互联网 发布:java源码如何变成软件 编辑:程序博客网 时间:2024/05/20 22:29

1  ListView入门

【1】定义Listview在布局中

【2】定义ListView的数据适配器

【3】实现BaseAdapter的getCount()方法和getView()方法

protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);                //[1]找到我们关心的控件        ListView lv = (ListView) findViewById(R.id.lv);        //[2]显示数据 和其他的普通控件有点区别 数据来源于数据适配器        lv.setAdapter(new MyListAdapter());        }    //定义listview的数据适配器      private class  MyListAdapter extends BaseAdapter      {      //一共有多少条数据需要展示@Overridepublic int getCount() {return 1000000;}//返回指定position位置对应的对象@Overridepublic Object getItem(int position) {return null;}//返回position位置对应的ID@Overridepublic long getItemId(int position) {return 0;}/** * 获取一个View  用来显示listview的数据 会作为listview的一个条目出现 * convertView 历史缓存对象 */@Overridepublic View getView(int position, View convertView, ViewGroup parent) {//第一次没有优化的情况下//System.out.println("getView"+position);//TextView tv = new TextView(MainActivity.this);//tv.setText("哈哈"+position);//return tv;//TextView tv;if(convertView == null){//创建新的View对象tv = new TextView(MainActivity.this);System.out.println("创建新的View对象----"+position);}else{System.out.println("复用历史缓存对象 对象----"+position);tv = (TextView) convertView;}tv.setText("哈哈"+position);return tv;}      }

2 ListView的优化

当快速滚动的时候出现错误:out of memory on a 108-byte allocation

优化方法(在getView()方法中固定写法):

                        TextView tv;if(convertView == null){//创建新的View对象tv = new TextView(MainActivity.this);}else{tv = (TextView) convertView;                       }                        tv.setText("哈哈哈呵呵呵"+position);                       return tv;
补充:ListView的奇怪现象(给出总结:以后再使用ListView的时候,使用填充父窗体,即match_parent,一般宽和高都使用填充父窗体)


3 ListView显示数据的原理

javaweb中的mvc:

m:mode  数据

 v :view  视图

 c :controller  负责把数据展示到jsp中

Android中的mvc:

m:mode  数据(javabean)

 v :view    ListView

 c :controller   adapter:负责把数据展示到jsp中

☆不管是什么Adapter,作用就是把数据展示到ListView上


4 ListView显示复杂页面

线性布局、相对布局都继承着ViewGroup,这就说明ViewGroup可以有自己的孩子

通过一个打气筒(inflate)可以把一个布局转换成一个View对象


5 获取打气筒(inflate)的常见API

public View getView(int position, View convertView, ViewGroup parent) {//[1]想办法把我们自己定义的布局转换成一个View对象就可以了View view;if(convertView==null){//创建新的View对象 可以通过打气筒把一个布局资源转换成一个View对象//resourse就是布局文件//第一种获取打气筒方法☆☆☆☆☆☆//view = View.inflate(getApplicationContext(), R.layout.item, null);//第二种获取打气筒方法☆☆☆☆☆☆//view = LayoutInflater.from(getApplicationContext()).inflate(R.layout.item, null);//第三种获取打气筒方法☆☆☆☆☆☆LayoutInflater inflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);view = inflater.inflate(R.layout.item, null);}else{//复用历史缓存对象view = convertView;}return view;}

6 ArrayAdapter的使用

    String objects[]={"老张","老方","老黎","老毕","老刘","老韩"};//模拟数据    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);                //[1]找到我们关心的控件        ListView lv = (ListView) findViewById(R.id.iv);        //[2]创建一个arrayAdapter        ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, R.layout.item1, R.id.tv_name, objects);                //[3]设置数据适配器        lv.setAdapter(adapter);
权重的概念:一般使用在线性布局中,就是把宽分成几等份,然后每个TextView占几份


7 SimpleAdapter使用

protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);                //[1]找到我们关心的控件        ListView lv = (ListView) findViewById(R.id.lv);        //[1.1]准备listview要显示的数据        List<Map<String, String>> data = new ArrayList<Map<String,String>>();        Map<String, String> map1 = new HashMap<String, String>();        map1.put("name", "张飞");        map1.put("phone", "1388888");                Map<String, String> map2 = new HashMap<String, String>();        map2.put("name", "赵云");        map2.put("phone", "110");                Map<String, String> map3 = new HashMap<String, String>();        map3.put("name", "貂蝉");        map3.put("phone", "1311187");                Map<String, String> map4 = new HashMap<String, String>();        map4.put("name", "关羽");        map4.put("phone", "15567485");                //[1.2]把map加入到集合中        data.add(map1);        data.add(map2);        data.add(map3);        data.add(map4);                //[2]设置数据适配器  resourse:我们定义的布局文件        //from:map集合的键值        SimpleAdapter adapter = new SimpleAdapter(getApplicationContext(), data, R.layout.item, new String[]{"name","phone"}, new int[]{R.id.tv_name,R.id.tv_phone});                //[3]设置数据适配器        lv.setAdapter(adapter);    }

15 把数据库里面的数据查询出来展示到ListView上

//定义listview的数据适配器    private class MyAdapter extends BaseAdapter    {@Overridepublic int getCount() {return lists.size();}@Overridepublic Object getItem(int position) {// TODO Auto-generated method stubreturn null;}@Overridepublic long getItemId(int position) {// TODO Auto-generated method stubreturn 0;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {View view;if(convertView==null){//创建新的view对象view = View.inflate(getApplicationContext(), R.layout.item, null);}else{view = convertView;}//找到控件 用来显示数据TextView tv_name = (TextView) view.findViewById(R.id.tv_name);TextView tv_phone = (TextView) view.findViewById(R.id.tv_phone);//如果显示数据Person person = lists.get(position);tv_name.setText(person.getName());tv_phone.setText(person.getPhone());return view;}        }









原创粉丝点击