昨天晚上看了下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. JAVAEE——SSH项目实战01:SVN介绍、安装和使用方法

    1 学习目标 1.掌握svn服务端.svn客户端.svn eclipse插件安装方法 2.掌握svn的基本使用方法 2 svn介绍 2.1 项目管理中的版本控制问题 通常软件开发由多人协作开发,如果对 ...

  2. 使用JDK自带的MessageDigest计算消息摘要

    使用JDK自带的MessageDigest计算消息摘要 上代码 /** * 使用JDK自带MessageDigest */ public class MessageDigestUtils { /** ...

  3. Student implements java.io.Serializable

    package JBJADV003; public class Student implements java.io.Serializable { private String name; priva ...

  4. FZU 1015 土地划分

        Description 在Dukeswood这块土地上生活着一个富有的农庄主和他的几个孩子.在他临终时,他想把他的土地分给他的孩子.他有许多农场,每个农场都是一块矩形土地.他在农场地图上划上一 ...

  5. 002.Create a web API with ASP.NET Core MVC and Visual Studio for Windows -- 【在windows上用vs与asp.net core mvc 创建一个 web api 程序】

    Create a web API with ASP.NET Core MVC and Visual Studio for Windows 在windows上用vs与asp.net core mvc 创 ...

  6. JS笔记一:动态修改css样式

    ---恢复内容开始--- 最近在学习CSS/JS的样式,两个合学习一起学习,加深JS的书写和了解. 一.通过Javasript修改图片大小 通过函数来传递图片id,height,width,使用doc ...

  7. 【学习笔记】C# 抽象类

    抽象类 有时设计类仅仅为了表达抽象的概念,不与具体的事物相联系,只作为其派生类的基类使用,用来描述所有子类的共同特性,这时我们可以使用抽象类 抽象类不能被实例化,抽象类可以包含抽象方法 抽象方法 抽象 ...

  8. PHP闭包和高阶函数

    <?php function func($a, $b) { $line = function ($x) use ($a, $b) { return $a*$x + $b; }; return $ ...

  9. 【NOIP模拟】table(动态规划)

    题目背景 SOURCE:NOIP2016-RZZ-2 T2 题目描述 给定一个 n×m 的矩阵,行列均从 1 开始标号. 一个矩阵被认为是稳定的,当且仅当对于任意的 2≤i≤n,第 i 行的数的和不小 ...

  10. 处理SFTP服务器上已离职用户,设置为登录禁用状态

    测试用户禁用SQL select Enabled,LoginID from suusers where LoginID = 'yangwl' update suusers set Enabled=1 ...