设置 PopupWindow 具有最大高度

2023-12-08

我在 PopupWindow 内膨胀 ListView,我希望弹出窗口的行为如下:

  • 当列表视图的高度
  • 当列表的高度> x(列表视图可滚动)时,设置弹出窗口的高度= x

弹出窗口由附加到 EditText 的 TextWatcher 显示,因为它旨在显示搜索建议。 ListView 底层的适配器由自定义加载程序管理,每当用户在 EditText 中键入内容时就会启动该加载程序。 我试图覆盖onMeasure()在列表视图上并将测量的高度传递给调用的侦听器PopupWindow.update(),但这会创建一个循环,因为后者最终会调用第一个。 使用以下代码,弹出窗口根据需要包装所包含的 ListView,但高度不限制为任何值。我需要一个解决方案将高度限制为最大值,比如说 300dp。

etFiltro.addTextChangedListener(new TextWatcher() {
        @Override
        public void beforeTextChanged(CharSequence charSequence, int i, int i2, int i3) {
            /...
        }
        @Override
        public void onTextChanged(CharSequence charSequence, int i, int i2, int i3) {
            Log.i("loader","text changed");
            filtro = String.valueOf(charSequence);
            getSupportLoaderManager().restartLoader(0,null,loaderCallbacks);
            if (popupWindow.isShowing()) popupWindow.dismiss();
        }
        @Override
        public void afterTextChanged(Editable editable) {               
            popupWindow.showAsDropDown(etFiltro);
        }
    });

private LoaderManager.LoaderCallbacks<Cursor> loaderCallbacks = new LoaderManager.LoaderCallbacks<Cursor>() {

    MyListView suggestionList;
    SimpleCursorAdapter adapter;
    int mHeight;

    @Override
    public Loader<Cursor> onCreateLoader(int i, Bundle bundle) {
        SuggestionLoader loader = new SuggestionLoader(MainActivity.this, databaseConnector, filtro);
        loader.setUpdateThrottle(500);
        View view = ((LayoutInflater)getSystemService(LAYOUT_INFLATER_SERVICE)).inflate(R.layout.popup_window,null);
        suggestionList = (MyListView) view.findViewById(R.id.suggestionList);
        adapter = new SimpleCursorAdapter(MainActivity.this,android.R.layout.simple_list_item_1,null,
                new String[]{"note"},new int[]{android.R.id.text1},0);
        suggestionList.setAdapter(adapter);
        suggestionList.setEmptyView(view.findViewById(R.id.tvNoSuggestions));
        //ensure previous popup is dismissed
        if (popupWindow!=null) popupWindow.dismiss();
        popupWindow = new PopupWindow(view,etFiltro.getWidth(),0);
        popupWindow.setWindowLayoutMode(0,WindowManager.LayoutParams.WRAP_CONTENT);
        popupWindow.setAnimationStyle(0);//0 = no animation; -1 = default animation            
        Log.i("loader","onCreateLoader");
        return loader;
    }

    @Override
    public void onLoadFinished(Loader<Cursor> cursorLoader, Cursor cursor) {
        adapter.changeCursor(cursor);           
        Log.i("loader","onLoadFinished");

    }

    @Override
    public void onLoaderReset(Loader<Cursor> cursorLoader) {
        Log.i("loader", "onLoaderReset");
        adapter.changeCursor(null);
    }
};

我自己找到了解决方案。对于任何偶然发现这个问题的人来说,答案是重写该方法onMeasure()ListView 的这样:

public class MyListView extends ListView {

public MyListView(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
}

public MyListView(Context context, AttributeSet attrs) {
    super(context, attrs);
}

public MyListView(Context context) {
    super(context);
}

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

    //set your custom height. AT_MOST means it can be as tall as needed,
    //up to the specified size.

    int height = MeasureSpec.makeMeasureSpec(300,MeasureSpec.AT_MOST);

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

设置 PopupWindow 具有最大高度 的相关文章

随机推荐

  • 模拟react元素上的点击事件

    我正在尝试模拟一个 click event on a React元素 但我不明白为什么它不起作用 当我发射时它没有反应event 我想仅使用 JavaScript 发布 Facebook 评论 但我陷入了第一步 执行 click on di
  • 如何在 Chrome 扩展程序中使用 navigator.clipboard.readText()?

    我编写了一个 Firefox 扩展来读取剪贴板 如果它有一些 PEM 证书 它将在新选项卡中打印其详细信息 我正在尝试移植到 Chrome 这是行不通的 我究竟做错了什么 我在manifest json中请求了clipboardRead 并
  • 后台简历上的密码

    我有一个问题是否有合适的方法来处理这种情况 我希望我的应用程序在第一次启动应用程序时立即启动密码活动 或者用户从后台恢复它 例如 用户单击主页按钮并将应用程序移动到后台 然后再次启动它 我知道我可以使用特殊权限并授予对系统任务的访问权限来执
  • Excel 间接计数

    我有一本工作簿 每个月都有不同的工作表 我又做了一张纸 在 A1 中写下了月份 我想同时使用 Counta 用于月份表中的 A A 和间接 但我用公式得到结果 1 请帮忙 COUNTA 间接 工作表名称 A1 A A 我最终也想对 coun
  • 如何两次引用外键表?

    我收到以下错误 u detail u 一个或多个映射器未能初始化 无法继续 与其他映射器的初始化 最初的例外是 可以 无法确定父 子表之间的连接条件 关系 Vote user 有多个外键路径链接 桌子 指定 foreign keys 参数
  • 带阿尔伯斯投影的 D3.js 地图:如何旋转它?

    我正在使用 d3 js 构建菲律宾地图 但由于一个奇怪的原因 该地图看起来像是向左旋转 因此该国看起来并不真实 我尝试修改projection rotate字段 但似乎不是校正线 var width 1060 height 860 var
  • 在 Mac 上,在 Java 中,某些键不会触发 keyPressed 事件

    这是一个非常奇怪的问题 但我只是将一个简单的 keyListener 添加到 JPanel 中 在 keyPressed 和 keyReleased 上打印 通常它工作正常 但在某些键 如 A 上 如果我在释放之前按住 则在释放后没有其他键
  • 从 Tensorflow 中的张量中删除一组张量

    我正在寻找一种简单的方法来从 Tensorflow 中的当前张量中删除一组张量 但我有一个困难的合理解决方案 例如 假设我有以下当前张量 a tf constant 1 0 2 0 3 0 4 0 5 0 6 0 shape 2 3 nam
  • 如何使用 jQuery 更新属性?

    document ready function var hero image new Array hero image 0 new Image hero image 0 src assets images link png hero ima
  • opencv java修改像素值

    我一直在尝试在 opencv java 中转换一些 opencv C 代码 但我似乎无法让像素分割正常工作 我采用了均值偏移分段垫 将其转换为灰度 然后转换为 32F 然后 我将最下采样然后上采样的图像 由灰色均值漂移垫组成 与原始灰色均值
  • Pandas 将每个单元格都是字符串列表的列转换为整数列表

    我有一个包含列的数据框 其中包含数字列表作为字符串 C1 C2 l 1 3 5 9 1 7 1 7 1 6 将其转换为整数列表的最佳方法是什么 C1 C2 l 1 3 5 9 1 7 1 7 1 6 Thanks 你可以试试 df l df
  • 在云端硬盘选择器小部件中仅显示团队云端硬盘

    我正在创建一个应用程序 我需要在其中提供 Drive Picker 小部件 以便用户可以上传一些文件 现在我想限制用户 以便他们只能从 团队驱动器 中选择文件 而不能从其他任何地方选择文件 我尝试过添加方法onPickerInit even
  • 如何使用 xampp 在 ubuntu 中填充 mysql 数据库中的区域表

    我正在尝试根据此文档导入时区 http dev mysql com doc refman 5 7 en mysql tzinfo to sql html 当我尝试通过终端输入第一个命令时 即 mysql tzinfo to sql tz d
  • 如何发布复选框值和选中状态

    i am getting checkbox values checked status checkbox label checkbox courseid from the server using of axios method now i
  • socket.on 事件被多次触发

    var express require express var app express var server app listen 3000 var replyFromBot app use express static public va
  • 使用 ==> fprintf 时出错 未为“sym”输入定义函数

    这是我的 MATLAB 代码 函数 trapezoidal 是单独定义的 并且工作正常 syms x f 10 2 x 6 x 2 5 x 4 a 0 b 2 ans 3points trapezoidal f a b 3 ans 5poi
  • C语言计算1+(1/2!)+…+(1/n!) n个数的和

    就像标题所说 我如何计算n个数字的总和 1 1 2 1 n 我已经得到了调和级数的代码 include
  • 将 libgdx 添​​加到 Android 本机应用程序

    我有一个简单的儿童应用程序 可以教授颜色 数字等内容 我目前正在开发该应用程序 它使用我认为的 标准 android java 编程 单个 Xml java 类 我还有一个简单的恐龙游戏 它使用 libgdx 跳过字母 我的问题是 我希望将
  • OpenSSL .NET C# 包装器 X509 认证

    您好 我在我的 c 项目中使用 OpenSSL NET 包装器 我想生成 X509 认证 但我不太了解程序 它应该包含什么 什么参数 等等 这是我的代码 我在查看一些测试后做到了 OpenSSL X509 X509Certificate x
  • 设置 PopupWindow 具有最大高度

    我在 PopupWindow 内膨胀 ListView 我希望弹出窗口的行为如下 当列表视图的高度 当列表的高度 gt x 列表视图可滚动 时 设置弹出窗口的高度 x 弹出窗口由附加到 EditText 的 TextWatcher 显示 因