第一部分:基本适配器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的全部记录以及全部代码,当然了这些
只是冰山的一角,若想吃透还得继续努力才行啊!