关闭

Android BaseAdapter与ListView的使用

标签: androidlistviewBaseAdapter
508人阅读 评论(0) 收藏 举报
分类:

Android BaseAdapter与ListView的使用

定义:BaseAdapterextends Objectimplements ListAdapter SpinnerAdapter

BaseAdapter是抽象类,因此必须通过继承才能使用,BaseAdapter是实现了ListAdapter和SpinnerAdapter两个接口,当然它也可以直接给ListView和Spinner等UI组件直接提供数据。

相关类结构如下图所示:
tCCA2

ListView的使用中,有时候还需要在里面加入按钮等控件,实现单独的操作。也就是说,这个ListView不再只是展示数据,也不仅仅是这一行要来处理用户的操作,而是里面的控件要获得用户的焦点。读者可以试试用SimpleAdapter添加一个按钮到ListView的条目中,会发现可以添加,但是却无法获得焦点,点击操作被ListViewItem所覆盖。这时候最方便的方法就是使用灵活的适配器BaseAdapter了。

                

                 ▲4-35 BaseAdapter中的方法

使用BaseAdapter必须写一个类继承它,同时BaseAdapter是一个抽象类,继承它必须实现它的方法。BaseAdapter的灵活性就在于它要重写很多方法,看一下有哪些方法,如图4-35所示为继承自BaseAdapterSpeechListAdapter所实现的方法,其中最重要的即为getView()方法。这些方法都有什么作用呢?我们通过分析ListView的原理来为读者解答。

  当系统开始绘制ListView的时候,首先调用getCount()方法。得到它的返回值,即ListView的长度。然后系统调用getView()方法,根据这个长度逐一绘制ListView的每一行。也就是说,如果让getCount()返回1,那么只显示一行。而getItem()getItemId()则在需要处理和取得Adapter中的数据时调用。那么getView如何使用呢?如果有10000行数据,就绘制10000次?这肯定会极大的消耗资源,导致ListView滑动非常的慢,那应该怎么做呢?通过一个例子来讲解如何在使用BaseAdapter的时候优化ListView的显示。例子中将上一节中的ImageView换成Button,并且处理Button的点击事件,其中对ListView的显示做了优化。

  布局文件和上一例类同,读者可以在光盘的工程目录中查看,这里只给出Activity类。

publicclass MyListViewBase extends Activity {
     
    private ListView lv;
    //定义一个动态数组    
    ArrayList<HashMap<String, Object>>listItem;/** Called when the activity is first created. */
     
    @Override
    publicvoid onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
 
        lv = (ListView) findViewById(R.id.lv);
        MyAdapter mAdapter = new MyAdapter(this);//得到一个MyAdapter对象
        lv.setAdapter(mAdapter);//为ListView绑定Adapter
        /**为ListView添加点击事件*/
        lv.setOnItemClickListener(new OnItemClickListener() {
            @Override
            publicvoid onItemClick(AdapterView<?> arg0, View arg1, int arg2,long arg3) {
                Log.v("MyListViewBase", "你点击了ListView条目" + arg2);//在LogCat中输出信息                
            }
        });
    }
    /**添加一个得到数据的方法,方便使用*/
    private ArrayList<HashMap<String, Object>> getDate(){
        ArrayList<HashMap<String, Object>> listItem = new ArrayList<HashMap<String,Object>>();
        /**为动态数组添加数据*/    
        for(int i=0;i<30;i++) 
         { 
             HashMap<String, Object> map = new HashMap<String, Object>(); 
             map.put("ItemTitle", "第"+i+"行"); 
             map.put("ItemText", "这是第"+i+"行"); 
             listItem.add(map); 
         }
        return listItem;
    }
    /** 新建一个类继承BaseAdapter,实现视图与数据的绑定
     */
    privateclass MyAdapter extends BaseAdapter {
        private LayoutInflater mInflater;//得到一个LayoutInfalter对象用来导入布局 
         
        /**构造函数*/
        public MyAdapter(Context context) {
            this.mInflater = LayoutInflater.from(context);
        }
 
        @Override
        publicint getCount() {
            return getDate().size();//返回数组的长度        
        }
 
        @Override
        public Object getItem(int position) {
            returnnull;
        }
 
        @Override
        publiclong getItemId(int position) {
            return 0;
        }
         
        /**书中详细解释该方法*/        
        @Override
        public View getView(finalint position, View convertView, ViewGroup parent) {
             ViewHolder holder;
            //观察convertView随ListView滚动情况            
             Log.v("MyListViewBase", "getView " + position + " " + convertView);
            if (convertView == null) {
                     convertView = mInflater.inflate(R.layout.item,null);
                     holder = new ViewHolder();
                    /**得到各个控件的对象*/                    
                    holder.title = (TextView) convertView.findViewById(R.id.ItemTitle);
                    holder.text = (TextView) convertView.findViewById(R.id.ItemText);
                    holder.bt = (Button) convertView.findViewById(R.id.ItemButton);
                    convertView.setTag(holder);//绑定ViewHolder对象                   
            }
            else{
                    holder = (ViewHolder)convertView.getTag();//取出ViewHolder对象                  
            }
            /**设置TextView显示的内容,即我们存放在动态数组中的数据*/            
            holder.title.setText(getDate().get(position).get("ItemTitle").toString());
            holder.text.setText(getDate().get(position).get("ItemText").toString());
             
            /**为Button添加点击事件*/             
            holder.bt.setOnClickListener(new OnClickListener() {
                @Override
                publicvoid onClick(View v) {
                    Log.v("MyListViewBase", "你点击了按钮" + position);//打印Button的点击信息                    
                }
            });
             
            return convertView;
        }
     
    }
     
    /**存放控件*/
    publicfinalclass ViewHolder{
        public TextView title;
        public TextView text;
        public Button   bt;
    }
}

运行效果如图4-36所示。还需要注意的是,Button会抢夺ListView的焦点,需要将Button设置为没有焦点。设置非常简单,只需要在xmlButton标签下加入一行:android:focusable=“false”代码就可以了。在LogCat观察点击后输出的信息,如图4-37所示。

            

参考资料:http://www.open-open.com/lib/view/open1339485728006.html 


0
0
查看评论

ListView之BaseAdapter的用法简单案例(四)

一个简单的BaseAdapter的用法简单案例, 我们想利用BaseAdapter达到下面图片的简单效果。 首先我们先将布局文件写出来如下<?xml version="1.0" encoding="utf-8"?> <LinearLayo...
  • qq_34487977
  • qq_34487977
  • 2016-04-07 18:34
  • 1748

Fragment 与 ListView, BaseAdapter

转自:http://blog.csdn.net/guolin_blog/article/details/8881711 Fragment初探 为了让界面可以在平板上更好地展示,Android在3.0版本引入了Fragment(碎片)功能,它非常类似于Activity,可以像Activity...
  • xilove102
  • xilove102
  • 2015-09-23 10:36
  • 4232

Android-ListView适配器BaseAdapter的使用和优化

Android-ListView适配器BaseAdapter的使用 这是BaseAdapter的相应的方法属性。 像SimpleAdapter和ArrayAdapter都是继承于BaseAdapter。 可以查看其源码: SimoleAdapter ArrayAdapter 写几...
  • ACM_TH
  • ACM_TH
  • 2016-04-12 09:57
  • 4002

listview的简单使用(Baseadapter)

本篇主要是写下listview的简单实现。(使用Baseadapter) 在自己理解之后稍微做下笔记,在Baseadapter的部分增添了较多注释。 也是希望能给和我一样的新手们一些帮助。   以下是实现效果:     ...
  • Double2hao
  • Double2hao
  • 2015-07-21 12:21
  • 2228

Android复习练习十一(ListView列表显示使用BaseAdapter以及ListView动态刷新)

需求:结合SQLite数据库,实现一个取
  • cyp331203
  • cyp331203
  • 2014-09-04 18:20
  • 1442

android组件ListView之BaseAdapter简单使用

前面所说的arrayAdapter和SimpleAdapter都是在BaseAdapter基础之上为我们封装好了功能,但是只能在特定情况下使用,不够灵活。今天我们动手写一个自己的Adapter。继承与BaseAdapter,实现四个抽象方法。分别是 getCount() 、getItem(int i...
  • sinat_25926481
  • sinat_25926481
  • 2017-04-27 21:03
  • 1729

ListView中BaseAdapter使用CheckBox及其细节操作(8.25)

这个与下面的不同之处在与没有设置存入CheckBox状态的数组而是在fruit类中添加了一个boolean类型的变量来村不同的状态重点在下面 先创建Listview布局 fruit的单条布局 创建fruit类 创建适配器 主程序 现有阶段全部功能的BroadAdapter带有CheckBox的 Li...
  • qq_16444837
  • qq_16444837
  • 2015-08-25 19:52
  • 719

ListView的优化和自定义适配器继承于BaseAdapter

ListView的优化和万能适配器继承于BaseAdapter          在android开发中Listview是一个很重要的组件,它以列表的形式根据数据的长自适应展示具体内容,用户可以自由的定义listview每一列的布局,但当listv...
  • u013128651
  • u013128651
  • 2016-03-21 20:14
  • 2817

ListView中getChildAt()方法以及BaseAdapter中getview使用

一、概述 在项目开发过程中,需要动态更新标题栏上下拉框中listview的每个item,要求是有未读信息时,添加一个红点标识。 这里主要使用CircleBadgeView这个控件,主要是想在不改变listview中item布局的情况下实现给每个item右边添加红点的效果。 二,动态更新红点标识...
  • u010727953
  • u010727953
  • 2016-07-04 11:44
  • 610

Android入门:ListView(继承BaseAdapter实现)

任务: 从数据库中获得Person对象,通过继承BaseAdapter类,显示ListView,如下所示: (此处我们数据库操作的代码略,因为主要讲解的是ListView) PersonAdapter.java package org.xiazdong.db.do...
  • xiazdong
  • xiazdong
  • 2012-07-01 08:15
  • 13376
    个人资料
    • 访问:560029次
    • 积分:5941
    • 等级:
    • 排名:第5115名
    • 原创:107篇
    • 转载:51篇
    • 译文:1篇
    • 评论:175条
    博客专栏
    最新评论