zoukankan      html  css  js  c++  java
  • 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) {
    
            }
        }
  • 相关阅读:
    SQL SERVER 2012 第三章 使用INSERT语句添加数据
    SQL SERVER 2012 第三章 T-SQL 基本语句 having子句
    T4 模板生产 多文件
    RAC+DG修改sys密码
    数据泵导入,报错:ORA-12899: value too large for column "SCOTT"."TEST112"."JOIN" (actual: 9, maximum: 8)
    grep过滤空行和注释行
    char与varchar2字符类型的区别
    Oracle不知道用户密码情况下,如何在不更改密码的前提下解锁用户或者延期密码有效期
    数据泵导出报错ORA-31693 ORA-02354 ORA-01466
    安装ogg软件报错:[INS-75012]Sofware Location specified is already an existing Oracle
  • 原文地址:https://www.cnblogs.com/zdm-code/p/12222278.html
Copyright © 2011-2022 走看看