Android列表类视图之基本适配器BaseAdapter
说到列表视图,不难联想到前面提到过的数组适配器,但是数组适配器只能搭建文本选择项,扩展能力并不强,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) { } }