1、基本适配器BaseAdapter

Android提供了一种适应性更强的基本适配器BaseAdapter,它允许开发者在别的代码文件中进行逻辑处理。 从BaseAdapter派生的数据适配器主要实现下面5个方法。

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

getCount:获取数据项的个数。

getItem:获取列表项的数据。

getItemId:获取列表项的编号。

getView:获取每项的展示视图,并操纵每项的内部控件。

基本适配器的实现步骤:

(1)编写列表项的布局文件item_list.xml。

(2)写个新的适配器继承BaseAdapter,实现对列表项的管理操作。需要编写适配器的三个方法:

1)创建构造方法,传入列表项需要的数据列表。

1)重写getCount方法,返回列表项的个数。

2)重写getView方法,根据item_list.xml里面的布局,返回指定位置的列表项的视图内容。(3)在页面代码中创建该适配器实例,并交给下拉框设置适配器。

package com.example.chapter05.Bean;import com.example.chapter05.R;import java.util.ArrayList;
import java.util.List;public class Planet {public int image; // 行星图标public String name; // 行星名称public String desc; // 行星描述public Planet(int image, String name, String desc) {this.image = image;this.name = name;this.desc = desc;}private static int[] iconArray = {R.drawable.shuixing, R.drawable.jinxing, R.drawable.diqiu,R.drawable.huoxing, R.drawable.muxing, R.drawable.tuxing};private static String[] nameArray = {"水星", "金星", "地球", "火星", "木星", "土星"};private static String[] descArray = {"水星是太阳系八大行星最内侧也是最小的一颗行星,也是离太阳最近的行星","金星是太阳系八大行星之一,排行第二,距离太阳0.725天文单位","地球是太阳系八大行星之一,排行第三,也是太阳系中直径、质量和密度最大的类地行星,距离太阳1.5亿公里","火星是太阳系八大行星之一,排行第四,属于类地行星,直径约为地球的53%","木星是太阳系八大行星中体积最大、自转最快的行星,排行第五。它的质量为太阳的千分之一,但为太阳系中其它七大行星质量总和的2.5倍","土星为太阳系八大行星之一,排行第六,体积仅次于木星"};public static List<Planet> getDefaultList() {List<Planet> planetList = new ArrayList<Planet>();for (int i = 0; i < iconArray.length; i++) {planetList.add(new Planet(iconArray[i], nameArray[i], descArray[i]));}return planetList;}
}
package com.example.chapter05;import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.Spinner;
import android.widget.Toast;import androidx.appcompat.app.AppCompatActivity;import com.example.chapter05.Adapt.PlanetBaseAdapter;
import com.example.chapter05.Bean.Planet;import java.util.List;public class BaseAdapterActivity extends AppCompatActivity {private List<Planet> planetList; // 声明一个行星列表@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_base_adapter);initPlanetSpinner(); // 初始化行星列表的下拉框}// 初始化行星列表的下拉框private void initPlanetSpinner() {// 获取默认的行星列表,即水星、金星、地球、火星、木星、土星planetList = Planet.getDefaultList();// 构建一个行星列表的适配器PlanetBaseAdapter adapter = new PlanetBaseAdapter(this, planetList);// 从布局文件中获取名叫sp_planet的下拉框Spinner sp_planet = findViewById(R.id.sp_planet);sp_planet.setPrompt("请选择行星"); // 设置下拉框的标题sp_planet.setAdapter(adapter); // 设置下拉框的列表适配器sp_planet.setSelection(0); // 设置下拉框默认显示第一项// 给下拉框设置选择监听器,一旦用户选中某一项,就触发监听器的onItemSelected方法sp_planet.setOnItemSelectedListener(new MySelectedListener());}// 定义一个选择监听器,它实现了接口OnItemSelectedListenerprivate class MySelectedListener implements OnItemSelectedListener {// 选择事件的处理方法,其中arg2代表选择项的序号public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2, long arg3) {Toast.makeText(BaseAdapterActivity.this, "您选择的是" + planetList.get(arg2).name, Toast.LENGTH_LONG).show();}// 未选择时的处理方法,通常无需关注public void onNothingSelected(AdapterView<?> arg0) {}}}
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="horizontal"><!-- 这是显示行星图片的图像视图 --><ImageViewandroid:id="@+id/iv_icon"android:layout_width="0dp"android:layout_height="80dp"android:layout_weight="1"android:scaleType="fitCenter" /><LinearLayoutandroid:layout_width="0dp"android:layout_height="match_parent"android:layout_weight="3"android:layout_marginLeft="5dp"android:orientation="vertical"><!-- 这是显示行星名称的文本视图 --><TextViewandroid: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" /><!-- 这是显示行星描述的文本视图 --><TextViewandroid: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>

QQ录屏20221105164251

2、列表视图ListView

列表视图允许在页面上分行展示相似的数据列表,例如新闻列表、商品列表、书籍列表等,方便用户浏览与操作。 ListView与Spinner在编码上的异同点:

(1)相同点:二者都调用setAdapter方法设置列表项的数据适配器,都可以使用基本适配器。 (2)不同点:Spinner通过setOnItemSelectedListener方法设置列表项的选中监听器;而ListView通过setOnItemClickListener设置列表项的点击监听器,通过setOnItemLongClickListener方法设置列表项的长按监听器。

package com.example.chapter05;import androidx.appcompat.app.AppCompatActivity;import android.annotation.SuppressLint;
import android.graphics.Color;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.ListView;
import android.widget.Toast;import com.example.chapter05.Adapt.PlanetBaseAdapter;
import com.example.chapter05.Bean.Planet;
import com.example.chapter05.util.Utils;import java.util.List;public class ListViewActivity extends AppCompatActivity implements AdapterView.OnItemSelectedListener, CompoundButton.OnCheckedChangeListener {private final static String TAG = "ListViewActivity";private CheckBox ck_divider;private CheckBox ck_selector;private ListView lv_planet; // 声明一个列表视图对象List<Planet> planetList = Planet.getDefaultList();@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_list_view);lv_planet=findViewById(R.id.lv_planet);ck_divider=findViewById(R.id.ck_divider);ck_selector=findViewById(R.id.ck_selector);ck_selector.setOnCheckedChangeListener(this);ck_divider.setOnCheckedChangeListener(this);List<Planet> planetList=Planet.getDefaultList();PlanetBaseAdapter adapter=new PlanetBaseAdapter(this,planetList);lv_planet.setAdapter(adapter);lv_planet.setOnItemSelectedListener(this);}@Overridepublic void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {}@Overridepublic void onNothingSelected(AdapterView<?> adapterView) {}@Overridepublic void onCheckedChanged(CompoundButton compoundButton, boolean b) {refleshListView();}//刷新试图列表@SuppressLint("ResourceType")private void refleshListView(){lv_planet.setCacheColorHint(Color.TRANSPARENT);//防止滚动时列表拉黑if (ck_divider.isChecked()){//显示分割线Drawable drawable=getResources().getDrawable(R.color.purple_200);lv_planet.setDivider(drawable); // 设置列表视图的分隔线lv_planet.setDividerHeight(Utils.dip2px(this, 5)); // 设置列表视图的分隔线高度}else {//不显示分割线lv_planet.setDivider(null); // 设置列表视图的分隔线lv_planet.setDividerHeight(0); // 设置列表视图的分隔线高度}if (ck_selector.isChecked()) { // 显示按压背景lv_planet.setSelector(R.drawable.list_selector); // 设置列表项的按压状态图形} else { // 不显示按压背景//lv_planet.setSelector(null); // 直接设置null会报错,因为运行时报空指针异常// 从资源文件获得图形对象Drawable drawable = getResources().getDrawable(R.color.purple_200);lv_planet.setSelector(drawable); // 设置列表项的按压状态图形}}}
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android"><item android:state_pressed="true" android:drawable="@color/black"/><item android:drawable="@color/purple_700"/>
</selector>
<?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="match_parent"android:orientation="vertical"android:background="@color/white"><LinearLayoutandroid:layout_width="match_parent"android:layout_height="40dp"><CheckBoxandroid:id="@+id/ck_divider"android:layout_width="0dp"android:layout_height="match_parent"android:layout_weight="1"android:gravity="left|center"android:text="显示分隔线"android:textColor="@color/black"android:textSize="17sp" /><CheckBoxandroid:id="@+id/ck_selector"android:layout_width="0dp"android:layout_height="match_parent"android:layout_weight="1"android:gravity="left|center"android:text="显示按压背景"android:textColor="@color/black"android:textSize="17sp" /></LinearLayout><ListViewandroid:id="@+id/lv_planet"android:layout_width="match_parent"android:layout_height="wrap_content"android:divider="@color/black"android:dividerHeight="20dp"android:background="@null"android:listSelector="#880088"/></LinearLayout>

3、网格视图GridView

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"android:padding="5dp"><LinearLayoutandroid:layout_width="match_parent"android:layout_height="40dp"><TextViewandroid:layout_width="wrap_content"android:layout_height="match_parent"android:gravity="center"android:text="拉伸模式:"android:textColor="@color/black"android:textSize="17sp" /><Spinnerandroid:id="@+id/sp_stretch"android:layout_width="0dp"android:layout_height="match_parent"android:layout_weight="1"android:gravity="left|center"android:spinnerMode="dialog" /></LinearLayout><GridViewandroid:id="@+id/gv_planet"android:layout_width="match_parent"android:layout_height="wrap_content"android:background="#00ffff"android:horizontalSpacing="3dp"android:verticalSpacing="3dp"android:numColumns="2"android:stretchMode="columnWidth" /></LinearLayout>
package com.example.chapter05.Adapt;import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Adapter;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;import com.example.chapter05.Bean.Planet;
import com.example.chapter05.R;import java.util.List;public class PlanetGridAdapter extends BaseAdapter implements AdapterView.OnItemClickListener, AdapterView.OnItemLongClickListener{private Context mContext;//上下文对象private List<Planet> mPlanetList;//声明行星信息列表public PlanetGridAdapter(Context mContext, List<Planet> mPlanetList) {this.mContext = mContext;this.mPlanetList = mPlanetList;}@Overridepublic int getCount() {return mPlanetList.size();}@Overridepublic Object getItem(int i) {return mPlanetList.get(i);}@Overridepublic long getItemId(int i) {return i;}@Overridepublic View getView(int i, View view, ViewGroup viewGroup) {ViewHolder viewHolder;if (view==null){viewHolder=new ViewHolder();//构建一个视图持有者//根据布局文件生成转换视图象view= LayoutInflater.from(mContext).inflate(R.layout.item_grid,null);viewHolder.iv_icon=view.findViewById(R.id.iv_icon);viewHolder.tv_desc=view.findViewById(R.id.tv_desc);viewHolder.tv_name=view.findViewById(R.id.tv_name);view.setTag(viewHolder);}else {viewHolder= (ViewHolder) view.getTag();}Planet planet=mPlanetList.get(i);viewHolder.iv_icon.setImageResource(planet.image); // 显示行星的图片viewHolder.tv_name.setText(planet.name); // 显示行星的名称viewHolder.tv_desc.setText(planet.desc); // 显示行星的描述return view;}//定义一个视图持有者public final class ViewHolder {public ImageView iv_icon; // 声明行星图片的图像视图对象public TextView tv_name; // 声明行星名称的文本视图对象public TextView tv_desc; // 声明行星描述的文本视图对象}@Overridepublic void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {String desc = String.format("您点击了第%d个行星,它的名字是%s", i + 1,mPlanetList.get(i).name);Toast.makeText(mContext, desc, Toast.LENGTH_LONG).show();}@Overridepublic boolean onItemLongClick(AdapterView<?> adapterView, View view, int i, long l) {String desc = String.format("您长按了第%d个行星,它的名字是%s", i + 1,mPlanetList.get(i).name);Toast.makeText(mContext, desc, Toast.LENGTH_LONG).show();return true;}
}
package com.example.chapter05;import android.graphics.Color;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.GridView;
import android.widget.Spinner;import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;import com.example.chapter05.Adapt.PlanetGridAdapter;
import com.example.chapter05.Bean.Planet;
import com.example.chapter05.util.Utils;import java.util.List;public class GridViewActivity extends AppCompatActivity {private GridView gv_planet; // 声明一个网格视图对象private Object DivideSelectListener;@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_grid_view);List<Planet> planetList=Planet.getDefaultList();//构建一个行星列表的网格适配器PlanetGridAdapter planetGridAdapter=new PlanetGridAdapter(this,planetList);//从布局视图中获取名叫gv_planet的网格视图gv_planet=findViewById(R.id.gv_planet);gv_planet.setAdapter(planetGridAdapter);//设置网格视图的适配器gv_planet.setOnItemClickListener(planetGridAdapter);gv_planet.setOnItemLongClickListener(planetGridAdapter);gv_planet.setOnItemClickListener(planetGridAdapter);initDividerSpinner();}private String[] dividerArray = {"不显示分隔线","不拉伸(NO_STRETCH)","拉伸列宽(COLUMN_WIDTH)","列间空隙(STRETCH_SPACING)","左右空隙(SPACING_UNIFORM)","使用padding显示全部分隔线"};//初始化拉伸模式的下拉框private void initDividerSpinner(){ArrayAdapter<String> divideAdapter=new ArrayAdapter<String>(this,R.layout.item_select,dividerArray);Spinner sp_stretch=findViewById(R.id.sp_stretch);sp_stretch.setPrompt("设置拉伸模式");//设置下拉框标婷sp_stretch.setSelection(0);sp_stretch.setAdapter(divideAdapter);sp_stretch.setOnItemSelectedListener(new DivideSelectListener());}class  DivideSelectListener implements AdapterView.OnItemSelectedListener{@Overridepublic void onItemSelected(AdapterView<?> adapterView, View view, int arg2, long l) {int dividerPad = Utils.dip2px(GridViewActivity.this, 2); // 定义间隔宽度为2dpgv_planet.setBackgroundColor(Color.CYAN);  // 设置背景颜色gv_planet.setHorizontalSpacing(dividerPad);  // 设置列表项在水平方向的间距gv_planet.setVerticalSpacing(dividerPad);  // 设置列表项在垂直方向的间距gv_planet.setStretchMode(GridView.STRETCH_COLUMN_WIDTH);//是自己拉伸模式gv_planet.setColumnWidth(Utils.dip2px(GridViewActivity.this, 120));//设置每列宽度120dpgv_planet.setPadding(1,1,1,1);//设置网格视图的四周边距if (arg2 == 0) {  // 不显示分隔线gv_planet.setBackgroundColor(Color.WHITE);gv_planet.setHorizontalSpacing(0);gv_planet.setVerticalSpacing(0);} else if (arg2 == 1) {  // 不拉伸(NO_STRETCH)gv_planet.setStretchMode(GridView.NO_STRETCH);} else if (arg2 == 2) {  // 拉伸列宽(COLUMN_WIDTH)gv_planet.setStretchMode(GridView.STRETCH_COLUMN_WIDTH);} else if (arg2 == 3) {  // 列间空隙(STRETCH_SPACING)gv_planet.setStretchMode(GridView.STRETCH_SPACING);} else if (arg2 == 4) {  // 左右空隙(SPACING_UNIFORM)gv_planet.setStretchMode(GridView.STRETCH_SPACING_UNIFORM);} else if (arg2 == 5) {  // 使用padding显示全部分隔线gv_planet.setPadding(dividerPad, dividerPad, dividerPad, dividerPad);}}@Overridepublic void onNothingSelected(AdapterView<?> adapterView) {}}
}

7、android高级控件(2)(列表类视图)相关推荐

  1. android listview高级,Android 高级控件笔记-列表视图ListView 基本适配器BaseAdapter

    我最近做项目用到了基本适配器BaseAdapter,所以写篇博客总结一下,希望也能对你有所帮助 什么时候用BaseAdapter(同一项存在多个控件,复杂的列表时) Android中Adapter类其 ...

  2. Android高级控件(二)——SurfaceView实现GIF动画架包,播放GIF动画,自己实现功能的初体现...

    Android高级控件(二)--SurfaceView实现GIF动画架包,播放GIF动画,自己实现功能的初体现 写这个的原因呢,也是因为项目中用到了gif动画,虽然网上有很多的架包可以实现,不过我们还 ...

  3. Android高级控件(一)——ListView绑定CheckBox实现全选,增加和删除等功能

    Android高级控件(一)--ListView绑定CheckBox实现全选,增加和删除等功能 这个控件还是挺复杂的,也是项目中应该算是比较常用的了,所以写了一个小Demo来讲讲,主要是自定义adap ...

  4. Android 高级控件(七)——RecyclerView的方方面面

    Android 高级控件(七)--RecyclerView的方方面面 RecyclerView出来很长时间了,相信大家都已经比较了解了,这里我把知识梳理一下,其实你把他看成一个升级版的ListView ...

  5. 移动开发技术(Android)——实验5 Android高级控件的应用

    移动开发技术--实验5 Android高级控件的应用 一.实验目的 二.实验内容 1.Spinner.ListView控件与Adapter适配器(一) 2.Spinner.ListView控件与Ada ...

  6. Android高级控件(四)——VideoView 实现引导页播放视频欢迎效果,超级简单却十分的炫酷

    Android高级控件(四)--VideoView 实现引导页播放视频欢迎效果,超级简单却十分的炫酷 是不是感觉QQ空间什么的每次新版本更新那炫炫的引导页就特别的激动,哈哈,其实他实现起来真的很简单很 ...

  7. 《移动项目实践》实验报告——Android高级控件

    实验目的 1.熟悉App开发常用的一些高级控件及相关工具,主要包括日期时间控件的用法.列表类视图及其适配器的用法.翻页类视图及其适配器的用法.碎片及其适配器的用法等: 2.熟悉四大组件之一广播Broa ...

  8. Android高级控件----AdapterView与Adapter详解

    在J2EE中提供过一种非常好的框架--MVC框架,实现原理:数据模型M(Model)存放数据,利用控制器C(Controller)将数据显示在视图V(View)上.在Android中有这样一种高级控件 ...

  9. Android 高级控件ListView用法

    BaseAdapter:是所有适配器类的父类,可以对列表项进行最大限度的定制 1.1 自定义适配器中的方法 getCount getView getItem getItemId 1.2 LayoutI ...

最新文章

  1. 换系统后mysql环境不见了_电脑重装系统后如何恢复Mysql数据库
  2. oracle数据库查看等待,Oracle常见等待事件说明(三)-enqueue/free buffer waits
  3. Xilinx zynq的资料获取总结
  4. 团队项目第一阶段冲刺站立会议08
  5. 4G EPS 中的 Control Plane
  6. python实现中文字符繁体和简体中文转换
  7. 简单线性回归预测实现
  8. python所有算法_Python实现的各种常见分布算法示例
  9. [PowerShell]人人都值得学一点PowerShell实现自动化(1)在VisualStudio上使用PowerShell...
  10. html点击弹出iframe,JavaScript:关于跨iframe弹窗
  11. Spring boot自定义启动字符画(banner)
  12. keepalived安装实录
  13. SSM框架笔记07:初探Spring——采用XML配置文件与注解方式
  14. python提取身份证信息查询_Python+Opencv身份证号码区域提取及识别实现
  15. 从亚马逊云科技“12字战略”,看企业数字化转型的“基座”与“底色”
  16. 关于用数组实现输入字符串以单词为元素反转输出思路
  17. 微信公众号菜单栏链接开发
  18. 写给初中级前端的高级进阶指南
  19. 聆听第18期贡献者荣誉榜发布,体验落地才是王道
  20. 点击图片 实现放大功能

热门文章

  1. 第二学期第一周项目3--该年的第几天?
  2. 百度创意采集工具_百度SEM竞价高级优化进阶篇:让你玩转百度竞价轻松月赚几万元...
  3. 2021保研经历总结|计算机|面经|夏令营 | 预推免 | 浙大、南大、软微、华师、天大、哈工大、北邮
  4. Bit-Z 新年狂欢趴 场外费用全免
  5. 小程序的复制功能实现
  6. jQuery分页小插件使用
  7. 电路分析期中测试——个人题解
  8. 博士申请 | 香港科技大学(广州)白云老师招收智能交通方向全奖博士生/RA
  9. origin 图形复制格式
  10. 一个网页显示歌词的音乐播放器