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"?>
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的全部记录以及全部代码,当然了这些
只是冰山的一角,若想吃透还得继续努力才行啊!
更多相关文章
- android中的三种适配器
- Android(安卓)UI设计——AutoCompleteTextView
- Android视图加载流程(3)之ViewRootImpl的UI刷新机制
- Android(安卓)ListView改变数据源
- Android复杂自定义Listview实现
- 【攻克Android(安卓)(43)】WebView (网络视图)
- SwitchLayout安卓最佳切换动画
- Android(安卓)CoordinatorLayout+AppBarLayout实现toolbar背景渐
- vlayout使用说明(二)