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) {

        }
    }
posted @ 2020-01-21 16:39  赵代码  阅读(556)  评论(1编辑  收藏  举报