Horizo​​ntalScrollView:带有 getView() 的 CustomAdapter 不会像 ListView 那样重用 ConvertViews

2024-04-21

在我过去的一个项目中,我实现了“时间选择器轮播”。它基于一个HorizontalScrollView。用户可以在滚动该视图时选择时间。时间值是根据 X 偏移计算的HorizontalScrollView.

我想在 github 上分享这个项目,但是在清理代码时我意识到一些表现不佳 issue.

The HorizontalScrollView填充了自定义ArrayAdapter. The getView() uses a Holder为了convertView。我认为它可以作为一个适配器ListView,因此只有可见项目才会被渲染并重用(如果它们将被销毁)。反而,所有项目均已渲染! (在我的例子中是 1008!)我自己添加它们(代码示例中的#1),但即使我尝试添加较少的内容,删除(和回收)旧的逻辑也不起作用,或者我错过了什么?

所以我的基本问题是:我必须改变什么才能使我的适配器表现得像ListView?

  1. I found 这个所以链接 https://stackoverflow.com/questions/19020114/how-to-implement-view-recycling-mechanism-for-pager-adapter并尝试覆盖remove函数,但这永远不会被调用(不知何故逻辑,因为我只是添加)
  2. 有一个好的寻呼机适配器示例 https://gist.github.com/wang2bo2/4551304在 github 上,但不知何故我无法将其翻译为ArrayAdapter<String>

欢迎任何想法、链接!

并且请不要建议使用ListView反而。我们决定使用HorizontalScrollView因为回调以及我们已经有一个ListView在布局中。

水平滚动视图

InfiniteTimeScrubberHorizontalView extends HorizontalScrollView{
...
public void setAdapter(Context context, TimeScrubberListAdapter mAdapter) {
    this.mAdapter = mAdapter;
    try {
        fillViewWithAdapter(mAdapter);
    } catch (ZeroChildException e) {
        e.printStackTrace();
    }
}

private void fillViewWithAdapter(TimeScrubberListAdapter mAdapter) {
    //...

    ViewGroup parent = (ViewGroup) getChildAt(0);
    parent.removeAllViews();
    for (int i = 0; i < mAdapter.getCount(); i++) {
        //#1: Here: ALL views are added
        parent.addView(mAdapter.getView(i, null, parent));   
    }
}

Adpater

public class TimeScrubberListAdapter extends ArrayAdapter<String> {

//...
private ArrayList<String> list;  //list from 0:00,0:30...23:00,23:30
final static int MAXIMUM_DAYS = 21

@Override
public int getCount() {
    return list.size() * MAXIMUM_DAYS;
}

@Override
public String getItem(int position) {
    return list.get(position % list.size());
}

@Override
public View getView(final int position, View convertView, ViewGroup parent) {
    RelativeLayout layout;

    if (convertView == null) {
        layout = (RelativeLayout) View.inflate(context, layoutId, null);
        holder = new Holder();
        holder.title = (TextView) layout.findViewById(R.id.epg_item_text);
        layout.setTag(holder);
    } else {
        layout = (RelativeLayout) convertView;
        view = layout;
        holder = (Holder) layout.getTag();
    }

    layout.setLayoutParams(mLP);        

    String timeValue = getItem(position);
    holder.title.setText(timeValue);            

    return layout;
}
//...
@Override
public void remove(String object) {
    //not called...some how logic, because i do not remove an item
    super.remove(object);    
}

我想您可能会混淆视图和适配器之间渲染的逻辑在哪里。使用适配器不会导致视图回收行为。它是ListView本身及其父级,AbsListView,实现视图回收行为。适配器需要ListView为了根据需要正确填充屏幕上显示的视图,但实际选择要显示的视图以及何时以及如何回收这些视图的逻辑根本不在适配器中。

如果你查看源代码HorizontalScrollView https://android.googlesource.com/platform/frameworks/base/+/refs/heads/master/core/java/android/widget/HorizontalScrollView.java并为ListView https://android.googlesource.com/platform/frameworks/base/+/refs/heads/master/core/java/android/widget/ListView.java,你会发现它们有很大的不同。它们不仅仅是不同方向的同一事物。

因此,总而言之,您将无法通过使用来获得您正在寻找的视图回收HorizontalScrollView甚至是一个简单的后代。如果您想查看回收,您应该查看RecyclerView https://developer.android.com/reference/android/support/v7/widget/RecyclerView.html.

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

Horizo​​ntalScrollView:带有 getView() 的 CustomAdapter 不会像 ListView 那样重用 ConvertViews 的相关文章

随机推荐

  • 如何使用 Selenium 找到文本位置?

    我正在尝试使用 Selenium 查找网页上某些文本的位置 我可以使用 isTextPresent 函数来告诉我文本是否出现 但随后我想知道它实际在哪里 更广泛的问题是我想单击此文本 问题是我似乎无法单击此文本 我认为该文本位于页面上嵌入的
  • sqlalchemy中查询相关表

    所以我有两个表 员工 和 详细信息 如下所示 class Employee Base tablename employees id Column Integer Sequence employee id seq primary key Tr
  • 如何在 ASP.NET 5 中使用基于 IAppBuilder 的 Owin 中间件

    ASP NET 5 ASP NET vNext 与 Katana 一样基于 OWIN 但具有不同的抽象 尤其IAppBuilder已被替换为IApplicationBuilder 许多中间件库依赖于IAppBuilder并且尚未更新以支持
  • 使用多个条件查找所有结果

    我有一个包含多列的表 我想使用条件过滤表并接收包含匹配项的范围 1 我知道我可以使用循环轻松地在表中进行迭代 或者 2 我可以在列中添加过滤器 我不喜欢 1 因为表中的迭代太慢 但我可以做到这一点 Excel 是否有一种函数可以一步返回按特
  • BigQuery更新如何获取更新的行数

    我正在使用 Google Cloud Functions 连接到 Google Bigquery 数据库并更新一些行 云函数是使用Python 3编写的 当我通过函数运行更新 dml 时 我需要帮助弄清楚如何获取结果消息或更新 更改的行数
  • dplyr 0.3 无法inner_join data.table?

    我有以下设置并加载了 dplyr 0 3 和 data table 1 9 3 R version 3 1 1 2014 07 10 Platform x86 64 apple darwin10 8 0 64 bit locale 1 en
  • 是否可以直接从文件加载镶木地板表?

    如果我有一个二进制数据文件 可以转换为 csv 格式 有什么方法可以直接从中加载镶木地板表吗 许多教程显示将 csv 文件加载到文本表 然后从文本表加载到镶木地板表 从效率的角度来看 是否可以像我已有的那样直接从二进制文件加载镶木地板表 理
  • Android html5 输入 type="password" 和数字键盘

    我的任务是为 Android 和 iOS 设计一个网页 您应该在其中输入您的信用卡信息 我无法获取在 Android 中打开数字键盘的安全代码字段 这是我距离最近的一次 它适用于 iOS 但不适用于 Android
  • 用三种颜色的渐变填充面板

    我正在做一个项目 我必须使用 C 做一种颜色选择器 所以我决定在 Win Forms 应用程序中建立一个具有此背景的面板 背景应具有 RGB 三种颜色的渐变 红色 0 255 蓝色 0 255 和绿色 0 但我找不到任何关于我应该为此使用什
  • 模板组件启动器内的离子标签组件未渲染

    我克隆了stencil component starter from https github com ionic team stencil component starter https github com ionic team ste
  • Android 上未原生找到 RNFirebase 核心模块

    我正在尝试在 Android 平台上运行现有的 React Native 应用程序 但收到如下图所示的错误 我已经执行了下面提到的所有步骤http invertase link android http invertase link and
  • Ionic2 - 如果超时则取消 Api 请求

    在我的应用程序中 我通过表单保存数据并调用 Api 进行相同的操作 为了检查它们的互联网连接是否缓慢 我在 ionic2 中使用超时 如下所示 savedata let headers new Headers headers set Con
  • 创建较慢的过渡。 TransitionManager.beginDelayedTransition();太快了

    我正在创建一个过渡 当单击按钮时 将执行以下方法 该方法改变了图像视图的大小和位置 并将其淡出 我在用TransitionManager beginDelayedTransition is too fast 放慢转变速度 但它仍然进展得太快
  • 为动态图像生成 CSS 精灵

    我有一个网页 其中包含大约 20 50 个动态图像 从非静态源提供的图像 这些图像通过基于请求 URL 的 servlet 提供 这会导致每个图像生成一个请求 从而导致性能下降 如果这些图像是静态的 我将创建一个 CSS 精灵并用一个请求替
  • 直线和水平线在断点处连接的分段回归

    我想做一个带有一个断点的分段线性回归 其中回归线的第二半有slope 0 有一些关于如何进行分段线性回归的示例 例如here https stackoverflow com questions 15874214 piecewise func
  • 如果我在 grails 中使用 groovy sql 类,它是否使用 grails 连接池?

    来自 sql 文档中的以下示例 如果我使用这两种方法之一在 Grails 服务类中创建 sql 实例 它会使用 Grails 连接池吗 它会参与任何交易功能吗 我需要自己关闭连接吗 还是会自动回到池子里 def db url jdbc hs
  • 如何在C中将RGB转换为HSL?

    如何在 C C 中将 RGB 转换为 HSL Note This is a short self answer I posted it here so people can find it quickly with a search 翻译代
  • 我可以在 asp.net 4.0 站点中托管 .net 2.0 虚拟目录吗?

    我们在 2 0 网站中运行 NET 4 0 虚拟目录没有任何问题 但相反的方式却给我们带来了一些问题 这是可以理解的 但是有没有办法解决这个问题呢 它们使用不同的应用程序池运行 我们可以让虚拟目录跳过网站的 web config 并直接转到
  • 从提升的进程正常执行进程

    是否有某种方法可以从提升的方式以非提升的方式启动流程 我的设置以提升的方式启动 当它完成时 它只会启动主应用程序 由于设置被提升 主进程也会被提升 这是不可取的 对此最好的解决方案是什么 这是一个问题 Vista Win7 似乎没有 API
  • Horizo​​ntalScrollView:带有 getView() 的 CustomAdapter 不会像 ListView 那样重用 ConvertViews

    在我过去的一个项目中 我实现了 时间选择器轮播 它基于一个HorizontalScrollView 用户可以在滚动该视图时选择时间 时间值是根据 X 偏移计算的HorizontalScrollView 我想在 github 上分享这个项目