在android中将选定值设置为多选微调器

在android中将选定值设置为多选微调器,android,android-spinner,multi-select,Android,Android Spinner,Multi Select,我正在开发一个android应用程序,我需要给多选择微调器指定周/月名称。用户将从spinner中选择多天并将其发送到服务器。如果他想编辑他应该能够编辑的选定日期,这是我的要求。 为此,我在下面发布了多选微调器的代码 现在的问题是,当用户想要编辑所选日期时,我成功地从服务器获取了所选日期,但我无法在spinner中将其显示为所选日期。 我试过spinner.SetelectList,但运气不好。我得到空指针异常。 请查看我下面的代码并帮助我 多选微调器代码 public class MultiS

我正在开发一个android应用程序,我需要给多选择微调器指定周/月名称。用户将从spinner中选择多天并将其发送到服务器。如果他想编辑他应该能够编辑的选定日期,这是我的要求。 为此,我在下面发布了多选微调器的代码

现在的问题是,当用户想要编辑所选日期时,我成功地从服务器获取了所选日期,但我无法在spinner中将其显示为所选日期。 我试过spinner.SetelectList,但运气不好。我得到空指针异常。 请查看我下面的代码并帮助我

多选微调器代码

public class MultiSelectionSpinner extends AppCompatSpinner implements
    DialogInterface.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 MultiSelectionSpinner(Context context) {
    super(context);

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

public MultiSelectionSpinner(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) {
        mSelection[which] = isChecked;
        simple_adapter.clear();
        simple_adapter.add(buildSelectedItemString());
    } else {
        throw new IllegalArgumentException(
                "Argument 'which' is out of bounds.");
    }
}

@Override
public boolean performClick() {
    AlertDialog.Builder builder = new AlertDialog.Builder(getContext(), R.style.TimePickerTheme);
    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 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();
}
}
我使用下面的代码将它们转换为列表

List<String> result; 
 result=Arrays.asList(timeIntervaloptions.split(","));
 addEventRepeatWeekSpinner.setSelection(result);
现在,我尝试使用下面的代码将此输出设置为Spinner

List<String> result; 
 result=Arrays.asList(timeIntervaloptions.split(","));
 addEventRepeatWeekSpinner.setSelection(result);
当上面的代码运行时,我得到以下错误

 java.lang.NullPointerException: Attempt to get length of null array
at com.venkat.office.office.MultiSelectionSpinner.setSelection(MultiSelectionSpinner.java:173)
                                                 at com.venkat.office.office.executive.Main2Activity$4.onResponse(Main2Activity.java:644)
主活动中的第644行是addEventRepeatWeekSpinner.setSelectionresult


任何帮助都将非常感谢

尝试按如下方式在数组列表中添加所有内容:

List<String> result = new ArrayList<>();
result.addAll(Arrays.asList(timeIntervaloptions.split(",")));
使用此代码

  public class MultiSpinner extends Spinner implements 
     DialogInterface.OnMultiChoiceClickListener, 
      DialogInterface.OnCancelListener {

    private List<String> items;
    private boolean[] selected;
    private String defaultText;    
    private int position;
    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();
        boolean someUnselected = false;
        for (int i = 0; i < items.size(); i++) {
            if (selected[i]) {
                spinnerBuffer.append(items.get(i));
                spinnerBuffer.append(", ");
            } else {
                someUnselected = true;
            }
        }
        String spinnerText;
        if (someUnselected) {
            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_spinner_item,
            new String[] { spinnerText });
        setAdapter(adapter);

    }

    @Override
    public boolean performClick() {
        AlertDialog.Builder builder = new AlertDialog.Builder(getContext());
        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();
        return true;
    }

    public void setItems(List<String> items, String allText, int position) {
        this.items = items;
        this.defaultText = allText;       

        this.position=position;
        // all selected by default
        selected = new boolean[items.size()];
        for (int i = 0; i < selected.length; i++){            
            selected[i] = true;                              
        }

        // all text on the spinner
        ArrayAdapter<String> adapter = new ArrayAdapter<>(getContext(),
            android.R.layout.simple_spinner_item, new String[] { allText });
        setAdapter(adapter);
    }


}
并设置适配器和调用set items方法

   String spinnerText="";
   List<String> tempList = new ArrayList<>();
   for(YourDto yourDto:DtoList){
    tempCategoryList.add(yourDto.getName());
    if(yourDto.isSelected()){
     spinnerText+=yourDto.getName()+",";
     }
   }

    if(spinnerText.equals("")){
         spinnerText="Select";
     }

     if (spinnerText.endsWith(",")) {
     spinnerText = spinnerText.substring(0, spinnerText.length() - 1);
      }   
   ArrayAdapter<String> myAdapter = new ArrayAdapter<>(context, 
   R.layout.textview_layout, tempList.toArray(new 
   String[tempList.size()]));

   myAdapter.setDropDownViewResource(R.layout.spinner_divider);
   holder.yourSpinner.setAdapter(myAdapter);
   holder.yourSpinner.setItems(tempList, spinnerText,position);

也许这对你有帮助

谢谢回复@Aj 27。。。我试过你说的方法,但没有成功。。我仍然得到同样的错误。。。java.lang.NullPointerException:尝试获取应答的null ArrayTanks的长度!!!我在活动而不是适配器类中实现我的逻辑,我如何获得位置值??你能给我解释一下吗…??如果你是从活动中实现的意思是不使用位置,只需删除该参数。position参数仅用于更新适配器值。