1

制限を超過すると、私は選択を解除しようとしています。以下のコードでは、最大選択制限を超えるとトーストを達成できます。限界を超えたときに項目を無効にするか選択を解除しようとしていますが、機能していません。制限がMultiSelection Spinner Androidで超過するとアイテム選択を無効にする方法

public class MultiSelectionSpinner1 extends Spinner implements 
     OnMultiChoiceClickListener { 

    public interface OnMultipleItemsSelectedListener{ 
     void selectedIndices(List<Integer> indices); 
     void selectedStrings(List<String> strings); 
    } 
    private OnMultipleItemsSelectedListener listener; 

    String[] _items = null; 
    boolean[] mSelection = null; 
    boolean[] mSelectionAtStart = null; 
    String _itemsAtStart = null; 

    ArrayAdapter<String> simple_adapter; 

    public MultiSelectionSpinner1(Context context) { 
     super(context); 
     simple_adapter = new ArrayAdapter<>(context, 
       android.R.layout.simple_spinner_item); 
     super.setAdapter(simple_adapter); 
    } 

    public MultiSelectionSpinner1(Context context, AttributeSet attrs) { 
     super(context, attrs); 

     simple_adapter = new ArrayAdapter<>(context, 
       android.R.layout.simple_spinner_item); 
     super.setAdapter(simple_adapter); 
    } 

    public void setListener(OnMultipleItemsSelectedListener listener){ 
     this.listener = listener; 
    } 

    public void onClick(DialogInterface dialog, int which, boolean isChecked) { 
     if (mSelection != null && which < mSelection.length) { 
      Log.e("_items.length", "_items.length" + _items.length); 
      Log.e("_itemsAtStart", "_itemsAtStart" + _itemsAtStart); 


//   listener.selectedStrings(getSelectedStrings()); 
      if(getSelectedIndices().size()<3){ 
       mSelection[which] = isChecked; 
       simple_adapter.clear(); 
       simple_adapter.add(buildSelectedItemString()); 
      }else 
      { 
       Toast.makeText(getContext(),"Exceeds",Toast.LENGTH_SHORT).show(); 
       setDiselection(which); 

      } 
      //listener.selectedIndices(getSelectedIndices()); 
     } else { 
      throw new IllegalArgumentException(
        "Argument 'which' is out of bounds."); 
     } 
    } 


    @Override 
    public boolean performClick() { 
     AlertDialog.Builder builder = new AlertDialog.Builder(getContext()); 
     builder.setTitle("Please select!!!"); 
     builder.setMultiChoiceItems(_items, mSelection, this); 
     _itemsAtStart = getSelectedItemsAsString(); 
     builder.setPositiveButton("Submit", new DialogInterface.OnClickListener() { 
      @Override 
      public void onClick(DialogInterface dialog, int which) { 
       System.arraycopy(mSelection, 0, mSelectionAtStart, 0, mSelection.length); 
       listener.selectedIndices(getSelectedIndices()); 
       listener.selectedStrings(getSelectedStrings()); 
      } 
     }); 
     builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() { 
      @Override 
      public void onClick(DialogInterface dialog, int which) { 
       simple_adapter.clear(); 
       simple_adapter.add(_itemsAtStart); 
       System.arraycopy(mSelectionAtStart, 0, mSelection, 0, mSelectionAtStart.length); 
      } 
     }); 
     builder.show(); 
     return true; 
    } 

    @Override 
    public void setAdapter(SpinnerAdapter adapter) { 
     throw new RuntimeException(
       "setAdapter is not supported by MultiSelectSpinner."); 
    } 

    public void setItems(String[] items) { 
     _items = items; 
     mSelection = new boolean[_items.length]; 
     mSelectionAtStart = new boolean[_items.length]; 
     simple_adapter.clear(); 
     simple_adapter.add(_items[0]); 
     Arrays.fill(mSelection, false); 
     mSelection[0] = true; 
     mSelectionAtStart[0] = true; 
    } 

    public void setItems(List<String> items) { 
     _items = items.toArray(new String[items.size()]); 
     mSelection = new boolean[_items.length]; 
     mSelectionAtStart = new boolean[_items.length]; 
     simple_adapter.clear(); 
     simple_adapter.add(_items[0]); 
     Arrays.fill(mSelection, false); 
     mSelection[0] = true; 
    } 

    public void setSelection(String[] selection) { 
     for (int i = 0; i < mSelection.length; i++) { 
      mSelection[i] = false; 
      mSelectionAtStart[i] = false; 
     } 
     for (String cell : selection) { 
      for (int j = 0; j < _items.length; ++j) { 
       if (_items[j].equals(cell)) { 
        mSelection[j] = true; 
        mSelectionAtStart[j] = true; 
       } 
      } 
     } 
     simple_adapter.clear(); 
     simple_adapter.add(buildSelectedItemString()); 
    } 

    public void setSelection(List<String> selection) { 
     for (int i = 0; i < mSelection.length; i++) { 
      mSelection[i] = false; 
      mSelectionAtStart[i] = false; 
     } 
     for (String sel : selection) { 
      for (int j = 0; j < _items.length; ++j) { 
       if (_items[j].equals(sel)) { 
        mSelection[j] = true; 
        mSelectionAtStart[j] = true; 
       } 
      } 
     } 
     simple_adapter.clear(); 
     simple_adapter.add(buildSelectedItemString()); 
    } 

    public void setSelection(int index) { 
     for (int i = 0; i < mSelection.length; i++) { 
      mSelection[i] = false; 
      mSelectionAtStart[i] = false; 
     } 
     if (index >= 0 && index < mSelection.length) { 
      mSelection[index] = true; 
      mSelectionAtStart[index] = true; 
     } else { 
      throw new IllegalArgumentException("Index " + index 
        + " is out of bounds."); 
     } 
     simple_adapter.clear(); 
     simple_adapter.add(buildSelectedItemString()); 
    } 

    public void setDiselection(int index) { 

     if (index >= 0 && index < mSelection.length) { 
      mSelection[index] = false; 
      mSelectionAtStart[index] = false; 

     } else { 
      throw new IllegalArgumentException("Index " + index 
        + " is out of bounds."); 
     } 
     simple_adapter.clear(); 
     simple_adapter.notifyDataSetChanged(); 
     simple_adapter.add(buildSelectedItemString()); 
    } 

    public void setSelection(int[] selectedIndices) { 
     for (int i = 0; i < mSelection.length; i++) { 
      mSelection[i] = false; 
      mSelectionAtStart[i] = false; 
     } 
     for (int index : selectedIndices) { 
      if (index >= 0 && index < mSelection.length) { 
       mSelection[index] = true; 
       mSelectionAtStart[index] = true; 
      } else { 
       throw new IllegalArgumentException("Index " + index 
         + " is out of bounds."); 
      } 
     } 
     simple_adapter.clear(); 
     simple_adapter.add(buildSelectedItemString()); 
    } 

    public List<String> getSelectedStrings() { 
     List<String> selection = new LinkedList<>(); 
     for (int i = 0; i < _items.length; ++i) { 
      if (mSelection[i]) { 
       selection.add(_items[i]); 
      } 
     } 
     return selection; 
    } 

    public List<Integer> getSelectedIndices() { 
     List<Integer> selection = new LinkedList<>(); 
     for (int i = 0; i < _items.length; ++i) { 
      if (mSelection[i]) { 
       selection.add(i); 
      } 
     } 
     return selection; 
    } 

    private String buildSelectedItemString() { 
     StringBuilder sb = new StringBuilder(); 
     boolean foundOne = false; 

     for (int i = 0; i < _items.length; ++i) { 
      if (mSelection[i]) { 
       if (foundOne) { 
        sb.append(", "); 
       } 
       foundOne = true; 

       sb.append(_items[i]); 
      } 
     } 
     return sb.toString(); 
    } 

    public String getSelectedItemsAsString() { 
     StringBuilder sb = new StringBuilder(); 
     boolean foundOne = false; 

     for (int i = 0; i < _items.length; ++i) { 
      if (mSelection[i]) { 
       if (foundOne) { 
        sb.append(", "); 
       } 
       foundOne = true; 
       sb.append(_items[i]); 
      } 
     } 
     return sb.toString(); 
    } 
} 

答えて

5

これを試してください。あなたのpublic void setDeselection(int index)とpublic boolean performClick()メソッドを変更しました。

public class MultiSelectSpinner1 extends Spinner implements 
    DialogInterface.OnMultiChoiceClickListener { 

    private static final String TAG = MultiSelectSpinner1.class.getSimpleName(); 
    String[] _items = null; 
    boolean[] mSelection = null; 
    boolean[] mSelectionAtStart = null; 
    String _itemsAtStart = null; 

    ArrayAdapter<String> simple_adapter; 
    private OnMultipleItemsSelectedListener listener; 

    AlertDialog alertDialog; 

    public MultiSelectSpinner1(Context context) { 
     super(context); 
     simple_adapter = new ArrayAdapter<>(context, 
      android.R.layout.simple_spinner_item); 
     super.setAdapter(simple_adapter); 
    } 

    public MultiSelectSpinner1(Context context, AttributeSet attrs) { 
     super(context, attrs); 

     simple_adapter = new ArrayAdapter<>(context, 
      android.R.layout.simple_spinner_item); 
     super.setAdapter(simple_adapter); 
    } 

    public void setListener(OnMultipleItemsSelectedListener listener) 
    { 
     this.listener = listener; 
    } 

    public void onClick(DialogInterface dialog, int which, boolean isChecked) { 
     if (mSelection != null && which < mSelection.length) { 
      Log.e("_items.length", "_items.length" + _items.length); 
      Log.e("_itemsAtStart", "_itemsAtStart" + _itemsAtStart); 


      if (getSelectedIndices().size() < 3) { 
       mSelection[which] = isChecked; 
       simple_adapter.clear(); 
       simple_adapter.add(buildSelectedItemString()); 
      } else { 
       Toast.makeText(getContext(),"Exceeds",Toast.LENGTH_SHORT).show(); 
       setDeselection(which); 

      } 
     } else { 
      throw new IllegalArgumentException(
       "Argument 'which' is out of bounds."); 
     } 
    } 

    @Override 
    public boolean performClick() { 
     buildDialogue(); 
     return true; 
    } 

    private void buildDialogue() { 
     if(alertDialog!=null&&alertDialog.isShowing()) 
      alertDialog.dismiss(); 

     AlertDialog.Builder builder = new  AlertDialog.Builder(getContext()); 
     builder.setTitle("Please select!!!"); 
     builder.setMultiChoiceItems(_items, mSelection, this); 
     _itemsAtStart = getSelectedItemsAsString(); 
     builder.setPositiveButton("Submit", new DialogInterface.OnClickListener() { 
      @Override 
      public void onClick(DialogInterface dialog, int which) { 
       System.arraycopy(mSelection, 0, mSelectionAtStart, 0, mSelection.length); 
       if (listener != null) { 
        listener.selectedIndices(getSelectedIndices()); 
        listener.selectedStrings(getSelectedStrings()); 
       } 
      } 
     }); 
     builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() { 
      @Override 
      public void onClick(DialogInterface dialog, int which) { 
       simple_adapter.clear(); 
       simple_adapter.add(_itemsAtStart); 
       System.arraycopy(mSelectionAtStart, 0, mSelection, 0, mSelectionAtStart.length); 
      } 
     }); 
     alertDialog = builder.create(); 
     alertDialog.show(); 
    } 

    @Override 
    public void setAdapter(SpinnerAdapter adapter) { 
     throw new RuntimeException(
      "setAdapter is not supported by MultiSelectSpinner."); 
    } 

    public void setItems(String[] items) { 
     _items = items; 
     mSelection = new boolean[_items.length]; 
     mSelectionAtStart = new boolean[_items.length]; 
     simple_adapter.clear(); 
     simple_adapter.add(_items[0]); 
     Arrays.fill(mSelection, false); 
     mSelection[0] = true; 
     mSelectionAtStart[0] = true; 
    } 

    public void setItems(List<String> items) { 
     _items = items.toArray(new String[items.size()]); 
     mSelection = new boolean[_items.length]; 
     mSelectionAtStart = new boolean[_items.length]; 
     simple_adapter.clear(); 
     simple_adapter.add(_items[0]); 
     Arrays.fill(mSelection, false); 
     mSelection[0] = true; 
    } 

    public void setSelection(String[] selection) { 
     for (int i = 0; i < mSelection.length; i++) { 
      mSelection[i] = false; 
      mSelectionAtStart[i] = false; 
     } 
     for (String cell : selection) { 
      for (int j = 0; j < _items.length; ++j) { 
       if (_items[j].equals(cell)) { 
        mSelection[j] = true; 
        mSelectionAtStart[j] = true; 
       } 
      } 
     } 
     simple_adapter.clear(); 
     simple_adapter.add(buildSelectedItemString()); 
    } 

    public void setSelection(List<String> selection) { 
     for (int i = 0; i < mSelection.length; i++) { 
      mSelection[i] = false; 
      mSelectionAtStart[i] = false; 
     } 
     for (String sel : selection) { 
      for (int j = 0; j < _items.length; ++j) { 
       if (_items[j].equals(sel)) { 
        mSelection[j] = true; 
        mSelectionAtStart[j] = true; 
       } 
      } 
     } 
     simple_adapter.clear(); 
     simple_adapter.add(buildSelectedItemString()); 
    } 

    public void setSelection(int index) { 
     for (int i = 0; i < mSelection.length; i++) { 
      mSelection[i] = false; 
      mSelectionAtStart[i] = false; 
     } 
     if (index >= 0 && index < mSelection.length) { 
      mSelection[index] = true; 
      mSelectionAtStart[index] = true; 
     } else { 
      throw new IllegalArgumentException("Index " + index 
       + " is out of bounds."); 
     } 
     simple_adapter.clear(); 
     simple_adapter.add(buildSelectedItemString()); 
    } 

    public void setDeselection(int index) { 
     Log.d(TAG, "setDeselection() called with: " + "index = [" + index + "]"); 

     if (index >= 0 && index < mSelection.length) { 
      mSelection[index] = false; 
      mSelectionAtStart[index] = false; 

     } else { 
      throw new IllegalArgumentException("Index " + index 
       + " is out of bounds."); 
     } 
     simple_adapter.clear(); 
     simple_adapter.notifyDataSetChanged(); 
     simple_adapter.add(buildSelectedItemString()); 

     buildDialogue(); 
    } 

    public void setSelection(int[] selectedIndices) { 
     for (int i = 0; i < mSelection.length; i++) { 
      mSelection[i] = false; 
      mSelectionAtStart[i] = false; 
     } 
     for (int index : selectedIndices) { 
      if (index >= 0 && index < mSelection.length) { 
       mSelection[index] = true; 
       mSelectionAtStart[index] = true; 
      } else { 
       throw new IllegalArgumentException("Index " + index 
        + " is out of bounds."); 
      } 
     } 
     simple_adapter.clear(); 
     simple_adapter.add(buildSelectedItemString()); 
    } 

    public List<String> getSelectedStrings() { 
     List<String> selection = new LinkedList<>(); 
     for (int i = 0; i < _items.length; ++i) { 
      if (mSelection[i]) { 
       selection.add(_items[i]); 
      } 
     } 
     return selection; 
    } 

    public List<Integer> getSelectedIndices() { 
     List<Integer> selection = new LinkedList<>(); 
     for (int i = 0; i < _items.length; ++i) { 
      if (mSelection[i]) { 
       selection.add(i); 
      } 
     } 
     return selection; 
    } 

    private String buildSelectedItemString() { 
     StringBuilder sb = new StringBuilder(); 
     boolean foundOne = false; 

     for (int i = 0; i < _items.length; ++i) { 
      if (mSelection[i]) { 
       if (foundOne) { 
        sb.append(", "); 
       } 
       foundOne = true; 

       sb.append(_items[i]); 
      } 
     } 
     return sb.toString(); 
    } 

    public String getSelectedItemsAsString() { 
     StringBuilder sb = new StringBuilder(); 
     boolean foundOne = false; 

     for (int i = 0; i < _items.length; ++i) { 
      if (mSelection[i]) { 
       if (foundOne) { 
        sb.append(", "); 
       } 
       foundOne = true; 
       sb.append(_items[i]); 
      } 
     } 
     return sb.toString(); 
    } 

    public interface OnMultipleItemsSelectedListener { 
     void selectedIndices(List<Integer> indices); 

     void selectedStrings(List<String> strings); 
    } 
} 
+0

これは非常に良好です。私は問題があります 。私は2〜3の複数の選択スピナーを持っているレイアウトを持っています。私は1つの提出ボタンも持っています。私の疑問は、どのように私は各スピナーのための選択値を得ることができますです。そして、私はこれらの値を保存しなければなりません。だから私は選択した値を得ることができます。どのように私は選択されたユーザーであるか知るようになることができます。私は 'public void selectedStrings(List strings)'で選択した値を取得していますが、私はどの値が私の第1スピナーと第2スピナーと第3スピナー。何か考えていますか? –

+0

チャーム感謝のように働いています.. –

関連する問題