摘要
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)。
BaseAdapter简单使用
给ListView设置BaseAdapter,绑定列表数据。在钊林IT其中的一篇文章里详细介绍过接口实现的三种方式,这里以“匿名类实现法”为例。
- String items[]={"getItem","getItemId","getCount","getView"};
- for (String item:items)
- mList.add(item);
- mListView=(ListView)findViewById(R.id.methods_listview);
- mListView.setAdapter(new BaseAdapter(){
- @Override
- public Object getItem(int position){
- if(mList.size()>0){
- return mList.get(position);
- }
- return null;
- }
- @Override
- public long getItemId(int position){
- if(mList.size()>0){
- return position;
- }
- return 0;
- }
- @Override
- public int getCount(){
- return mList.size();
- }
- public View getView(int position, View convertView, ViewGroup parent){
- if(convertView==null){
- convertView= LayoutInflater.from(ListViewActivity.this).inflate(R.layout.list_item_text,parent,false);
- }
- TextView textView=(TextView)convertView.findViewById(R.id.text);
- textView.setText(mList.get(position));
- return convertView;
- }
- });
运行项目的效果,在ListView列表中展示四条数据内容。在上面BaseAdapter简单使用的基础上添加四个常用的方法:
BaseAdapter常用的四个方法:
1、notifyDataSetChanged(),提醒依附的监视器底层的数据已发生改变,每一个item视图都应该刷新本身
2、notifyDataSetInvalidated(),提醒依附的监视器底层的数据不再是有效的或可获得的
3、getItemViewType(int),获得在getView(int,View,ViewGroup)创建的指定item的视图类型,根据返回值,在getView()方法中初始化多种布局
4、getViewTypeCount(),返回在getView()方法初始化布局视图的数量
- /**
- *ListView列表展示两种item视图,调用notifyDataSetChanged刷新items
- *
- */
- private AbsListView.OnScrollListener mOnScroll=new AbsListView.OnScrollListener() {
- @Override
- public void onScrollStateChanged(AbsListView view, int scrollState) {
- }
- @Override
- public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
- //滑动到底部时
- if(firstVisibleItem==0){
- }
- //滑动到底部时,添加新数据,调用notifyDataSetChanged刷新items
- if(visibleItemCount+firstVisibleItem==totalItemCount){
- String items[]={"notifyDataSetChanged","notifyDataSetInvalidate","getItemViewType","getItemTypeCount"};
- for (String item:items)
- mList.add(item);
- mAdapter.notifyDataSetChanged();
- }
- }
- };
ListView滑动到底部时,感觉怎么滑都还有数据,每次滑动底部都会添加新的内容同时刷新ListView,感觉就像一个无穷无尽的新闻列表;当我们的数据没有新添加时,调用notifyDataSetInvalidate方法,在做新闻列表时,在多个Fragment来回切换时,新闻列表中的数据未发生改变,这时候如果还调用notifyDataSetChanged方法,会出现一片空白,解决的办法调用notifyDataSetInvalidate方法或者将mAdapter赋值为null
getViewTypeCount()方法设置items视图需要初始化布局的总数,getItemViewType(int)返回指定位置的item视图
- public View getView(int position, View convertView, ViewGroup parent){
- int viewType=getItemViewType(position);
- switch (viewType){
- case firstViewType:
- if(convertView==null){
- convertView= LayoutInflater.from(ListViewActivity.this).inflate(R.layout.list_item_text,parent,false);
- }
- TextView textView=(TextView)convertView.findViewById(R.id.text);
- textView.setText(mList.get(position));
- break;
- case secondViewType:
- if(convertView==null){
- convertView= LayoutInflater.from(ListViewActivity.this).inflate(R.layout.list_item_text_img,parent,false);
- }
- textView=(TextView)convertView.findViewById(R.id.text);
- textView.setText(mList.get(position));
- break;
- }
- return convertView;
- }
- private int viewTypeCount=2;//设置视图布局总数
- private static final int firstViewType=0;//参数必须从0开始,否则报异常:java.lang.ArrayIndexOutOfBoundsException: length=2; index=2
- private static final int secondViewType=1;
- @Override
- public int getViewTypeCount() {
- return viewTypeCount;
- }
- @Override
- public int getItemViewType(int position) {
- int p=position%5;
- if(p!=0){
- return firstViewType;
- }
- return secondViewType;
- }
其他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),调用当方法解除已注册的监视器
你可能感兴趣的文章
转载请注明出处: https://www.teachcourse.cn/1787.html ,谢谢支持!