Android 如何将标题布局重用为 ListView 中的空视图

2023-12-14

在我的项目的整个生命周期中,我一直在努力解决这个问题。我的项目中有很多列表,其中大多数都有标题。我一直在制作一个单独的布局文件并使用 addHeaderView() 将其添加到列表中。问题是当数据(ArrayList,在我的例子中)为空时,标题不会出现。经过几个小时的寻找将标题布局重用为空视图的方法后,我放弃并决定在代码中复制布局并使用 setEmptyView() 将其分配为空视图。问题在于,许多标题包含可单击视图,因此我必须为每个重复的视图加倍所有可单击逻辑。我之前尝试包含标题但失败了,主要是因为我仍然不太明白布局是如何膨胀的等。

最后,我想出了一个解决方案,我想与社区分享,以防其他人遇到类似的问题。我不知道这是否是解决这个问题的最佳方法,任何反馈或建议肯定会受到欢迎。

这是包含列表列表视图的布局的代码:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical"
>
    <ListView
        android:id="@+id/lv_my_list"
        style="@style/ListStyle"
        android:headerDividersEnabled="false"
    />
    <include
        layout="@layout/my_list_header"
        android:id="@+id/my_list_empty"
    />
</LinearLayout>

样式定义了布局的宽度和高度等。

现在我有了包含标题视图的布局文件

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    android:id="@+id/my_list_header"
>
    <Button 
        android:id="@+id/my_list_button"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="Click Me"
    />
</LinearLayout>

我知道 LinearLayout 效率不是很高,我正在尝试使用合并或其他效率措施,但这是第一个有效的版本,所以我现在就使用它。最后是代码:

// set up the header
myListView = (ListView)findViewById(R.id.lv_my_list);
View header = View.inflate(this, R.layout.my_list_header, null);
Button b = (Button)header.findViewById(R.id.my_list_button);
b.setOnClickListener(this);
myListView.addHeaderView(header);

// set up the empty view        
LinearLayout ll = (LinearLayout)findViewById(R.id.my_list_empty);
b = (Button)ll.findViewById(R.id.my_list_button);
b.setOnClickListener(this);
meLocalListView.setEmptyView(ll);

我将按钮包装在布局中的原因是因为我可以将按钮的每个实例设置为将其用作 OnClickListener,然后在 onClick 方法中使用单个 id 引用它们:R.id.my_list_button。我需要对此进行更多测试,但它现在似乎有效。我还没有在我的所有列表中实现它,只是在一个列表中实现它,所以它可能无法在所有情况下都起作用。如果您有任何建议,请告诉我,因为这长期以来一直是我的问题。一个问题可能是,如果您想从 ID 实例化按钮,您可能必须再次经历整个过程才能访问正确的 ID?


如果你想显示一个标题ListView当列表为空时,您真正想做的是显示列表本身而不是单独的空视图。因此,最简单的方法是检查列表是否为空,如果不为空,则将列表设置为可见:

getListView().setVisibility(View.VISIBLE);

您可以使用以下代码非常轻松地进行测试:

public class TestListActivity extends ListActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.test_listview);

        // create the empty grid item mapping
        String[] from = new String[] {};
        int[] to = new int[] {};

        // prepare the empty list
        List<HashMap<String, String>> fillMaps = new ArrayList<HashMap<String, String>>();

        // fill in the grid_item layout
        SimpleAdapter adapter = new SimpleAdapter(this, fillMaps, R.layout.test_listitem, from, to);

        View listHeader = 
                ((LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE))
                .inflate(R.layout.test_listheader, null, false);

        getListView().addHeaderView(listHeader);
        getListView().setAdapter(adapter);
    }
}

该列表为空,但标题可见。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android 如何将标题布局重用为 ListView 中的空视图 的相关文章

随机推荐

  • C++ 递归类型定义是否可行,特别是我可以在 T 的定义中放置一个向量 吗?

    对于我的一个项目 我真正想做的是这个 将其简化到最低限度 struct Move int src int dst struct MoveTree Move move std vector
  • 获取YAML路径下的所有节点

    我有一个如下所示的 YAML 文件 Main topofhouse x 276 4375 y 71 0 z 60 5 yaw 290 7768 pitch 35 400017 2ndfloor x 276 5 y 67 0 z 60 5 y
  • typescript:错误 TS2693:“Promise”仅指类型,但在此处用作值

    我正在尝试对我的 AWS Lambda 使用 Typescript 但在使用 Promise 的地方都会收到以下错误 error TS2693 Promise only refers to a type but is being used
  • 从非 UI 线程更新 ObservableCollection

    我正在开发 Windows 8 应用商店应用程序 我有一个计时器 每两分钟调用一次委托并发出异步网络请求 生成的数据将添加到绑定到 UI 元素的 observablecollection 中 这样做会引发异常 因为正在非 UI 线程上修改
  • Flexbox、CSSGrid 的奇怪行为

    我有这样的情况 https jsfiddle net johnsam rdtva2fq On Chrome效果很好 请看这个 它开始 参见 FIRST 和 LAST btn 好的 On Safari它没有 对于 iPad iPhone 也是
  • 如何检查 Java 8 Stream 是否为空?

    我如何检查是否Stream为空 如果不是 作为非终端操作抛出异常 基本上 我正在寻找与下面的代码等效的内容 但没有具体化中间的流 特别是 在终端操作实际消耗流之前不应进行检查 public Stream
  • 将特定的类/ID 应用到菜单上的当前页面 (PHP)

    我有一个这样的菜单 div a href http domain com folder biography img src blahblahblahblah a a href http domain com folder contacts
  • 向 QML 项目添加资源会导致编译速度非常慢

    我在项目的资源文件中添加了一些图标 突然间 QML 代码的每一个微小更改都会导致项目运行前需要 7 8 秒的等待时间 几乎感觉像是在重新编译 C 代码 但实际上这是 qrc 文件 编译 造成的延迟 我尝试禁用 qrc 压缩 希望它会变得更快
  • 为什么我的图像没有被附加到数组中?

    我有一个简单的模型 其中包括 var photos UIImage 我已将 zombies jpg 文件作为文件复制到项目中 然后 在表视图控制器中所需的 init 中 我想加载一条虚拟记录 我可以定义所有 String 和 NSDate
  • 多处理池和生成器

    首先看下面的代码 pool multiprocessing Pool processes N batch for item in generator batch append item if len batch 10 pool apply
  • 用于 SEO 的“h1”中的“p”标签[关闭]

    Closed 这个问题不符合堆栈溢出指南 目前不接受答案 会使用 p 嵌套在 a 中的标签 p h1 标签对 SEO 不利吗 h1 p Some title p p Some subtitle p h1 这将使我的生活变得更轻松 处理动态页
  • 如何在 React Native 中运行后台任务?

    我已经建立了一个iOS 小应用程序在 React Native 中进行位置跟踪 定期将纬度 经度发送到用户选择的服务器 然而 这仅在应用程序位于前台时才有效 当用户在其他应用程序中时 如何在后台运行此任务 不幸的是 目前不支持任何类型的后台
  • 日期与日期时间

    我正在开发一个需要返回事件日期的程序 我正在寻找一个Date not a DateTime 是否有一种只返回日期的数据类型 不 没有 DateTime表示由日期和时间组成的某个时间点 但是 您可以通过以下方式检索日期部分Date财产 这是另
  • 如何将多种类型的用户重定向到各自的 Activity?

    我正在 Firebase 上创建一个投票应用程序 我有 3 种类型的用户 到目前为止 我可以在两种用户 学生 教师 使用以下代码登录后成功将他们重定向到各自的活动 到目前为止我的用户但现在我必须添加另一个用户 ADMIN 并且像其他用户一样
  • NHibernate 加载实体以及子集合的一部分

    有没有办法通过子集合上的子句来加载 NHibernate 实体 我有一个场景 我在 操作 中记录更改 即一个操作可以包含对多个实体的更改 当我想要加载特定实体的日志时 我会加载对该实体所做的任何更改的所有操作 加载这些操作会导致加载所有更改
  • Scala 这种别名和自我类型

    之间有什么关系吗this aliasing and self type Is this aliasing的一个特例self type 在scala 2nd P776编程中 作者说 抽象类 Parser T 扩展 p gt 你在第 29 4
  • PHP 闭包对象是否符合垃圾回收条件

    我想知道是否有人知道 PHP 的匿名函数是否符合垃圾回收条件 我知道用创建的函数create function没有被垃圾收集 但我找不到任何关于使用创建的内容的参考function 语法 内部表示为 Closure 对象 PHP 垃圾收集器
  • Android Studio:使用 Mac (OSX) 和 Windows 的同一项目的 SDK 位置发生变化

    我正在开发一个 Android Studio 项目 我的团队成员使用 Windows 我使用 OSX 问题是 当我从 git 提取新代码然后打开项目时 我会根据 Mac 的 SDK 位置得到各种更改 First a notice when
  • Android NDK 和更新的 API 支持

    我正在开发一个大量使用 NDK 的 Android 应用程序 在 Java 方面 我们的目标是 SDK 19 最小 SDK 为 16 有没有办法在 NDK 方面做类似的事情 现在我们的Application mk文件有APP PLATFOR
  • Android 如何将标题布局重用为 ListView 中的空视图

    在我的项目的整个生命周期中 我一直在努力解决这个问题 我的项目中有很多列表 其中大多数都有标题 我一直在制作一个单独的布局文件并使用 addHeaderView 将其添加到列表中 问题是当数据 ArrayList 在我的例子中 为空时 标题