第一部分:基本适配器BaseAdapter

1.BaseAdapter基本介绍

基于ArrayAdapter以及SimpleAdapter的不易扩展等诸多因素(此部分详情请查看ArrayAdapter以及SimpleAdapter的使用),Android提供了一种适应性更强的基本适配器BaseAdapter,该适配器允许开发者在别的代码文件中进行逻辑处理,大大提高了代码的可读性以及可维护性。

 

从BaseAdapter派生的数据适配器主要实现下面三个方法:

<1> 构造函数:指定适配器需要处理的数据集合。

<2> getCount:获取数据项的个数。

<3> getView:获取每项的展示视图,并对每项的业务控件进行业务处理。

2.BaseAdapter基本用法

下面以Spinner控件为载体,介绍BaseAdapter的基本编码步骤:

步骤1 编写列表项的布局文件:

步骤2 写一个新的适配器继承BaseAdapter,实现对列表项的获取与操作:

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

 

3.BaseAdapter代码应用实例

开发工具:Android Studio 3.2(下图为Android Studio中Help版本信息,查看方式为:Help——》About)

我的实例代码文件分布:(见下图红色方框内)

实例所用控件:Spinner

创建的item布局:item_spinner.xml

创建的Adapter类:SpinnerTrainAdapter.java(创建的时候只需要执行一般的java类创建就可以了,之后该类继承BaseAdaprter重写对应的方法,该类便成为了你自定义的一个Adapter(适配器)了),至于上图中的Plant_Train.java该类的主要是作为数据集合中的元素类型而创建的,这个类创不创建与怎么创建都得具体情况具体对待。

创建的Activity:TrainSpinnerAdapterActivity.java

代码:

item_Spinner.xml

<?xml version="1.0" encoding="utf-8"?>                                                                                

 

SpinnerTrainAdapter.java

package com.test.mylistviewproject.train_2019_8_10.adapter;import android.content.Context;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.BaseAdapter;import android.widget.ImageView;import android.widget.TextView;import com.test.mylistviewproject.R;import com.test.mylistviewproject.train_2019_8_10.classfolder.Planet_Train;import java.util.ArrayList;public class SpinnerTrainAdapter extends BaseAdapter {    private Context mContext; //用来接收上下文的数据,即接收由界面Activity传过来的相关信息    private ArrayList planetTrainArrayList;//行星的数据列表集合    /**     * 适配器的构造函数,用于接收上下文以及数据列表集合     * @param context     * @param list     */    public SpinnerTrainAdapter(Context context,ArrayList list){        this.mContext = context;//传入的上下文        this.planetTrainArrayList = list;//传入的对应的数据队列集合    }    /**     * 用于获取列表项的数量     * @return     */    @Override    public int getCount() {        return planetTrainArrayList.size();    }    /**     * 用于获取指定位置的列表项     * @param i     * @return     */    @Override    public Object getItem(int i) {        return planetTrainArrayList.get(i);    }    /**     * 获取指定的列表项的序号     * @param i     * @return     */    @Override    public long getItemId(int i) {        return i;    }    /**     * 获取指定位置的列表项视图     * @param position     * @param view     * @param viewGroup     * @return     */    @Override    public View getView(int position, View view, ViewGroup viewGroup) {        ViewHolder viewHolder;//声明一个视图持有者对象        if(view == null) { //转换视图资源为空的情况            viewHolder = new ViewHolder();//创建一个视图持有者对象            //将布局item_spinner.xml转化为转换视图资源            view = LayoutInflater.from(mContext).inflate(R.layout.item_spinner,null);            viewHolder.iv_icon = view.findViewById(R.id.iv_icon);            viewHolder.tv_name = view.findViewById(R.id.tv_name);            viewHolder.tv_desc = view.findViewById(R.id.tv_desc);            //将持有者设置进转换视图资源中            view.setTag(viewHolder);        }else{//转换视图资源不为空            //获取视图持有者            viewHolder = (ViewHolder) view.getTag();        }        viewHolder.iv_icon.setImageResource(planetTrainArrayList.get(position).getPlanetImage());//显示行星图片        viewHolder.tv_name.setText(planetTrainArrayList.get(position).getPlanetName()); //显示行星名称        viewHolder.tv_desc.setText(planetTrainArrayList.get(position).getPlanetInfo()); //显示行星信息        return view;    }    /**     * 定义一个视图持有者,以便重用列表项的视图资源     */    public final class ViewHolder{        private ImageView iv_icon; //声明行星图片的图像视图对象        private TextView tv_name; //声明行星名称的文本视图对象        private TextView tv_desc; //声明行星信息的文本视图对象    }}

 

Plant_Train.java

package com.test.mylistviewproject.train_2019_8_10.classfolder;import com.test.mylistviewproject.R;import java.util.ArrayList;public class Planet_Train {    private int planetImage;    private String planetName;    private String planetInfo;    public static ArrayList getDefaultList(){        ArrayList planet_trains = new ArrayList();        int[] planetImages = {R.drawable.mercury,R.drawable.venus,R.drawable.earth,R.drawable.mars,R.drawable.jupiter,R.drawable.saturn};        String[] planetNames = {"水星","金星","地球","火星","木星","土星"};        String[] planrtInfos = {                "水星是太阳系八大行星最内侧也是最小的一颗行星,也是离太阳最近的行星",                "金星是太阳系中八大行星之一,按离太阳由近及远的次序,是第二颗,距离太阳0.725天文单位",                "地球是太阳系八大行星之一,按离太阳由近及远的次序排为第三颗,也是太阳系中直径、质量和密度最大的类地行星,距离太阳1.5亿公里。",                "火星是太阳系八大行星之一,是太阳系由内往外数的第四颗行星,属于类地行星,直径约为地球的53%,质量为地球的14%。",                "木星是太阳系八大行星中体积最大、自转最快的行星,从内向外的第五颗行星。",                "土星是太阳系八大行星之一,距日距离(由近到远)第6位。"        };        for(int i=0;i

 

TrainSpinnerAdapterActivity.java

package com.test.mylistviewproject.train_2019_8_10;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.view.View;import android.widget.AdapterView;import android.widget.Spinner;import android.widget.Toast;import com.test.mylistviewproject.R;import com.test.mylistviewproject.train_2019_8_10.adapter.SpinnerTrainAdapter;import com.test.mylistviewproject.train_2019_8_10.classfolder.Planet_Train;import java.util.ArrayList;public class TrainSpinnerAdapterActivity extends AppCompatActivity {    private ArrayList list; //声明一个行星列表集合    private Spinner TrainSpinner;//声明一个下拉框控件    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_train_spinner_adapter);        initPlantSpinner();    }    /**     * 初始化行星列表     */    public void initPlantSpinner() {        //获取界面中的Spinner控件        TrainSpinner = findViewById(R.id.TrainSpinner);        //获取默认的行星列表内容        list = Planet_Train.getDefaultList();        //创建一个行星适配器        SpinnerTrainAdapter adapter = new SpinnerTrainAdapter(TrainSpinnerAdapterActivity.this,list);        //设置下拉框的标题        //TrainSpinner.setPrompt("请选择行星:");        //给下拉框添加适配器        TrainSpinner.setAdapter(adapter);        //默认选择为第一项        TrainSpinner.setSelection(0);        //给Spinner设置选择监听器,当你选择行星的时候便会触发选择事件,执行onItemSelected方法        TrainSpinner.setOnItemSelectedListener(new MyTrainListener());    }    /**     * 定义一个选择监听器,它实现了接口OnItemSelectedListener     */    private class MyTrainListener implements AdapterView.OnItemSelectedListener {        /**         * 选择事件的处理方法,其中i表示选择项的序号         * @param adapterView         * @param view         * @param i         * @param l         */        @Override        public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {            Toast.makeText(TrainSpinnerAdapterActivity.this, "你选择的行星是:"+list.get(i).getPlanetName(), Toast.LENGTH_SHORT).show();        }        /**         * 未选择时候的处理方法,通常无需关注         * @param adapterView         */        @Override        public void onNothingSelected(AdapterView<?> adapterView) {        }    }}

 

activity_train_spinner_adapter.xml

<?xml version="1.0" encoding="utf-8"?>    

 

好了以上就是我目前为止练习的关于BaseAdapter的全部记录以及全部代码,当然了这些

只是冰山的一角,若想吃透还得继续努力才行啊!

更多相关文章

  1. android中的三种适配器
  2. Android(安卓)UI设计——AutoCompleteTextView
  3. Android视图加载流程(3)之ViewRootImpl的UI刷新机制
  4. Android(安卓)ListView改变数据源
  5. Android复杂自定义Listview实现
  6. 【攻克Android(安卓)(43)】WebView (网络视图)
  7. SwitchLayout安卓最佳切换动画
  8. Android(安卓)CoordinatorLayout+AppBarLayout实现toolbar背景渐
  9. vlayout使用说明(二)

随机推荐

  1. Android java.io.IOException异常情况整
  2. Android 中LayoutInflater(布局加载器)之源
  3. Android入门篇三:使用静态变量在Activity
  4. 仿苹果音量调节柱
  5. Android(安卓)开机优化
  6. Android 笔记 01
  7. Android 系统用户态启动过程
  8. Android Relative Layout 安卓相对布局详
  9. JDK与adb/android环境变量配置完整教程
  10. android——退出程序的功能,关闭所有本程