Android MultiChoice Spinner with SearchView Functionality

匿名 (未验证) 提交于 2019-12-03 02:23:02

问题:

Hope you doing well.

I am stuck with the problem to implement Search functionality in MultiChoice Spinner, As i implemented Spinner with Multiple Choice in that used AlertDialog to display Multiple Choice Items.

There is two option for adding Filter Functionality:

  1. Add EditText in AlertDialog for search.
  2. Add ListView and EditText with Custom Layout.

I've tried to implement both but didn't get complete solution.

In First Case I am getting an Layout Like following image (EditText displaying in Bottom) and also getting problem with getFilter() which is not working with 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();

In Second Case I have created custom layout for AlertDialog as below, but in this case i can't able to remains values when second time opening dialog:

<?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>

The following code is help me also for filtering ListView but don't know how to get and remains selected values.

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              }
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!