学习Android的第十六天

这篇具有很好参考价值的文章主要介绍了学习Android的第十六天。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

Android 自定义 Adapter

Adapter 接口

SpinnerAdapter

ListAdapter

BaseAdapter

自定义 BaseAdapter

参考文档

Android ListView 列表控件

ListView 的属性和方法

表头表尾分割线的设置

列表从底部开始显示 android:stackFromBottom

设置点击颜色 cacheColorHint

隐藏滑动条


Android 自定义 Adapter

在上一篇文章中我们知道了啥是 Adapter,也知道了 Adapter 的家族体系,也用过了几个Adapter。

本篇文章,我们就来自己实现一个 Adapter。

要实现自定义的 Adapter,通常继承自 BaseAdapter 类,并重写其中的方法来适配你的数据源。

首先,我们要做的就是要了解我们到底要重写哪些方法,因为 BaseAdapter 实现了 ListAdapter 和 SpinnerAdapter 接口,而这两个接口又继承自 Adapter

Adapter 接口

打开 Adapter API 文档,我们可以看到它有以下几个方法要实现

这些方法的说明如下:

  • int getCount(): 返回适配器中数据集的总数。
  • Object getItem(int position): 获取与数据集中指定位置关联的数据项。
  • long getItemId(int position): 获取与列表中指定位置关联的行 ID。
  • int getItemViewType(int position): 获取将由 getView(int, View, ViewGroup) 方法指定项目创建的视图类型。
  • View getView(int position, View convertView, ViewGroup parent): 获取显示数据集中指定位置的数据的视图。
  • int getViewTypeCount(): 返回将由其创建的视图类型的数量 getView(int, View, ViewGroup)。
  • boolean hasStableIds(): 项目 ID 在基础数据更改期间是否稳定。
  • boolean isEmpty(): 是否为空。
  • void registerDataSetObserver(DataSetObserver observer): 注册一个在此适配器使用的数据发生更改时调用的观察者。
  • unregisterDataSetObserver(DataSetObserver observer): 取消注册先前已通过此适配器注册的观察者  registerDataSetObserver(DataSetObserver)。

这些方法简要地描述了 Adapter 接口的功能,主要是用于获取数据项的数量、获取数据项本身以及与视图相关的操作。通过实现这些方法,可以创建自定义的适配器以满足特定的数据显示需求。

SpinnerAdapter

SpinnerAdapter 是用于在 Spinner(下拉框)中显示数据的接口。与其他 Adapter 不同的是,SpinnerAdapter 专门用于 Spinner 控件,因此只有一个公开方法:

  • View getDropDownView(int position, View convertView, ViewGroup parent): 根据下拉式弹出窗口中显示数据集中指定的位置获取数据的视图。

这个方法与 getView() 方法类似,但它专门用于在 Spinner 的下拉列表中显示数据项的视图。通常情况下,你会根据 position 参数来获取对应位置的数据项,并将其显示在一个视图中返回。需要注意的是,Spinner 在展开时会显示一个下拉列表,而这个方法返回的视图就是用于在下拉列表中显示的每个数据项的样式。

ListAdapter

ListAdapter 是用于在 ListView 中显示数据的接口,它有两个方法:

  • boolean areAllItemsEnabled(): 设置是否启用此适配器中的所有项目。如果所有的项目都是可用的,则返回 true;否则返回 false。当列表中的所有项都是可点击的时候,这个方法通常返回 true。
  • boolean isEnabled(int position): 判断指定位置上的项目是否启用。通常情况下,这个方法会根据列表中的每个项的状态来决定其是否可点击。如果指定位置上的项目是可用的(可以点击的),则返回 true;否则返回 false。

这两个方法主要用于控制 ListView 中每个项的可点击状态。

BaseAdapter

BaseAdapter 是 Android 中的一个抽象类,用于实现基本的适配器功能,通常用于在界面和数据之间进行数据绑定。

下面是对这些方法的简要说明:

  • boolean areAllItemsEnabled(): 判断是否启用了适配器中的所有项目。
  • CharSequence[] getAutofillOptions(): 获取可帮助 AutofillService 自动填充支持的视图的适配器数据的字符串表示形式。
  • View getDropDownView(int position, View convertView, ViewGroup parent): 根据下拉式弹出窗口中显示的数据集中指定的位置获取数据的视图。
  • int getItemViewType(int position): 获取由 getView(int, View, ViewGroup) 方法指定的项目创建的视图类型。
  • View getView(int position, View convertView, ViewGroup parent): 获取显示在数据集中指定位置的数据的视图。
  • boolean hasStableIds(): 在基础数据更改期间判断项目 id 是否稳定。
  • boolean isEmpty(): 判断适配器是否为空。
  • boolean isEnabled(int position): 判断指定位置上的项目是否启用。
  • void notifyDataSetChanged(): 通知附属的观察者,底层数据已被更改,任何反映数据集的视图都应该自行刷新。
  • void notifyDataSetInvalidated(): 通知所附的观察员,底层数据不再有效或可用。
  • void setAutofillOptions(CharSequence... options): 设置返回的值是由 getAutofillOptions() 方法返回的选项。
  • void registerDataSetObserver(DataSetObserver observer): 注册一个观察者,在适配器使用的数据发生更改时调用。
  • void unregisterDataSetObserver(DataSetObserver observer): 取消注册之前已经通过 registerDataSetObserver(DataSetObserver) 方法注册的观察者。

方法说明简单明了,主要就是获取数据项的数量和获取数据项,获取数据项的类型和视图。

现在我们看看我们要重写哪些方法

  1. 首先和监听器相关的都不用重写,因为暂时用不着,于是去掉

    1. notifyDataSetChanged()
    2. notifyDataSetInvalidated()
    3. registerDataSetObserver(DataSetObserver observer)
    4. registerDataSetObserver(DataSetObserver observer)
  2. 跟 自动填充 相关的也暂时用不着 (以后有机会介绍吧),于是去掉

    1. setAutofillOptions(CharSequence... options)
    2. getAutofillOptions()
  3. 有些方法可以有选择性的实现

    1. getDropDownView()
    2. areAllItemsEnabled()
    3. isEnabled()
    4. isEmpty()
    5. getItemViewType()
    6. getItemViewTypeCount()

好了,还剩下 4 个方法:

  • getView(int position, View convertView, ViewGroup parent): 这是一个最重要的方法,用于获取显示在数据集中指定位置的数据的视图。在这个方法中,你需要创建或者重用视图,并将数据绑定到视图上。
  • int getCount(): 这个方法返回数据集中的项目数量。在适配器中,你需要实现这个方法以提供数据集中项目的数量。
  • Object getItem(int position): 这个方法用于获取与数据集中指定位置关联的数据项。通常,你可以根据位置返回数据集中相应位置的对象。
  • long getItemId(int position): 这个方法用于获取与列表中指定位置关联的行 ID。一般来说,可以返回与该位置相关的数据项的唯一标识符,如果没有可以返回该位置。

这些方法是一个基本适配器必须实现的核心方法,它们用于将数据与视图进行绑定并确定数据的特征。

自定义 BaseAdapter

<?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:gravity="center">
        <ListView
            android:id="@+id/listView"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />
</LinearLayout>
package com.example.myapplication;

import android.content.Context;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.TextView;
import androidx.appcompat.app.AppCompatActivity;
import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // 准备数据
        List<String> dataList = new ArrayList<>();
        dataList.add("项目 1:Java");
        dataList.add("项目 2:C#");
        dataList.add("项目 3:Python");
        dataList.add("项目 4:C++");
        dataList.add("项目 5:PHP");

        // 找到ListView
        ListView listView = findViewById(R.id.listView);

        // 创建适配器
        CustomAdapter adapter = new CustomAdapter(this, dataList);

        // 设置适配器
        listView.setAdapter(adapter);
    }

    // 自定义 BaseAdapter
    private static class CustomAdapter extends BaseAdapter {
        private List<String> mData;
        private LayoutInflater mInflater;

        // 构造函数
        public CustomAdapter(Context context, List<String> data) {
            mData = data;
            mInflater = LayoutInflater.from(context);
        }

        // 返回数据集的大小
        @Override
        public int getCount() {
            return mData.size();
        }

        // 返回指定位置的数据项
        @Override
        public String getItem(int position) {
            return mData.get(position);
        }

        // 返回指定位置的行ID
        @Override
        public long getItemId(int position) {
            // 对于简单情况,我们返回位置作为ID
            return position;
        }

        // 返回指定位置的视图
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            ViewHolder holder;
            if (convertView == null) {
                convertView = mInflater.inflate(android.R.layout.simple_list_item_1, parent, false);
                holder = new ViewHolder();
                holder.textView = convertView.findViewById(android.R.id.text1);
                convertView.setTag(holder);
            } else {
                holder = (ViewHolder) convertView.getTag();
            }

            // 获取数据项并设置到TextView中
            String item = getItem(position);
            holder.textView.setText(item);

            return convertView;
        }

        // ViewHolder类,用于优化列表项的视图
        static class ViewHolder {
            TextView textView;
        }
    }
}

在这个示例中,我们创建了一个自定义的 CustomAdapter 类,继承自 BaseAdapter,并实现了其中的四个核心方法:getCount()、getItem()、getItemId() 和 getView()。同时,在 MainActivity 中,我们实例化了 CustomAdapter 并将其设置给了 ListView。 

 运行结果:

学习Android的第十六天,Android ,学习,android

参考文档

  1. Android 官方 BaseAdapter

Android ListView 列表控件

关于 ListView ,其实 Android Adapter 适配器 和 Android 自定义 Adapter 都有已经使用过好几次了,我们这里就不再讲解基本的使用了。

ListView 的属性和方法

ListView 的常用属性:

  • android:footerDividersEnabled: 是否在 footerView(表尾)前绘制一个分隔条,默认为 true。
  • android:headerDividersEnabled: 是否在 headerView(表头)前绘制一个分隔条,默认为 true。
  • android:divider: 设置分隔条,可以用颜色分割,也可以用 drawable 资源分割。
  • android:dividerHeight: 设置分隔条的高度。
  • android:entries: ListView 要显示的数据资源,在 Android Adapter 适配器中我们有用到过。

这些属性可以用来定制 ListView 的外观和分隔线的显示。

至于方法,ListView 提供了很多与表头表尾分隔线相关的方法,但是我们在日常开发中常用的方法并不太多,通常使用的方法包括 setAdapter() 用于设置适配器,以及一些用于监听事件的方法,比如 setOnItemClickListener() 用于设置列表项的点击事件监听器。

表头表尾分割线的设置

ListView 没有直接设置表头和表尾的属性,但是你可以通过编程的方式在 Java 代码中设置表头和表尾。方法 addHeaderView(View v) 和 addFooterView(View v) 就是用来实现这个目的的。

这些方法允许你在 ListView 中添加表头和表尾的视图,其中 addHeaderView(View v) 方法用于添加表头,而 addFooterView(View v) 方法用于添加表尾。你可以传入一个自定义的 View 对象作为表头或表尾的内容。

此外,如果需要进一步控制表头或表尾的交互,可以使用重载的方法 addHeaderView(View v, Object data, boolean isSelectable) 和 addFooterView(View v, Object data, boolean isSelectable),其中 isSelectable 参数用于指定表头或表尾是否可以被选中。

记住,如果你使用了 addHeaderView() 方法,你必须在调用 setAdapter() 方法之前添加表头,否则会出现错误。这是因为添加表头必须在设置适配器之前完成。

例子:

<?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:gravity="center">
        <ListView
            android:id="@+id/listView"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />
</LinearLayout>
package com.example.myapplication;

import android.graphics.Color;
import android.os.Bundle;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.TextView;

import androidx.appcompat.app.AppCompatActivity;
import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // 准备数据
        List<String> dataList = new ArrayList<>();
        dataList.add("项目 1:Java");
        dataList.add("项目 2:C#");
        dataList.add("项目 3:Python");
        dataList.add("项目 4:C++");
        dataList.add("项目 5:PHP");
        // 找到ListView
        ListView listView = findViewById(R.id.listView);

        // 创建适配器
        ArrayAdapter<String> adapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, dataList);

        // 添加表头
        // 注意:addHeaderView() 必须在 setAdapter() 之前调用
        // 如果表头不需要被选中,最后一个参数可以传入 false
        // 如果需要被选中,则传入 true
        listView.addHeaderView(createHeaderView(), null, false);

        // 添加表尾
        // 同样,addFooterView() 也必须在 setAdapter() 之前调用
        listView.addFooterView(createFooterView(), null, false);

        // 设置适配器
        listView.setAdapter(adapter);
    }

    // 创建表头的视图
    private View createHeaderView() {
        TextView headerView = new TextView(this);
        headerView.setText("表头视图");
        // 设置表头样式,比如背景色、文字大小等
        headerView.setBackgroundColor(Color.BLUE); // 设置背景色为蓝色
        headerView.setTextColor(Color.WHITE); // 设置文字颜色为白色
        headerView.setTextSize(18); // 设置文字大小为 18sp
        return headerView;
    }

    // 创建表尾的视图
    private View createFooterView() {
        TextView footerView = new TextView(this);
        footerView.setText("表尾视图");
        // 设置表尾样式,比如背景色、文字大小等
        footerView.setBackgroundColor(Color.GREEN); // 设置背景色为绿色
        footerView.setTextColor(Color.WHITE); // 设置文字颜色为白色
        footerView.setTextSize(18); // 设置文字大小为 18sp
        return footerView;
    }
}

列表从底部开始显示 android:stackFromBottom

android:stackFromBottom="true" 是一个用于 ListView 的布局属性,用于设置列表从底部开始显示。

当设置为 true 时,ListView 将会从底部开始显示列表项,即最后一个列表项会显示在列表的底部,而第一个列表项会显示在列表的顶部。

下面是一个示例 XML 布局文件,演示如何使用 android:stackFromBottom="true" 属性:

<ListView
    android:id="@+id/listView"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:stackFromBottom="true" />

设置点击颜色 cacheColorHint

android:cacheColorHint 是一个用于 ListView 的属性,用于设置当滚动或点击时,背景色的缓存色。

默认情况下,ListView 在滚动时会绘制一个缓存位图来加速滚动的过程。而这个缓存位图的背景色默认是黑色。当你将一个有背景的 ListView 放在一个有颜色的背景上时,当你滚动 ListView 时,滚动过程中的空白部分会暴露出背景色,此时就会看到黑色背景,给人一种不连续的感觉。

通过设置 android:cacheColorHint 属性为透明色,即 #00000000,可以解决这个问题。这样,在滚动或点击时,空白部分就会显示成透明色,与背景融合,不会再出现黑色背景。

下面是一个示例 XML 布局文件,演示如何使用 android:cacheColorHint 属性:

<ListView
    android:id="@+id/listView"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@drawable/listview_background"
    android:cacheColorHint="#00000000" />

隐藏滑动条

可以通过设置 android:scrollbars 属性为 none 来隐藏 ListView 的滚动条,也可以通过调用 setVerticalScrollBarEnabled(false) 来达到同样的效果。

1、使用 XML 属性 android:scrollbars="none":

<ListView
    android:id="@+id/listView"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:scrollbars="none" />

2、使用 Java 代码 setVerticalScrollBarEnabled(false):文章来源地址https://www.toymoban.com/news/detail-827064.html

ListView listView = findViewById(R.id.listView);
listView.setVerticalScrollBarEnabled(false);

到了这里,关于学习Android的第十六天的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 学C的第二十六天【指针的进阶(二)】

    学C的第二十六天【指针的进阶(二)】

    ========================================================================= 相关代码gitee自取 :C语言学习日记: 加油努力 (gitee.com)  ========================================================================= 接上期 : 学C的第二十五天【指针的进阶(一)】_高高的胖子的博客-CSDN博客  ================================

    2024年02月13日
    浏览(25)
  • JAVA SE -- 第十六天

    JAVA SE -- 第十六天

    (全部来自“韩顺平教育”) 一、文件 是保存数据的地方 2、文件流 文件在程序中是以流的形式来操作  流:数据在数据源(文件)和程序(内存)之间经历的路径 输入流:数据从数据源(文件)到程序(内存)的路径 输出流:数据从程序(内存)到数据源(文件)的路径

    2024年02月14日
    浏览(11)
  • 第十六天-爬虫selenium库

    第十六天-爬虫selenium库

    目录 1.介绍 2.使用 selenium 1.安装 2.使用 1.测试打开网页,抓取雷速体育日职乙信息 2.通过xpath查找 3.输入文本框内容 send_keys 4.点击事件 click 5.获取网页源码: 6.获取cookies 7.seleniumt提供元素定位方式:8种 8.控制浏览器前进、后退、刷新 9.控制鼠标 10. 设置等待 11设置后台运行

    2024年03月12日
    浏览(14)
  • 秒懂百科,C++如此简单丨第十六天:指针

    秒懂百科,C++如此简单丨第十六天:指针

    目录 必看信息 Everyday English 前言  📝了解指针 📝定义指针 📝分析指针 📝运用指针 总结 ▶本篇文章由爱编程的小芒果原创,未经许可,严禁转载。 ▶本篇文章被收录于秒懂百科,C++如此简单专栏,欢迎订阅。 专栏亮点 1.每篇文章质量高,质量分保证在80分以上。 2.文章

    2024年02月01日
    浏览(10)
  • 数据结构第十六天(二叉树层序遍历/广度优先搜索(BFS)/队列使用)

    数据结构第十六天(二叉树层序遍历/广度优先搜索(BFS)/队列使用)

    目录 前言 概述 接口 源码 测试函数 运行结果 往期精彩内容 从前的日色变得慢,车,马,邮件都慢,一生,只够爱一个人。 二叉树的层序遍历可以使用广度优先搜索(BFS)来实现。具体步骤如下: 创建一个队列 queue,并将根节点入队。 当队列不为空时,重复执行以下步骤:

    2024年02月22日
    浏览(13)
  • MFC第十六天 CFileDialog、CEdit简介、(线程)进程的启动,以及Notepad的开发(托盘技术-->菜单功能)

    MFC第十六天 CFileDialog、CEdit简介、(线程)进程的启动,以及Notepad的开发(托盘技术-->菜单功能)

    通用对话框 CCommonDialog 这些对话框类封装 Windows 公共对话框。 它们提供了易于使用的复杂对话框实现。 CFileDialog 提供用于打开或保存文件的标准对话框。 CColorDialog 提供用于选择颜色的标准对话框。 CFontDialog 提供用于选择字体的标准对话框。 CFindReplaceDialog 为搜索和替换操作

    2024年02月16日
    浏览(13)
  • 【干货】Android系统定制基础篇:第十六部分(双屏异触、定时开关机与看门狗)

    【干货】Android系统定制基础篇:第十六部分(双屏异触、定时开关机与看门狗)

    在双屏异显产品中,有时候主副屏都带有触摸屏,并且要求主副屏触摸各自操作互不干扰。 Android 现有框架中已经支持副输入设备的逻辑,只是默认将所有的外部热插拔设备统一指定为副输入设备,这种逻辑我们如果是一个 I2C 加上一个 USB 触摸那么默认就可以支持,USB 触摸

    2024年02月10日
    浏览(12)
  • 学习JAVA打卡第四十六天

    学习JAVA打卡第四十六天

    Date和Calendar类 Date类 ⑴使用无参数构造方法 使用Date 类的无参数构造方法创建的对象可以获取本机的当前日期和时间,例如: Date nowtime =new Date(); ⑵使用带参数的构造方法 计算机系统将其自身的时间的设“公元”设置在1970年1月1日零时可(格林威治时间),可以根据这个

    2024年02月11日
    浏览(13)
  • 学习Android的第十一天

    目录 Android ProgressBar 进度条 ProgressBar ProgressBar 外观 ProgressBar 属性 ProgressBar 方法 Android ProgressBar 动图替代圆形进度条 范例 Android ProgressBar 自定义圆环进度条 例子: 参考文档 在Android中,ProgressBar(进度条)是用于显示任务进度的UI组件,通常用于耗时操作的过程中以及需要显

    2024年02月19日
    浏览(18)
  • 学习Android的第十四天

    目录 Android DatePicker 日期选择器 DatePicker 属性 和 事件 DatePicker 事件 获得 DatePicker 的值 Android TimePicker 时间选择器 TimePicker 属性 TimePicker 事件 获得 TimePicker 的值 Android CalendarView 日历视图 CalendarView 属性 CalendarView 事件 获得 CalendarView 的值 在Android中,DatePicker是一个用户界面组件

    2024年02月21日
    浏览(9)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包