使用BaseAdapter需要注意的两个问题以及解决问题的办法

2016-05-30 20:04 阅读 3,408 次 评论 0 条
版权声明:本文著作权归TeachCourse所有,未经许可禁止转载,谢谢支持!
转载请注明出处:http://teachcourse.cn/1787.html

摘要

BaseAdapter继承Object,实现接口ListAdapter、SpinnerAdapter,必须实现Adapter的四个抽象方法:getItem(int)getItemId(int)getCount()getView(int,View,ViewGroup),BaseAdapter本身常用的方法有:notifyDataSetChanged(),notifyDataSetInvalidate()getItemViewType(int),getItemTypeCount(),除此之外还声明了额外的几个方法:areAllItemsEnabled(),getDropDownView(int,View,ViewGroup)hasStableIds()isEmpty()isEnabled(int)registerDataSetObserver(DataSetObserver)unregisterDataSetObserver(DataSetObserver)
002-baseadapter

BaseAdapter简单使用

给ListView设置BaseAdapter,绑定列表数据。在钊林IT其中的一篇文章里详细介绍过接口实现的三种方式,这里以“匿名类实现法”为例。

  1. String items[]={"getItem","getItemId","getCount","getView"};  
  2. for (String item:items)  
  3. mList.add(item);  
  4. mListView=(ListView)findViewById(R.id.methods_listview);  
  5. mListView.setAdapter(new BaseAdapter(){  
  6.             @Override  
  7.             public Object getItem(int position){  
  8.                 if(mList.size()>0){  
  9.                     return mList.get(position);  
  10.                 }  
  11.                 return null;  
  12.             }  
  13.             @Override  
  14.             public long getItemId(int position){  
  15.                 if(mList.size()>0){  
  16.                     return position;  
  17.                 }  
  18.                 return 0;  
  19.             }  
  20.             @Override  
  21.             public int getCount(){  
  22.                 return mList.size();  
  23.             }  
  24.         public View getView(int position, View convertView, ViewGroup parent){  
  25.   
  26.             if(convertView==null){  
  27.                 convertView= LayoutInflater.from(ListViewActivity.this).inflate(R.layout.list_item_text,parent,false);  
  28.             }  
  29.             TextView textView=(TextView)convertView.findViewById(R.id.text);  
  30.             textView.setText(mList.get(position));  
  31.             return convertView;  
  32.         }  
  33.   
  34.         });  

运行项目的效果,在ListView列表中展示四条数据内容。在上面BaseAdapter简单使用的基础上添加四个常用的方法:

BaseAdapter常用的四个方法:

1、notifyDataSetChanged(),提醒依附的监视器底层的数据已发生改变,每一个item视图都应该刷新本身

2、notifyDataSetInvalidated(),提醒依附的监视器底层的数据不再是有效的或可获得的

3、getItemViewType(int),获得在getView(int,View,ViewGroup)创建的指定item的视图类型,根据返回值,在getView()方法中初始化多种布局

4、getViewTypeCount(),返回在getView()方法初始化布局视图的数量

  1. /** 
  2.  *ListView列表展示两种item视图,调用notifyDataSetChanged刷新items 
  3.  * 
  4.  */  
  5. private AbsListView.OnScrollListener mOnScroll=new AbsListView.OnScrollListener() {  
  6.         @Override  
  7.         public void onScrollStateChanged(AbsListView view, int scrollState) {  
  8.   
  9.         }  
  10.   
  11.         @Override  
  12.         public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {  
  13.         //滑动到底部时  
  14.             if(firstVisibleItem==0){  
  15.                  
  16.             }  
  17.         //滑动到底部时,添加新数据,调用notifyDataSetChanged刷新items  
  18.             if(visibleItemCount+firstVisibleItem==totalItemCount){  
  19.                 String items[]={"notifyDataSetChanged","notifyDataSetInvalidate","getItemViewType","getItemTypeCount"};  
  20.                 for (String item:items)  
  21.                     mList.add(item);  
  22.                     mAdapter.notifyDataSetChanged();  
  23.           
  24.             }  
  25.         }  
  26.     };  

notifydatasetchanged

ListView滑动到底部时,感觉怎么滑都还有数据,每次滑动底部都会添加新的内容同时刷新ListView,感觉就像一个无穷无尽的新闻列表;当我们的数据没有新添加时,调用notifyDataSetInvalidate方法,在做新闻列表时,在多个Fragment来回切换时,新闻列表中的数据未发生改变,这时候如果还调用notifyDataSetChanged方法,会出现一片空白,解决的办法调用notifyDataSetInvalidate方法或者将mAdapter赋值为null

getViewTypeCount()方法设置items视图需要初始化布局的总数,getItemViewType(int)返回指定位置的item视图

  1. public View getView(int position, View convertView, ViewGroup parent){  
  2.             int viewType=getItemViewType(position);  
  3.             switch (viewType){  
  4.                 case firstViewType:  
  5.                     if(convertView==null){  
  6.                         convertView= LayoutInflater.from(ListViewActivity.this).inflate(R.layout.list_item_text,parent,false);  
  7.                     }  
  8.                     TextView textView=(TextView)convertView.findViewById(R.id.text);  
  9.                     textView.setText(mList.get(position));  
  10.                 break;  
  11.                 case secondViewType:  
  12.                     if(convertView==null){  
  13.                         convertView= LayoutInflater.from(ListViewActivity.this).inflate(R.layout.list_item_text_img,parent,false);  
  14.                     }  
  15.                     textView=(TextView)convertView.findViewById(R.id.text);  
  16.                     textView.setText(mList.get(position));  
  17.   
  18.   
  19.                 break;  
  20.             }  
  21.             return convertView;  
  22.         }  
  1. private int viewTypeCount=2;//设置视图布局总数  
  2. private static final int firstViewType=0;//参数必须从0开始,否则报异常:java.lang.ArrayIndexOutOfBoundsException: length=2; index=2  
  3. private static final int secondViewType=1;  
  4.         @Override  
  5. public int getViewTypeCount() {  
  6.             return viewTypeCount;  
  7.         }  
  8.   
  9.         @Override  
  10. public int getItemViewType(int position) {  
  11.             int p=position%5;  
  12.             if(p!=0){  
  13.                 return firstViewType;  
  14.             }  
  15.             return secondViewType;  
  16.         }  

其他BaseAdapter方法

1、areAllItemsEnabled(),标识在当前适配器中所有的items是否可用

2、getDropDownView(int,View,ViewGroup),获取指定位置显示下拉列表数据的item视图

3、hasStableIds(),标识是否item id是稳定的

4、isEmpty(),是否为空

5、isEnabled(),返回false,表示指定位置的item是独立,一个独立的item不允许选中和点击

6、registerDataSetObserver(DataSetObserver),当数据改变时,被适配器回调该注册的监视器

7、unregisterDataSetObserver(DataSetObserver),调用当方法解除已注册的监视器

关注公众号 扫一扫二维码,加我QQ

如果文章对你有帮助,欢迎点击上方按钮关注作者

来源:TeachCourse每周一次,深入学习Android教程,关注(QQ1589359239或公众号TeachCourse)
转载请注明出处:http://teachcourse.cn/1787.html
分类:Android 标签:,
Fragment+FragmentTabHost实现仿QQ底部菜单栏 Fragment+FragmentTabHost实
Android手机如何快速接入周围无线网络 Wifi密码快速破解 Wifi工具 Android手机如何快速接入周围无
浅谈Comparator接口使用方法 浅谈Comparator接口使用方法
Easy WP SMTP 插件,wordpress万网主机smtp发邮件失败解决办法 Easy WP SMTP 插件,word

发表评论

呲牙 憨笑 坏笑 偷笑 色 微笑 抓狂 睡觉 酷 流汗 鼓掌 大哭 可怜 疑问 晕 惊讶 得意 尴尬 发怒 奋斗 衰 骷髅 啤酒 吃饭 礼物 强 弱 握手 OK NO 勾引 拳头 差劲 爱你

表情