Android MultiChoice Spinner с функцией SearchView

Надеюсь, у тебя все хорошо.

Я застрял с проблемой для реализацииSearch функциональность вMultiChoice SpinnerКак я реализовалSpinner с множественным выбором во что использовалAlertDialog для отображения элементов с множественным выбором.

Существует два варианта добавления функции фильтра:

добавлятьEditText в AlertDialog для поиска.добавлятьListView а такжеEditText с пользовательским макетом.

Я пытался реализовать оба, но не получил полного решения.

ВПервый случай Я получаю Layout Like следующее изображение (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();

ВВторой случай Я создал пользовательский макет для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)

Ваш ответ на вопрос