目录
列表从底部开始显示 android:stackFromBottom
在上一篇文章中我们知道了啥是 Adapter,也知道了 Adapter 的家族体系,也用过了几个Adapter。
本篇文章,我们就来自己实现一个 Adapter。
要实现自定义的 Adapter,通常继承自 BaseAdapter 类,并重写其中的方法来适配你的数据源。
首先,我们要做的就是要了解我们到底要重写哪些方法,因为 BaseAdapter 实现了 ListAdapter 和 SpinnerAdapter 接口,而这两个接口又继承自 Adapter
打开 Adapter API 文档,我们可以看到它有以下几个方法要实现
这些方法的说明如下:
这些方法简要地描述了 Adapter 接口的功能,主要是用于获取数据项的数量、获取数据项本身以及与视图相关的操作。通过实现这些方法,可以创建自定义的适配器以满足特定的数据显示需求。
SpinnerAdapter 是用于在 Spinner(下拉框)中显示数据的接口。与其他 Adapter 不同的是,SpinnerAdapter 专门用于 Spinner 控件,因此只有一个公开方法:
这个方法与 getView() 方法类似,但它专门用于在 Spinner 的下拉列表中显示数据项的视图。通常情况下,你会根据 position 参数来获取对应位置的数据项,并将其显示在一个视图中返回。需要注意的是,Spinner 在展开时会显示一个下拉列表,而这个方法返回的视图就是用于在下拉列表中显示的每个数据项的样式。
ListAdapter 是用于在 ListView 中显示数据的接口,它有两个方法:
这两个方法主要用于控制 ListView 中每个项的可点击状态。
BaseAdapter 是 Android 中的一个抽象类,用于实现基本的适配器功能,通常用于在界面和数据之间进行数据绑定。
下面是对这些方法的简要说明:
方法说明简单明了,主要就是获取数据项的数量和获取数据项,获取数据项的类型和视图。
现在我们看看我们要重写哪些方法
首先和监听器相关的都不用重写,因为暂时用不着,于是去掉
跟 自动填充 相关的也暂时用不着 (以后有机会介绍吧),于是去掉
有些方法可以有选择性的实现
好了,还剩下 4 个方法:
这些方法是一个基本适配器必须实现的核心方法,它们用于将数据与视图进行绑定并确定数据的特征。
<?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。
运行结果:
关于 ListView ,其实 Android Adapter 适配器 和 Android 自定义 Adapter 都有已经使用过好几次了,我们这里就不再讲解基本的使用了。
ListView 的常用属性:
这些属性可以用来定制 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="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" />
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):
ListView listView = findViewById(R.id.listView);
listView.setVerticalScrollBarEnabled(false);
文章浏览阅读2.5w次,点赞6次,收藏50次。官方解释是,docker 容器是机器上的沙盒进程,它与主机上的所有其他进程隔离。所以容器只是操作系统中被隔离开来的一个进程,所谓的容器化,其实也只是对操作系统进行欺骗的一种语法糖。_docker菜鸟教程
文章浏览阅读5.7k次,点赞3次,收藏14次。该如何避免的,今天小编给大家推荐两个下载Windows系统官方软件的资源网站,可以杜绝软件捆绑等行为。该站提供了丰富的Windows官方技术资源,比较重要的有MSDN技术资源文档库、官方工具和资源、应用程序、开发人员工具(Visual Studio 、SQLServer等等)、系统镜像、设计人员工具等。总的来说,这两个都是非常优秀的Windows系统镜像资源站,提供了丰富的Windows系统镜像资源,并且保证了资源的纯净和安全性,有需要的朋友可以去了解一下。这个非常实用的资源网站的创建者是国内的一个网友。_msdn我告诉你
文章浏览阅读1.2k次。vue2封装对话框el-dialog组件_
文章浏览阅读4.7k次,点赞5次,收藏6次。MFC 文本框换行 标签: it mfc 文本框1.将Multiline属性设置为True2.换行是使用"\r\n" (宽字符串为L"\r\n")3.如果需要编辑并且按Enter键换行,还要将 Want Return 设置为 True4.如果需要垂直滚动条的话将Vertical Scroll属性设置为True,需要水平滚动条的话将Horizontal Scroll属性设_c++ mfc同一框内输入二行怎么换行
文章浏览阅读832次。检查Linux是否是否开启所需端口,默认为6379,若未打开,将其开启:以root用户执行iptables -I INPUT -p tcp --dport 6379 -j ACCEPT如果还是未能解决,修改redis.conf,修改主机地址:bind 192.168.85.**;然后使用该配置文件,重新启动Redis服务./redis-server redis.conf..._redis-server doesn't support auth command or ismisconfigured. try
文章浏览阅读4.9k次。济大数电实验报告_数据选择器及其应用
文章浏览阅读236次。1研究内容消费在生产中占据十分重要的地位,是生产的最终目的和动力,是保持省内经济稳定快速发展的核心要素。预测河南省社会消费品零售总额,是进行宏观经济调控和消费体制改变创新的基础,是河南省内人民对美好的全面和谐社会的追求的要求,保持河南省经济稳定和可持续发展具有重要意义。本文建立灰色预测模型,利用MATLAB软件,预测出2019年~2023年河南省社会消费品零售总额预测值分别为21881...._灰色预测模型用什么软件
文章浏览阅读1.2k次。12.4-在Qt中使用Log4Qt输出Log文件,看这一篇就足够了一、为啥要使用第三方Log库,而不用平台自带的Log库二、Log4j系列库的功能介绍与基本概念三、Log4Qt库的基本介绍四、将Log4qt组装成为一个单独模块五、使用配置文件的方式配置Log4Qt六、使用代码的方式配置Log4Qt七、在Qt工程中引入Log4Qt库模块的方法八、获取示例中的源代码一、为啥要使用第三方Log库,而不用平台自带的Log库首先要说明的是,在平时开发和调试中开发平台自带的“打印输出”已经足够了。但_log4qt
文章浏览阅读786次。全局观思维模型,一个教我们由点到线,由线到面,再由面到体,不断的放大格局去思考问题的思维模型。_计算机中对于全局观的
文章浏览阅读330次。一、CountDownLatch介绍CountDownLatch采用减法计算;是一个同步辅助工具类和CyclicBarrier类功能类似,允许一个或多个线程等待,直到在其他线程中执行的一组操作完成。二、CountDownLatch俩种应用场景: 场景一:所有线程在等待开始信号(startSignal.await()),主流程发出开始信号通知,既执行startSignal.countDown()方法后;所有线程才开始执行;每个线程执行完发出做完信号,既执行do..._countdownluach于cyclicbarrier的用法
文章浏览阅读508次。Prometheus 算是一个全能型选手,原生支持容器监控,当然监控传统应用也不是吃干饭的,所以就是容器和非容器他都支持,所有的监控系统都具备这个流程,_-自动化监控系统prometheus&grafana实战
文章浏览阅读4.7k次。输入关键字,可以通过键盘的搜索按钮完成搜索功能。_react search