哈尔滨建站模板,网页,2021国内新闻大事20条,wordpress 宽度目录
Android 自定义 Adapter
Adapter 接口
SpinnerAdapter
ListAdapter
BaseAdapter
自定义 BaseAdapter
参考文档
Android ListView 列表控件
ListView 的属性和方法
表头表尾分割线的设置
列表从底部开始显示 android:stackFromBottom
设置点击颜色 cacheColorH…目录
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) 方法注册的观察者。
方法说明简单明了主要就是获取数据项的数量和获取数据项获取数据项的类型和视图。
现在我们看看我们要重写哪些方法 首先和监听器相关的都不用重写因为暂时用不着于是去掉 notifyDataSetChanged()notifyDataSetInvalidated()registerDataSetObserver(DataSetObserver observer)registerDataSetObserver(DataSetObserver observer) 跟 自动填充 相关的也暂时用不着 (以后有机会介绍吧)于是去掉 setAutofillOptions(CharSequence... options)getAutofillOptions() 有些方法可以有选择性的实现 getDropDownView()areAllItemsEnabled()isEnabled()isEmpty()getItemViewType()getItemViewTypeCount()
好了还剩下 4 个方法
getView(int position, View convertView, ViewGroup parent): 这是一个最重要的方法用于获取显示在数据集中指定位置的数据的视图。在这个方法中你需要创建或者重用视图并将数据绑定到视图上。int getCount(): 这个方法返回数据集中的项目数量。在适配器中你需要实现这个方法以提供数据集中项目的数量。Object getItem(int position): 这个方法用于获取与数据集中指定位置关联的数据项。通常你可以根据位置返回数据集中相应位置的对象。long getItemId(int position): 这个方法用于获取与列表中指定位置关联的行 ID。一般来说可以返回与该位置相关的数据项的唯一标识符如果没有可以返回该位置。
这些方法是一个基本适配器必须实现的核心方法它们用于将数据与视图进行绑定并确定数据的特征。
自定义 BaseAdapter
?xml version1.0 encodingutf-8?
LinearLayout xmlns:androidhttp://schemas.android.com/apk/res/androidandroid:layout_widthmatch_parentandroid:layout_heightmatch_parentandroid:orientationverticalandroid:gravitycenterListViewandroid:idid/listViewandroid:layout_widthmatch_parentandroid:layout_heightwrap_content /
/LinearLayoutpackage 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 {Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);// 准备数据ListString dataList new ArrayList();dataList.add(项目 1Java);dataList.add(项目 2C#);dataList.add(项目 3Python);dataList.add(项目 4C);dataList.add(项目 5PHP);// 找到ListViewListView listView findViewById(R.id.listView);// 创建适配器CustomAdapter adapter new CustomAdapter(this, dataList);// 设置适配器listView.setAdapter(adapter);}// 自定义 BaseAdapterprivate static class CustomAdapter extends BaseAdapter {private ListString mData;private LayoutInflater mInflater;// 构造函数public CustomAdapter(Context context, ListString data) {mData data;mInflater LayoutInflater.from(context);}// 返回数据集的大小Overridepublic int getCount() {return mData.size();}// 返回指定位置的数据项Overridepublic String getItem(int position) {return mData.get(position);}// 返回指定位置的行IDOverridepublic long getItemId(int position) {// 对于简单情况我们返回位置作为IDreturn position;}// 返回指定位置的视图Overridepublic 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 官方 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 version1.0 encodingutf-8?
LinearLayout xmlns:androidhttp://schemas.android.com/apk/res/androidandroid:layout_widthmatch_parentandroid:layout_heightmatch_parentandroid:orientationverticalandroid:gravitycenterListViewandroid:idid/listViewandroid:layout_widthmatch_parentandroid:layout_heightwrap_content /
/LinearLayoutpackage 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 {Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);// 准备数据ListString dataList new ArrayList();dataList.add(项目 1Java);dataList.add(项目 2C#);dataList.add(项目 3Python);dataList.add(项目 4C);dataList.add(项目 5PHP);// 找到ListViewListView listView findViewById(R.id.listView);// 创建适配器ArrayAdapterString adapter new ArrayAdapter(this, android.R.layout.simple_list_item_1, dataList);// 添加表头// 注意addHeaderView() 必须在 setAdapter() 之前调用// 如果表头不需要被选中最后一个参数可以传入 false// 如果需要被选中则传入 truelistView.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); // 设置文字大小为 18spreturn headerView;}// 创建表尾的视图private View createFooterView() {TextView footerView new TextView(this);footerView.setText(表尾视图);// 设置表尾样式比如背景色、文字大小等footerView.setBackgroundColor(Color.GREEN); // 设置背景色为绿色footerView.setTextColor(Color.WHITE); // 设置文字颜色为白色footerView.setTextSize(18); // 设置文字大小为 18spreturn footerView;}
}列表从底部开始显示 android:stackFromBottom
android:stackFromBottomtrue 是一个用于 ListView 的布局属性用于设置列表从底部开始显示。
当设置为 true 时ListView 将会从底部开始显示列表项即最后一个列表项会显示在列表的底部而第一个列表项会显示在列表的顶部。
下面是一个示例 XML 布局文件演示如何使用 android:stackFromBottomtrue 属性
ListViewandroid:idid/listViewandroid:layout_widthmatch_parentandroid:layout_heightmatch_parentandroid:stackFromBottomtrue /设置点击颜色 cacheColorHint
android:cacheColorHint 是一个用于 ListView 的属性用于设置当滚动或点击时背景色的缓存色。
默认情况下ListView 在滚动时会绘制一个缓存位图来加速滚动的过程。而这个缓存位图的背景色默认是黑色。当你将一个有背景的 ListView 放在一个有颜色的背景上时当你滚动 ListView 时滚动过程中的空白部分会暴露出背景色此时就会看到黑色背景给人一种不连续的感觉。
通过设置 android:cacheColorHint 属性为透明色即 #00000000可以解决这个问题。这样在滚动或点击时空白部分就会显示成透明色与背景融合不会再出现黑色背景。
下面是一个示例 XML 布局文件演示如何使用 android:cacheColorHint 属性
ListViewandroid:idid/listViewandroid:layout_widthmatch_parentandroid:layout_heightmatch_parentandroid:backgrounddrawable/listview_backgroundandroid:cacheColorHint#00000000 /隐藏滑动条
可以通过设置 android:scrollbars 属性为 none 来隐藏 ListView 的滚动条也可以通过调用 setVerticalScrollBarEnabled(false) 来达到同样的效果。
1、使用 XML 属性 android:scrollbarsnone
ListViewandroid:idid/listViewandroid:layout_widthmatch_parentandroid:layout_heightmatch_parentandroid:scrollbarsnone /2、使用 Java 代码 setVerticalScrollBarEnabled(false)
ListView listView findViewById(R.id.listView);
listView.setVerticalScrollBarEnabled(false);