BaseAdapter需实现的四个方法介绍

   Android中的适配器(Adapter)是数据与视图(View)之间的桥梁,用于对要显示的数据进行处理,并通过绑定到组件进行数据的显示。

  BaseAdapter是Android应用程序中经常用到的基础数据适配器的基类,它实现了Adapter接口。其主要用途是将一组数据传到像ListView、Spinner、Gallery及GridView等UI显示组件进行显示。我们经常使用的ListView 的adapter(即SimpleAdapter),是继承自BaseAdapter基类的。BaseAdapter是一个基类,没有实现绑定数据的功能。而SimpleAdapter实现了基本控件的绑定,如TextView,Button,ImageView等。并已经为我们实现好了数据优化工作。

  这些适配器使用相同组件动态绑定数据的方式进行优化。为什么需要优化呢?因为如果我们有上亿个(较多个)项目要显示怎么办?为每个项目创建一个新视图?这不可能,因为内存有限制。实际上Android为你缓存了视图。Android中有个叫做Recycler的构件,下图是他的工作原理:

技术分享

  如果你有10亿个项目(item),其中只有可见的项目存在内存中,其他的在Recycler中。其实我的理解Recyler就是一个队列,用来存储不在屏幕范围内的item,如果item滚出屏幕范围,那么就入队,这里的滚出是完全滚出,即边界等也要完全滚出。如果新的item要滚进来,那么android系统的framework就会查看Recyler是否含有可以重复使用的View,如果有那么就重新设置该View 的数据源,然后显示,即出队。那么这么多的item其实只需要占用一定空间的内存,这个内存大小是多少呢?我的感觉是手机屏幕所包含的item的个数,再加上1,然后乘以每个item占用的内存。但是最后我发现是加上2.可能是为了使得缓存更大吧。。。。但是为什么加上2,大家应该理解,如果你不理解,那你就把滚动list的过程好好想一想。那个队列无非就是一个缓存罢了,因为我们的目的是通过那个缓存来重复使用那些已经创建的View。

       在我们需要定制自己的适配器时(adapter)时我们就需要继承BaseAdapter抽象类,除了必要的构造函数外有几个函数是必须要重载的,它们是:

    public abstract int getCount()

    public abstract Object getItem(int position)   

    public abstract long getItemId(int position)

    public abstract View getView(int position, View convertView, ViewGroup parent)

   四个函数的主要功能:

   1.先来看一下简略流程图(不一定非常精确,但大致流程是这样):


由流程图可以看到getCount()和getView()的作用:

     1.getCount()决定了我们将要绘制的资源数,当然这个数目不能大于资源的总数,不过却可以小于资源的总数。例如我们adapter管理的资源总共有10个,而我们通过getCount()返回的只有6个,那么最终GridView绘制出来的将只有6个。

     2.getView():通过传入的参数position,加工成我们想要的View并返回,最终共GridView使用

     3.getItemId()该方法的返回值决定第position处的列表项的ID,某些方法(如onclicklistener的onclick方法)有id这个参数,而这个id参数就是取决于getItemId()这个返回值的。如:public void onItemClick(AdapterView<?> parent, View view,int position, long id) 

     4.getItem():getItem方法不是在Baseadapter类中被调用的,而是在Adapterview.getItemAtPosition(position) 中被调用的。getItemAtPosition(position) 是在setOnItemClickListener、setOnItemLongClickListener、setOnItemSelectedListener的点击选择处理事件中方便地调用来获取当前行数据的。
 

getItem()和getItemId()有什么用呢?我们知道,GridView将View以方格的方式展示出来之后是要与用户交互的(比如点击某张图片),为了更好的相应用户的动作,我们就要用到这两个函数了。


getView(int position, View convertView, ViewGroup parent)
这个convertView其实就是最关键的部分  原理上讲 当ListView滑动的过程中 会有item被滑出屏幕 而不再被使用 这时候Android会回收这个条目的view 这个view也就是这里的convertView

当item1被移除屏幕的时候 我们会重新new一个View给新显示的item_new 而如果使用了这个convertView 我们其实可以复用它 这样就省去了new View的大量开销

public View getView(int position, View convertView, ViewGroup parent) {
View view = null;
if (convertView != null) {
view = convertView;
//复用了回收的view 只需要直接作内容填充的修改就好了
} else {
view = new Xxx(...);
//没有供复用的view 按一般的做法新建view
}
return view;
}

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
下拉列表通常用于展示一些选项,用户可以通过点击下拉箭头来查看可选项。在Android中,我们可以使用Spinner控件来实现下拉列表,而Spinner控件要使用Adapter来提供数据。其中,BaseAdapter是一个通用的Adapter,可以用来展示任何数据类型。 下面是一个使用BaseAdapter实现下拉列表的例子: 1. 创建一个布局文件,命名为spinner_item.xml,用来展示下拉列表中的每一项。 ```xml <TextView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/text_view" android:layout_width="match_parent" android:layout_height="wrap_content" android:paddingLeft="16dp" android:paddingTop="8dp" android:paddingBottom="8dp" android:textSize="16sp" /> ``` 2. 在Activity中定义一个Spinner控件,并创建一个BaseAdapter。 ```java public class MainActivity extends AppCompatActivity { private Spinner spinner; private String[] items = {"item1", "item2", "item3", "item4", "item5"}; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); spinner = findViewById(R.id.spinner); spinner.setAdapter(new MyAdapter(this, items)); } private class MyAdapter extends BaseAdapter { private Context context; private String[] items; public MyAdapter(Context context, String[] items) { this.context = context; this.items = items; } @Override public int getCount() { return items.length; } @Override public Object getItem(int position) { return items[position]; } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { if (convertView == null) { convertView = LayoutInflater.from(context).inflate(R.layout.spinner_item, parent, false); } TextView textView = convertView.findViewById(R.id.text_view); textView.setText(items[position]); return convertView; } } } ``` 在MyAdapter中,我们重写了BaseAdapter四个方法,分别是getCount()、getItem()、getItemId()和getView()。其中,getCount()返回数据项的数量,getItem()返回指定位置的数据项,getItemId()返回指定位置的数据项的ID,getView()返回一个View,用来展示指定位置的数据项。 在getView()方法中,我们使用LayoutInflater来加载spinner_item布局文件,并将数据项的值设置到TextView中。 3. 运行程序,查看效果。 运行程序后,我们可以看到一个下拉列表,点击下拉箭头后,可以看到可选项。选中某一项后,列表会自动收起来,并将选中的值显示在Spinner控件中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值