BaseAdapter练习总结

                        第一部分:基本适配器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"?>

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@color/white"
    android:orientation="horizontal">


        <!-- 这是用来显示行星图片的图像视图 -->
        <ImageView
            android:id="@+id/iv_icon"
            android:layout_width="0dp"
            android:layout_height="80dp"
            android:layout_weight="1"
            android:scaleType="fitCenter"/>


        <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="@color/black"
                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="@color/black"
                android:textSize="13sp"/>
        </LinearLayout>
</LinearLayout>

 

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<Planet_Train> planetTrainArrayList;//行星的数据列表集合


    /**
     * 适配器的构造函数,用于接收上下文以及数据列表集合
     * @param context
     * @param list
     */
    public SpinnerTrainAdapter(Context context,ArrayList<Planet_Train> 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<Planet_Train> getDefaultList(){
        ArrayList<Planet_Train> planet_trains = new ArrayList<Planet_Train>();
        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<planetImages.length;i++){
            Planet_Train planet = new Planet_Train();
            planet.planetImage = planetImages[i];
            planet.planetName = planetNames[i];
            planet.planetInfo = planrtInfos[i];
            planet_trains.add(planet);
        }
        return planet_trains;
    }

    public int getPlanetImage() {
        return planetImage;
    }

    public void setPlanetImage(int planetImage) {
        this.planetImage = planetImage;
    }

    public String getPlanetName() {
        return planetName;
    }

    public void setPlanetName(String planetName) {
        this.planetName = planetName;
    }

    public String getPlanetInfo() {
        return planetInfo;
    }

    public void setPlanetInfo(String planetInfo) {
        this.planetInfo = planetInfo;
    }
}

 

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<Planet_Train> 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"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".train_2019_8_10.TrainSpinnerAdapterActivity">

    <Spinner
        android:id="@+id/TrainSpinner"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"></Spinner>

</LinearLayout>

 

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值