android 适配器 BaseAdapter 的学习
昨天晚上看了下ArrayAdapter,和SimpleAdapter,今天早上起来看完了球赛,又继续要开始学习了,适配器除了前面的两种,还有一种常用的就是BaseAdapter,他是一个抽象类。事实上通过源码可以看到,ArayAadapter和SimpleAdapter 都是继承自BaseAdapter的,前面两种大多数只是对信息的显示,Simple能够对复杂的信息进行显示,而如果需要用到响应,就只能自定义适配器了。所以同样我们可以继承BaseAdapter来实现自定义适配器
一,实现自定义的MyAdapter
当继承自BaseAdapter之后,编译器会自动提示需要该类需要实现的方法,getCount(),getItem(),getItemId(),getView().只需要重载这些抽象方法,实现功能即可。下面是一个小demo ,用来绑定一个TextView 和一个Buttton。前三个重载函数都好理解,重点getView。第一个参数position应该是视图的索引,第二个参数刚开始不是很清楚,但是按照字面意思是转变view,看了下网上的大神教程。是将一个自定义layout转变成view,其中用到了LayoutInflater 这样一个类。实在看不懂继续百度,如下:
在实际开发中LayoutInflater这个类还是非常有用的,它的作用类似于findViewById()。不同点是LayoutInflater是用来找res/layout/下的xml布局文件,并且实例化;而findViewById()是找xml布局文件下的具体widget控件(如Button、TextView等)。
具体作用:
1、对于一个没有被载入或者想要动态载入的界面,都需要使用LayoutInflater.inflate()来载入;
2、对于一个已经载入的界面,就可以使用Activiyt.findViewById()方法来获得其中的界面元素。
这样的话,那就简单多了,只需要拿到view 取到控件,然后给控件设置值即可。
还有一点看的不是很明白,就是在获取view 的时候,先去判断convertView是否为null,如果为null那么就创建view。
首先去判断convertView是否为null,当其为null的时候,才去重新创建一个view,不是的话,就直接用convertView。那么这个convertView是什么东西呢?其实它就是刚刚离开屏幕的那个View,所以我们可以复用它,这样我们就可以极大极大地减少这个view的创建。
这一点,可以说极大地优化了这个listView的性能,尤其是我们在加载图片这种很耗内存的资源的时候,这个效果更加明显。 不过这还不够,因为获得这个view之后,每次还需要通过 view.findViewById 来获得view里面的控件,findViewById的成本也是非常之高的,那么有什么办法呢? 一般来说,就是ViewHolder的应用了。
我们可以在从view中获得的这几个控件放到一个viewHolder的对象中,并将其设置给view的Tag属性,这样下一次再重复利用这个view的时候,就不必再通过findViewById来获得控件 ,而是可以直接通过viewHolder来获得对应的控件。
同时也给button添加相应函数
public class MyAdapter extends BaseAdapter{
private Context context;
private List<String> list;
private LayoutInflater mInflater;
public MyAdapter(Context context,List<String> list){ this.mInflater = LayoutInflater.from(context);
this.context = context;
this.list = list;
}
@Override
public int getCount() {
return list.size();
} @Override
public Object getItem(int position) {
return list.get(position);
} @Override
public long getItemId(int position) {
return position;
} @Override
public View getView(int position, View convertView, ViewGroup parent) { TextView textView=null;
Button btn=null;
ViewHold viewHold =null;
if(convertView==null){ viewHold = new ViewHold();
convertView = mInflater.inflate(R.layout.baseitemlayout,null);
viewHold.textView = (TextView)convertView.findViewById(R.id.textView3);
viewHold.btn = (Button)convertView.findViewById(R.id.button3);
convertView.setTag(viewHold);
}
else{
viewHold =(ViewHold) convertView.getTag();
}
viewHold.textView.setText(list.get(position));
viewHold.btn.setText("按钮");
viewHold.btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(context,"按钮",Toast.LENGTH_LONG).show();
}
});
return convertView;
}
public class ViewHold{
public TextView textView;
public Button btn;
}
}自定义的baseitemlayout.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:layout_weight="1"> <TextView
android:layout_weight="0.6"
android:layout_width="0dp"
android:layout_height="30dp"
android:text="New Text"
android:id="@+id/textView3" /> <Button
android:focusable="false"
android:layout_weight="0.4"
android:layout_width="0dp"
android:layout_height="50dp"
android:text="New Button"
android:id="@+id/button3" />
</LinearLayout>
二 创建activity
public class BaseAdapterActivity extends Activity { private MyAdapter adapter;
private List<String> list;
private ListView listView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_base_adapter);
listView = (ListView)findViewById(R.id.listView4);
list = new ArrayList<String>();
adapter = new MyAdapter(this,getData());
listView.setAdapter(adapter);
}
List<String> getData(){
list.add("第一行");
list.add("第二行");
list.add("第三行");
list.add("第四行");
return list;
}
}
上面的代码实现可能会出现 button 虽然可以点击,也会有响应事件,但是listview 不能点击了,这个还需要添加两行代码,并且添加listview响应函数
在<RelativeLayout>中
android:descendantFocusability="blocksDescendants"
和<Button>中
android:focusable="false"
为了弄明白,网上资料查了好多,不过还好总算是实现了。
android 适配器 BaseAdapter 的学习的更多相关文章
- Android适配器Adapter的学习
Android中有很多的适配器,首先看看这些适配器的继承结构 这些适配器中,BaseAdapter用的最多,也用的最熟,先放过他,从ArrayAdapter开始 一个listAdapter用来管理一个 ...
- android中的万能适配器BaseAdapter的总结
有时候,列表不光会用来做显示用,我们同样可以在在上面添加按钮.添加按钮首先要写一个有按钮的xml文件,然后自然会想到用上面的方法定义一个适配器,然后将数据映射到布局文件上.但是事实并非这样,因为按钮是 ...
- Android(java)学习笔记154:使用GridView以及重写BaseAdapter
1.BaseAdapter: 对于ListView.GridView.Gallery.Spinner等等,它是它们的适配器,直接继承自接口类Adapter的,使用BaseAdapter时需要重写很多方 ...
- Android(java)学习笔记133:ListViewProject案例(ListView + BaseAdapter + CheckBox)
这个案例可能稍微复杂一点,我会讲述详细一点: 1.首先是AndroidManifest.xml: <?xml version="1.0" encoding="utf ...
- android 适配器simpleadapter和baseadapter区别
android 适配器 simpleadapter 和 baseadapter 设计网络程序或者数据处理显示程序的时候,常常会使用 simpleadapter 和baseadapter 来实现. ad ...
- android 适配器 ArrayAdapter,SimpleAdapter的学习
今天认真看了下android适配器,学习了下它的使用方法. 一,ArrayAdapter ArrayAdapter 比较简单,只可以存放一行文本信息.下面是简单的实现 private ListView ...
- Android必学之数据适配器BaseAdapter
什么是数据适配器? 下图展示了数据源.适配器.ListView等数据展示控件之间的关系.我们知道,数据源是各种各样的,而ListView所展示数据的格式则是有一定的要求的.数据适配器正是建立了数据源与 ...
- Android(java)学习笔记97:使用GridView以及重写BaseAdapter
1. BaseAdapter: 对于ListView.GridView.Gallery.Spinner等等,它是它们的适配器,直接继承自接口类Adapter的,使用BaseAdapter时需要重写很多 ...
- Android(java)学习笔记75:ListViewProject案例(ListView + BaseAdapter + CheckBox)
这个案例可能稍微复杂一点,我会讲述详细一点: 1. 首先是AndroidManifest.xml: <?xml version="1.0" encoding="ut ...
随机推荐
- 定制Android开发者专属T恤
之前在T社上买了一件定制的T恤,感觉质量挺不错的,那是段子张发起的众筹.正面有hello google这几个字母. 我自己本身是一个Android粉,从nexus手机到pixel手机,坚持买原生的操作 ...
- 2017寒假零基础学习Python系列之函数之 递归函数
什么是递归函数? 在函数内部,也可以继续调用其他函数,如果一个函数在内部调用本身,这个函数为递归函数举一个求n的阶乘的例子: def fact(n): if n == 1: return 1; els ...
- peoplesoft function PSTREENODE 通过 deptid 获得部门树 全路径 名称
create or replace function getUnitFullName(deptid in varchar) return varchar2 is r ); c int; n ); m ...
- 网络流入门—用于最大流的Dinic算法
"网络流博大精深"-sideman语 一个基本的网络流问题 最早知道网络流的内容便是最大流问题,最大流问题很好理解: 解释一定要通俗! 如右图所示,有一个管道系统,节点{1,2,3 ...
- jquery.load问题
简单Jquery--Ajax应用 作为一个新手,最近自己写了一个人主页,虽然性能不怎么样,但就出现的各种大的小的问题拿出来与大家分享分享. ----DanlV 描述 错误描述 自己不知道什么原因,直接 ...
- PKM你的知识需要管理
有一段时间没有更新技术博客了~,大脑中总感觉有点东西要写,却不知道从哪里开始写~至少写点东西,也算是一个阶段的成长 学习(充电过程).工作(知识变现过程)不是简单重复,永远都是最值得去反思.玩味的事儿 ...
- jsp实现上一页下一页翻页功能
前段时间一直忙于期末考试和找实习,好久没写博客了. 这段时间做了个小项目,包含了翻页和富文本编辑器Ueditor的两个知识点,Ueditor玩的还不是很深,打算玩深后再写篇博客. 要实现翻页功能,只需 ...
- PHP----SAPI
SAPI:Server Application Programming Interface 服务器端应用编程端口.它就是PHP与其它应用交互的接口,PHP脚本要执行有很多种方式,通过Web服务器,或者 ...
- 真实记录我入门学习Linux系统的经历
我本身来说并不是计算机专业的学生,因此今天来谈及这个话题,对大家来说,有了更多的客观公正性.对我而言,linux给我最大的财富,并不是编程能力提高了多少,而是视野的开阔.心态的转变和自学能力的提高.我 ...
- Window下Jenkins的安装
之前没接触过持续集成工具,之前只是了解了下自动化部署,最近一直在看自动化集成这块,发现要学的东西好多好多,可能在小公司用的不多,但如果在大公司,如果每个项目都要手动build.deploy的话那也太耗 ...