说到列表视图,不难联想到前面提到过的数组适配器,但是数组适配器只能搭建文本选择项,扩展能力并不强,Android提供了一种适应性更强的基本适配器BaseAdapter,该适配器允许开发者在别的代码中进行逻辑处理,下面以Spinner为载体,演示如何使用BaseAdapter,具体分为以下三步:

(1)编写列表项的布局文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"> <!--这是显示行星图片的图像视图 -->
<ImageView
android:id="@+id/iv_icon"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"/> <LinearLayout
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="3"
android:orientation="vertical"> <!--这是显示行星名称的文本视图 -->
<TextView
android:id="@+id/tv_name"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:gravity="left|center"
android:textColor="#000"
android:textSize="20sp"
/>
<!--这是显示行星描述的文本视图 -->
<TextView
android:id="@+id/tv_desc"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="2"
android:gravity="left|center"
android:textColor="#000"
android:textSize="13sp"/> </LinearLayout>
</LinearLayout>

(2)写个新的适配器继承BaseAdapter,实现对列表项视图的获取和操作

public class PlanetListArrayAdapter extends BaseAdapter {

    private Context mContext;//声明一个上下文对象
private ArrayList<Planet> mPlanetList; //声明一个行星信息队列 //行星适配器的构造函数,传入上下文与行星队列
public PlanetListArrayAdapter(Context context,ArrayList<Planet> planet_list){
mContext=context;
mPlanetList=planet_list;
} //获取列表项的个数
@Override
public int getCount() {
return mPlanetList.size();
} //获取列表项数据
@Override
public Object getItem(int i) {
return mPlanetList.get(i);
} //获取列表项编号
@Override
public long getItemId(int i) {
return i;
} //获取指定位置的列表项视图
@Override
public View getView(int i, View view, ViewGroup viewGroup) {
ViewHolder holder;
if(view==null){//转换视图为空
holder=new ViewHolder();
//根据布局文件item_list.xml生成转换视图对象
view= LayoutInflater.from(mContext).inflate(R.layout.item_list, null);
holder.iv_icon= (ImageView) view.findViewById(R.id.iv_icon);
holder.tv_name= (TextView) view.findViewById(R.id.tv_name);
holder.tv_desc= (TextView) view.findViewById(R.id.tv_desc);
//将视图持有者保存到转换视图中
view.setTag(holder);
}else{//转换视图非空
//从转换视图中获取之前保存的视图持有者
holder=(ViewHolder)view.getTag();
}
Planet planet=mPlanetList.get(i);
holder.iv_icon.setImageResource(planet.image);//显示行星的图片
holder.tv_name.setText(planet.name);//显示行星的名称
holder.tv_desc.setText(planet.desc);//显示行星的描述
return view;
} public class ViewHolder{
public ImageView iv_icon;
public TextView tv_name;
public TextView tv_desc;
}
}

(3)在页面代码中构造该适配器,并应用于Spinner对象

private ArrayList<Planet> planetList;//声明一个行星队列

    //初始化行星列表的下拉框
private void initPlanetSpinner(){
//获取默认的行星队列,即水金地火木土
planetList=Planet.getDefaultList();
//构建一个行星列表的适配器
PlanetListArrayAdapter adapter=new PlanetListArrayAdapter(this,planetList);
//从布局文件中获取名叫sp_planet的下拉框
Spinner sp=findViewById(R.id.sp_planet);
//设置下拉框的标题
sp.setPrompt("请选择行星");
//设置下拉框的列表适配器
sp.setAdapter(adapter);
//设置下拉框默认显示第一项
sp.setSelection(0);
//给下拉框设置选择监听器,一旦用户选中某一项,就触发onItemSelected方法
sp.setOnItemClickListener(new MySelectedListener);
} private class MySelectedListener implements AdapterView.OnItemSelectedListener{ //选择时间的处理方法,其中i代表选择项的序号
@Override
public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {
Toast.makeText(MainActivity.this,"您选择的是:"+planetList.get(i).name,Toast.LENGTH_LONG).show();
} //未选择的事件处理方法,通常无需关注
@Override
public void onNothingSelected(AdapterView<?> adapterView) { }
}

Android列表类视图之基本适配器BaseAdapter的更多相关文章

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

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

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

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

  3. Android开发 ListView(垂直滚动列表项视图)的简单使用

    效果图: 使用方法: 1.在布局文件中加入ListView控件: <?xml version="1.0" encoding="utf-8"?> &l ...

  4. Android列表视图(List View)

    Android列表视图(ListView) ListView是一个显示滚动项列表的示视图组(viewgroup),通过使用适配器(Adapter)把这些列表项自动插入到列表中.适配器比如从一个数组或是 ...

  5. Android开发工程师文集-Fragment,适配器,轮播图,ScrollView,Gallery 图片浏览器,Android常用布局样式

    Android开发工程师文集-Fragment,适配器,轮播图,ScrollView,Gallery 图片浏览器,Android常用布局样式 Fragment FragmentManager frag ...

  6. 【Android自学日记】两种适配器的使用

    ArrayAdapter适配器: (1)用于显示基本的文字内容 (2)基本使用过程:新建适配器---创建或加载数据源---适配器加载数据源---视图加载适配器 ArrayAdapter(上下文,当前L ...

  7. Android——列表选择框(Spinner)

    通常情况下,如果列表选择框中要显示的列表项是可知的,那么可以将其保存在数组资源文件中,然后通过数组资源来为列表选择框指定列表项.这样就可以在不编写Java代码的情况下实现一个下拉选择框. 1.在布局文 ...

  8. Android列表控件ListView详解

    ListView绝对可以称得上是Android中最常用的控件之一,几乎所有应用程序都会用到它. 由于手机屏幕空间都比较有限,能够一次性在屏幕上显示的内容并不多,当我们的程序中有大量的数据需要展示的时候 ...

  9. Android常用控件之GridView使用BaseAdapter

    我们可以为GridView添加自定义的Adapter,首先看下用自定义Adapter的显示效果 在布局文件main.xml文件中定义一个GridView控件 <RelativeLayout xm ...

随机推荐

  1. HDU_1222_GCD

    http://acm.hdu.edu.cn/showproblem.php?pid=1222 直接用GCD就可以了,gcd大于1表明每次一周后偏移量为0. #include<iostream&g ...

  2. 全局new和宏结合起来的一个小应用

    #include <iostream> using namespace std; void* operator new(size_t size, const char* file, int ...

  3. Apache-Tomcat-Ajp漏洞(CVE-2020-1938)漏洞复现

    前言 Apache Tomcat会开启AJP连接器,方便与其他Web服务器通过AJP协议进行交互.由于Tomcat本身也内含了HTTP服务器,因此也可以视作单独的Web服务器.此漏洞为文件包含漏洞,攻 ...

  4. 【大白话系统】MySQL 学习总结 之 缓冲池(Buffer Pool) 如何支撑高并发和动态调整

    如果大家对我的 [大白话系列]MySQL 学习总结系列 感兴趣的话,可以点击关注一波. 一.上节回顾 在上节< 缓冲池(Buffer Pool) 的设计原理和管理机制>中,介绍了缓冲池整体 ...

  5. Eclipse 无法引用到Maven 解决方法

    问题描述:打开Eclipse进入java EE视图下,发现原有的Maven Dependencies目录不存在,显示的是org.maven.ide.eclipse.MAVEN2_CLASSPATH_C ...

  6. 使用Git和Svn

    一. 使用SVN 1. 下载tortoiseSVN 2. 右键SVN checkout(下载项目到本地) 3. 更新和提交 二. 使用GIT 1. 下载git 2. 下载tortoiseGit 3. ...

  7. Vue与React的区别

    对已经了解的内容,做几点介绍,并不全面,后期会不断更新~ React与Vue都是组件化的开发框架,整体功能类似. 一.数据处理模式(单项 or 双向): React推崇单项数据流的处理模式,数据不可以 ...

  8. 自动化测试中,cookie的调用方法。

    以cookie为例 方法一: 将返回的cookie写到setUp()中,每次执行用例之前就会调用一次. 如: class AA(unittest.TestCase): def setUp(self): ...

  9. Arm开发板+Qt学习之路

    从2015.11.13日开始接触arm开发板,开始学习Qt,到现在已经四个月零17天了,从一个拿到开发板一无所知的小白,到现在能够在开发板上进行开发,有付出有收获. 之前一直没有时间将这个过程中的一些 ...

  10. android手机拍照旋转的问题

    android开发中,遇到过手机拍照,明明是竖着拍的,显示的结果却是横这的,困扰了很久,找了很久找了一种解决方法: ExifInterface exifInterface = new ExifInte ...