具有 SearchView 功能的 Android MultiChoice Spinner

2023-12-04

希望你一切顺利。

我遇到了要实施的问题Search功能在MultiChoice Spinner,正如我所实施的多项选择旋转器在那个使用的AlertDialog显示多项选择项。

添加过滤器功能有两个选项:

  1. Add EditText在 AlertDialog 中进行搜索。
  2. Add ListView and EditText与自定义布局。

我尝试同时实现两者,但没有得到完整的解决方案。

In 第一个案例我得到的布局如下图所示(EditText 显示在底部)并且也遇到问题getFilter()不适合使用EditText:

AlertDialog.Builder builder = new AlertDialog.Builder(getContext());
builder.setTitle(defaultText);

LayoutInflater inflater = (LayoutInflater) getContext().getSystemService( Context.LAYOUT_INFLATER_SERVICE );

View view = inflater.inflate(R.layout.alert_dialog_listview_search, null);
builder.setView(view);

EditText editText = (EditText) view.findViewById(R.id.alertSearchEditText);
editText.addTextChangedListener(new TextWatcher() {
    @Override
    public void onTextChanged(CharSequence s, int start, int before, int count) { }
    @Override
    public void beforeTextChanged(CharSequence s, int start, int count, int after) {}

    @Override
    public void afterTextChanged(Editable s) {  }
});

builder.setMultiChoiceItems(items.toArray(new CharSequence[items.size()]), selected, this);
builder.setPositiveButton(android.R.string.ok,
        new DialogInterface.OnClickListener() {
    @Override
    public void onClick(DialogInterface dialog, int which) {
        dialog.cancel();
    }
});

builder.setOnCancelListener(this);
builder.show();

enter image description here

In 案例二我已经创建了自定义布局AlertDialog作为 下面,但在这种情况下,我无法在第二次时保留值 打开对话框的时间:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center_horizontal" >

    <EditText
        android:id="@+id/alertSearchEditText"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"
        android:hint="@string/type_to_search"
        android:inputType="text" >

        <requestFocus />
    </EditText>

    <ListView
        android:id="@+id/alertSearchListView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@+id/alertSearchEditText"
        android:layout_marginTop="5dp"
        android:cacheColorHint="@null"
        android:fadeScrollbars="true"
        android:fastScrollEnabled="true"
        android:textFilterEnabled="true" >
    </ListView>

    <TextView
        android:id="@+id/alertSearchNotFound"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_centerVertical="true"
        android:gravity="center"
        android:textAppearance="?android:attr/textAppearanceLarge"
        android:textColor="#EE0000"
        android:visibility="gone" />

</RelativeLayout>

以下代码也可以帮助我进行过滤ListView但不知道如何获取并保留选定的值。

MultiSpinner.java

package com.example.multiplechoicelistwithfilter;

import java.util.List;

import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.DialogInterface.OnCancelListener;
import android.content.DialogInterface.OnMultiChoiceClickListener;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.AttributeSet;
import android.util.Log;
import android.util.SparseBooleanArray;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.Spinner;

public class MultiSpinner extends Spinner implements OnMultiChoiceClickListener, OnCancelListener {

    private List<String> items;
    private boolean[] selected;
    private String defaultText;
    private MultiSpinnerListener listener;




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

    public MultiSpinner(Context arg0, AttributeSet arg1) {
        super(arg0, arg1);
    }

    public MultiSpinner(Context arg0, AttributeSet arg1, int arg2) {
        super(arg0, arg1, arg2);
    }

    @Override
    public void onClick(DialogInterface dialog, int which, boolean isChecked) {
        if (isChecked)
            selected[which] = true;
        else
            selected[which] = false;
    }

    @Override
    public void onCancel(DialogInterface dialog) {
        // refresh text on spinner

        StringBuffer spinnerBuffer = new StringBuffer();

        for (int i = 0; i < items.size(); i++) {
            if (selected[i] == true) {
                spinnerBuffer.append(items.get(i));
                spinnerBuffer.append(", ");
            }
        }

        String spinnerText = "";
        spinnerText = spinnerBuffer.toString();
        if (spinnerText.length() > 2)
            spinnerText = spinnerText.substring(0, spinnerText.length() - 2);
        else
            spinnerText = defaultText;

//      ArrayAdapter<String> adapter = new ArrayAdapter<String>(getContext(),
//              android.R.layout.simple_dropdown_item_1line,
//              new String[] { spinnerText });
//      setAdapter(adapter);
        setPrompt(spinnerText);
//      if(selected.length > 0)
//          listener.onItemsSelected(selected);

    }


    @Override
    public boolean performClick() {

        AlertDialog.Builder builder = new AlertDialog.Builder(getContext());
        builder.setTitle(defaultText);

        LayoutInflater inflater = (LayoutInflater) getContext().getSystemService( Context.LAYOUT_INFLATER_SERVICE );

        View view = inflater.inflate(R.layout.alert_dialog_listview_search, null);
        builder.setView(view);

        final ListView listView = (ListView) view.findViewById(R.id.alertSearchListView);
        listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
        final ArrayAdapter<String> adapter = new ArrayAdapter<String>(getContext(), android.R.layout.simple_list_item_multiple_choice, items);
        listView.setAdapter(adapter);

        EditText editText = (EditText) view.findViewById(R.id.alertSearchEditText);
        editText.addTextChangedListener(new TextWatcher() {

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {
                adapter.getFilter().filter(s.toString());
            }

            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {
            }

            @Override
            public void afterTextChanged(Editable s) {  
            }
        });

        //builder.setMultiChoiceItems(items.toArray(new CharSequence[items.size()]), selected, this);
        builder.setPositiveButton(android.R.string.ok,
                new DialogInterface.OnClickListener() {

            @Override
            public void onClick(DialogInterface dialog, int which) {

                SparseBooleanArray sp = listView.getCheckedItemPositions();

                String str="";
                for(int i=0;i<sp.size();i++)
                {
                    str += items.get(sp.indexOfKey(sp.keyAt(i))) + ",";
                }
                Log.i("TAG", "" + str );

                dialog.cancel();
            }
        });

        builder.setOnCancelListener(this);
        builder.show();
        return true;
    }

    public void setItems(List<String> items, String allText, int position,
            MultiSpinnerListener listener) {

        this.items = items;
        this.defaultText = allText;
        this.listener = listener;

        // all selected by default
        selected = new boolean[items.size()];
        for (int i = 0; i < selected.length; i++)
            selected[i] = false;    

        if(position != -1)
        {
            selected[position] = true;
            listener.onItemsSelected(selected);

            onCancel(null);
        }

    }

    public interface MultiSpinnerListener {
        public void onItemsSelected(boolean[] selected);
    }

//  // Adapter Class            

}

None

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

具有 SearchView 功能的 Android MultiChoice Spinner 的相关文章

随机推荐

  • 针对测试数据库集成测试 Web 服务

    我目前正在构建一个 net Web 应用程序 它使用 WCF Web 服务来允许 Flex 前端访问数据库 我正在 Web 服务上设置一些单元 集成样式测试 并试图找出允许测试访问和修改单独测试数据库中的数据的最佳方法 目前 我的单元测试项
  • Vb.Net - 动态更改文本框背景色的类

    我想知道如何创建一个类来更改表单内每个文本框的背景颜色 更具体 当文本框为空时 文本框背景颜色等于白色 当文本框获得焦点时 文本框的背景颜色发生变化 当文本框有任何文本时 文本框背景颜色会改变 当文本框失去焦点时 文本框的背景颜色会发生变化
  • 在构建我的 C# 项目时,出现“在未引用的程序集中定义”错误,如何解决?

    我已经引用了 System 和 System Data 1 类型 System ComponentModel IListSource 在未引用的程序集中定义 您必须添加对程序集的引用 系统 版本 2 0 0 0 文化 中性 PublicKe
  • 未使用准备好的语句存储数据

    我刚刚学习使用准备好的语句并卡在这里 用正常方法是没有问题的 没有显示任何错误 但数据未存储在数据库中 尽管它显示 已输入数据 db new mysqli localhost root learndb if db gt connect er
  • MySQL 查找每个邮政编码中最贵的

    我有一个名为 产品 的表 其架构 名称 城市 州 邮政编码价格 我想找到给定州的每个邮政编码的最昂贵产品的名称 I wrote SELECT zip code MAX price FROM products WHERE products s
  • 如果一个任务失败则继续执行ant脚本

    我有一个 Ant 脚本 它运行测试然后将我的应用程序部署到 QA 服务器 要部署应用程序 它首先调用sun appserv undeploy 由于各种原因 应用程序可能会也可能不会部署 如果应用程序未部署 则取消部署将失败并且整个脚本将停止
  • 是否可以在不使用临时文件的情况下在批处理文件中嵌入并执行 VBScript?

    人们长期以来一直在批处理文件中嵌入和执行 VBScript 但我见过的所有已发布的解决方案 最初提出这个问题时 涉及写入临时 VBS 文件 例如 在 Windows 批处理文件中嵌入 VBScript 是否可以在批处理中执行嵌入的 VBSc
  • 如何对列表中彼此在 n 以内的元素进行分组

    我有两个清单 list 1 list 2 1 0 3 0 3 15 1 03 6 0 7 0 我想对这个列表进行排序并合并其中的元素 在本例中 0 15彼此的 所以到这结束的时候 list 1其中包含以下值 1 0 1 03 3 0 3 1
  • 在 Rnw 中使用 ggvis 和 knit

    我想知道我是否可以在 Rnw 中使用 ggvis 和 knit 我尝试了以下代码RStudio Version 0 98 1091 但它不起作用 documentclass book usepackage T1 fontenc usepac
  • 具有自定义布局和自定义菜单项的 ActionBar

    我想通过 put 制作自定义操作栏ImageView在中间 并在操作栏的右侧有另一个带有一些信息的图标 如下所示 我已经可以在中间制作 imageview 但问题是 当我膨胀布局时onCreateOptionMenu 并设置showAsAc
  • 如何将事件处理程序委托转换为具有不同签名的事件处理程序委托

    我正在编写的代码实际上是一个 WPF 行为 用于从网格控件中获取所选项目 众所周知 SelectedItems 不是可绑定属性 我实际上使用的是 Telerik RadGridView 但我希望行为对于具有 SelectionChanged
  • Android - “无法加载 Foo:findLibrary 返回 null”

    我知道已经有关于堆栈溢出的错误的帖子 但是从我在 SO 和 Google 上找到的内容来看 与我的问题不符 我正在尝试运行我的应用程序 但是每当调用本机函数时我的程序就会崩溃 并且我得到以下信息LogCat 08 01 09 15 57 4
  • SQL Case Order 按特定顺序

    好吧 我以前问过类似的问题 但我研究过 但没有具体找到这个 我有一个表 需要按字段 OptionName NVarChar 和 IsActive BIT 进行排序 对于 DDL 我需要结果按以下顺序排列 Option A Option B
  • Excel VBA 中出现 Double 类型溢出错误

    我在 Excel VBA 中遇到了溢出错误 并且无法找到解决方法 虽然 Microsoft 的文档表明双精度数的范围应达到 1 8E308 但我收到了明显低于该阈值的数字的溢出错误 我的代码如下 Public Function Fixed
  • Xamarin.Forms v3 中的 MasterDetail + 从右到左

    我正在使用从右到左的新表单功能 除了 MasterDetail 汉堡菜单图标外 它运行良好 它保留在左侧 当本地化发生更改时 我需要将其移至右侧 有什么想法或者有人可以帮助我使用自定义渲染器吗 也不是不可能 但需要一些肮脏的编码 请在此处检
  • 如何旋转 pandas 图中的 x 轴刻度标签

    使用以下代码 import matplotlib matplotlib style use ggplot import matplotlib pyplot as plt import pandas as pd df pd DataFrame
  • LSTM 时间序列会产生偏移预测吗?

    我正在使用 LSTM NN 和 Keras 进行时间序列预测 作为输入特征 有两个变量 降水量和温度 要预测的一个目标是地下水位 尽管实际数据和输出之间存在严重的偏移 见图 但它似乎工作得很好 现在我读到这可能是网络无法正常工作的典型标志
  • 在 mac os 上的 nasm 中编译汇编程序

    所以 我写了一些关于asm的指令 并编译它们 nasm f macho test asm 现在 nasm生成obj文件 test o gcc test o 返回下一个错误 ld 警告 忽略文件 test o 文件是为不受支持的文件构建的 不
  • Hibernate 二级缓存不适用于 OneToOne 关联

    我正在尝试启用 Hibernate 二级缓存 但无法避免为一对一关系发出多个查询 我的模型是 Entity Cache usage CacheConcurrencyStrategy READ WRITE public class Busin
  • 具有 SearchView 功能的 Android MultiChoice Spinner

    希望你一切顺利 我遇到了要实施的问题Search功能在MultiChoice Spinner 正如我所实施的多项选择旋转器在那个使用的AlertDialog显示多项选择项 添加过滤器功能有两个选项 Add EditText在 AlertDi