我正在开发一个Android应用程序,我需要给出具有周/月名称的多选微调器。用户将从微调器中选择多天并将其发送到服务器。如果他想编辑他应该能够编辑的选定日期,这是我的要求。 为此我得到了Multi select Spinner的代码,我在下面发布了这个代码。
现在的问题是,当用户想要编辑所选日期时,我将成功从服务器获取所选日期,但我无法在微调器中显示它们。
我试过spinner.setSelecetd(list)
但没有运气。我得到Null指针异常。
请看下面的代码并帮助我......
MultiSelectSpinner代码
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();
}
}
我从服务器中选择了值,如下所示
Jan,Jun,Sep
我使用下面的代码将它们转换为List
List<String> result;
result=Arrays.asList(timeIntervaloptions.split(","));
转换后的输出
[Jan, Jun, Sep]
现在我尝试使用下面的代码
将此输出设置为Spinner 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.setSelection(result);
任何帮助都会非常感谢!!!!
答案 0 :(得分:1)
使用此代码
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);
这可能对你有所帮助!!!
答案 1 :(得分:0)
尝试在数组列表中添加all,如下所示:
List<String> result = new ArrayList<>();
result.addAll(Arrays.asList(timeIntervaloptions.split(",")));