具有SearchView功能的Android MultiChoice Spinner

时间:2015-06-09 06:40:10

标签: android android-layout android-alertdialog

希望你做得好。

我遇到了在Search中实施MultiChoice Spinner功能的问题,因为我使用AlertDialog实现Spinner with Multiple Choice来显示多项选择项。

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

  1. 在AlertDialog中添加EditText进行搜索。
  2. 使用自定义布局添加ListViewEditText
  3. 我试图实施这两项规定,但没有得到完整的解决方案。

      

    第一种情况中,我得到的布局就像下面的图像(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

      

    第二种情况中,我为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            
    
    }
    

0 个答案:

没有答案