昨天晚上看了下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 的学习的更多相关文章

  1. Android适配器Adapter的学习

    Android中有很多的适配器,首先看看这些适配器的继承结构 这些适配器中,BaseAdapter用的最多,也用的最熟,先放过他,从ArrayAdapter开始 一个listAdapter用来管理一个 ...

  2. android中的万能适配器BaseAdapter的总结

    有时候,列表不光会用来做显示用,我们同样可以在在上面添加按钮.添加按钮首先要写一个有按钮的xml文件,然后自然会想到用上面的方法定义一个适配器,然后将数据映射到布局文件上.但是事实并非这样,因为按钮是 ...

  3. Android(java)学习笔记154:使用GridView以及重写BaseAdapter

    1.BaseAdapter: 对于ListView.GridView.Gallery.Spinner等等,它是它们的适配器,直接继承自接口类Adapter的,使用BaseAdapter时需要重写很多方 ...

  4. Android(java)学习笔记133:ListViewProject案例(ListView + BaseAdapter + CheckBox)

    这个案例可能稍微复杂一点,我会讲述详细一点: 1.首先是AndroidManifest.xml: <?xml version="1.0" encoding="utf ...

  5. android 适配器simpleadapter和baseadapter区别

    android 适配器 simpleadapter 和 baseadapter 设计网络程序或者数据处理显示程序的时候,常常会使用 simpleadapter 和baseadapter 来实现. ad ...

  6. android 适配器 ArrayAdapter,SimpleAdapter的学习

    今天认真看了下android适配器,学习了下它的使用方法. 一,ArrayAdapter ArrayAdapter 比较简单,只可以存放一行文本信息.下面是简单的实现 private ListView ...

  7. Android必学之数据适配器BaseAdapter

    什么是数据适配器? 下图展示了数据源.适配器.ListView等数据展示控件之间的关系.我们知道,数据源是各种各样的,而ListView所展示数据的格式则是有一定的要求的.数据适配器正是建立了数据源与 ...

  8. Android(java)学习笔记97:使用GridView以及重写BaseAdapter

    1. BaseAdapter: 对于ListView.GridView.Gallery.Spinner等等,它是它们的适配器,直接继承自接口类Adapter的,使用BaseAdapter时需要重写很多 ...

  9. Android(java)学习笔记75:ListViewProject案例(ListView + BaseAdapter + CheckBox)

    这个案例可能稍微复杂一点,我会讲述详细一点: 1. 首先是AndroidManifest.xml: <?xml version="1.0" encoding="ut ...

随机推荐

  1. 【操作教程】利用YCSB测试巨杉数据库性能

    一.前言 巨杉数据库(SequoiaDB)是国内第一款新一代文档型分布式数据库,巨杉数据库由巨杉软件完全自主研发,拥有完全自主知识产权,不基于任何其它的开源项目.SequoiaDB数据库是为分布式存储 ...

  2. Tomcat常用配置修改

    Tomcat常用配置修改 说明 运行需要设置环境变量 JAVA_HOME 即JDK安装目录 tomcat 默认登录地址 http://localhost:8080 配置tomcat 1.端口设置 打开 ...

  3. iOS中UIWebView执行JS代码(UIWebView)

    iOS中UIWebView执行JS代码(UIWebView) 有时候iOS开发过程中使用 UIWebView 经常需要加载网页,但是网页中有很多明显的标记让人一眼就能看出来是加载的网页,而我们又不想被 ...

  4. 简约的HTML5音乐播放器插件

    从我刚开始接触前端的时候就想写一个能播放音乐的小程序,刚开始写的时候虽然可以放,但是确实很慢,很卡,有很多可以优化的地方.最近在前一个版本的基础上重写了一个音乐播放器的插件,速度还可以吧 因为追求简约 ...

  5. MySQL缓存之Qcache与buffer pool对比

    Q:innodb buffer pool和Qcache的缓存区别? A: 1.Qcacche缓存的是SQL语句及对应的结果集,缓存在内存,最简单的情况是SQL一直不重复,那Qcache的命令率肯定是0 ...

  6. 针对双系统ubuntu16.04卡死及系统没有声音解决方法

    楼主电脑系统状况:win10主系统,128固态为ubuntu系统       安装一共为两次. 第一次出现ubuntu安装成功后没有声音,主系统win10有声音,Ubuntu上检测不到声卡,说明ubu ...

  7. Linux下mysql远程连接问题

    [旧博客转移 - 发布于2015年9月6日 18:42]   在Linux上装好Mysql后 发现远程客户端连接不上 出现这种情况是因为mysql服务器出于安全考虑,默认只允许本地登录数据库服务器. ...

  8. javascript面向对象个人理解

    1. javascript面向对象特性:抽象性,封装性,继承性: 2. js中的对象:键值对的集合:比如说{key:value} 3.抽象性:用一个对象描述一个数据,需要抽取这个对象的核心数据:两个必 ...

  9. 解决win10系统以太网适配器的驱动程序可能出现问题

    插上网线显示未连接-连接可用,连上无线显示未连接-连接不可用,右下角显示感叹号 ,以太网和无线属性显示ipv4未连接详细信息为空,在设备管理器里卸载网卡驱动重装上仍然没有,通过windoes自带的网络 ...

  10. C# 中的 ConfigurationManager类引用方法应用程序配置文件App.config的写法

    c#添加了Configuration;后,竟然找不到 ConfigurationManager 这个类,后来才发现:虽然引用了using System.Configuration;这个包,但是还是不行 ...