Java 在Android活动中像工厂模式一样传递类属性
我正在做这个活动,我有一堆动态微调器。为了设置其中每一个的项目,我为每个SpinnerAdapter设置了一个列表属性 为了管理要更新的微调器项,我创建了一个私有方法,该方法应该像工厂模式一样工作,但只返回需要更新的特定微调器的列表 在我看来(至少在objective-c中是这样认为的),这个代码应该是有效的Java 在Android活动中像工厂模式一样传递类属性,java,android,attributes,nullpointerexception,factory,Java,Android,Attributes,Nullpointerexception,Factory,我正在做这个活动,我有一堆动态微调器。为了设置其中每一个的项目,我为每个SpinnerAdapter设置了一个列表属性 为了管理要更新的微调器项,我创建了一个私有方法,该方法应该像工厂模式一样工作,但只返回需要更新的特定微调器的列表 在我看来(至少在objective-c中是这样认为的),这个代码应该是有效的 package com.package.demo; import java.util.ArrayList; import java.util.Arrays; import java.ut
package com.package.demo;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.ArrayAdapter;
import android.widget.Spinner;
import android.widget.SpinnerAdapter;
public class SomeActivity extends Activity implements OnItemSelectedListener {
private int activitySpinners[] = {
R.id.spinner_a,
R.id.spinner_b,
R.id.spinner_c
};
private List<String> spinnerAdapterItemsA;
private List<String> spinnerAdapterItemsB;
private List<String> spinnerAdapterItemsC;
private List<String> teste ;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_orders);
for (int i = 0; i < this.activitySpinners.length; i++) {
int spinnerId = this.activitySpinners[i];
Spinner spinner = (Spinner) findViewById(spinnerId);
this.clearArrayAdapterItemsWithPrompt(spinnerId);
this.updateArrayAdapterItemsWithPrompt(spinnerId);
spinner.setOnItemSelectedListener(this);
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, R.layout.spinner_item, this.adapterItemsForSpinnerId(spinnerId));
adapter.setDropDownViewResource(R.layout.spinner_dropdown_item);
spinner.setAdapter(adapter);
}
}
private List<String> adapterItemsForSpinnerId(int spinnerId) {
List<String> list = null;
switch (spinnerId) {
case R.id.spinner_a:
list = this.spinnerAdapterItemsA;
break;
case R.id.spinner_b:
list = this.spinnerAdapterItemsB;
break;
case R.id.spinner_c:
list = this.spinnerAdapterItemsC;
break;
default:
return list;
}
return list;
}
private void clearArrayAdapterItemsWithPrompt(int spinnerId) {
List<String> list = this.adapterItemsForSpinnerId(spinnerId);
list = new ArrayList<String>();
}
private void updateArrayAdapterItemsWithPrompt(int spinnerId) {
Spinner spinner = (Spinner) findViewById(spinnerId);
String prompt = (String) spinner.getPrompt();
this.adapterItemsForSpinnerId(spinnerId).add(0, prompt);
}
public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) {
// TODO: Handling Stuff
}
public void onNothingSelected(AdapterView<?> parent) {
// TODO: Handling Stuff
}
}
package.com.package.demo;
导入java.util.ArrayList;
导入java.util.array;
导入java.util.List;
导入android.app.Activity;
导入android.os.Bundle;
导入android.util.Log;
导入android.view.view;
导入android.widget.AdapterView;
导入android.widget.AdapterView.OnItemSelectedListener;
导入android.widget.ArrayAdapter;
导入android.widget.Spinner;
导入android.widget.SpinnerAdapter;
公共类SomeActivity扩展活动实现OnItemSelectedListener{
私有int-ActivitySpinner[]={
R.id.spinner_a,
R.id.spinner_b,
R.id.spinner\u c
};
私有列表SpinerAdapterItemsa;
私有列表SpinerAdapterItemsB;
私有列表SpinerAdapterItemSC;
私有列表测试;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_orders);
对于(int i=0;i
但我有java空指针异常。当updateArrayAdapterItemsWithPrompt尝试设置列表的提示值时。类的问题在于“工厂属性”的setter方法。 您有空指针异常,因为没有在每个私有变量中设置新的ArrayList。要解决这个问题,您必须执行以下setter。正如hoaz所说,clearArrayAdapterItemsWithPrompt是无用的,因为它没有正确设置变量。要修复此问题,您应该执行以下代码:
private void clearArrayAdapterItemsWithPrompt(int spinnerId) {
setArrayAdapterItemsWithSpinnerId(spinnerId, new ArrayList<String>())
}
private void setArrayAdapterItemsWithSpinnerId(int spinnerId, List<String> list) {
switch (spinnerId) {
case R.id.spinner_a:
this.spinnerAdapterItemsA = list;
break;
case R.id.spinner_b:
this.spinnerAdapterItemsB = list;
break;
case R.id.spinner_c:
this.spinnerAdapterItemsC = list;
break;
default:
break;
}
private void clearArrayAdapterItemsWithPrompt(int spinnerId){
setArrayAdapterItemsWithSpinnerId(spinnerId,new ArrayList())
}
私有void setArrayAdapterItemsWithSpinnerId(int spinnerId,列表){
开关(喷丝头){
案例R.id.spinner\u a:
this.spinnerAdapterItemsA=列表;
打破
案例R.id.spinner_b:
this.spinnerAdapterItemsB=列表;
打破
案例R.id.spinner\u c:
this.spinnerAdapterItemsC=列表;
打破
违约:
打破
}
值得一提的是,可能您可能会丢失微调器的样式,可能您必须稍微编辑该方法以满足您的需要。1.
clearArrayAdapterItemsWithPrompt
没有用,它没有任何作用。我猜是您没有设置提示,因此它为空,add会抛出NPE2。不清楚源代码是什么对于NPE,您可能会传递无效的喷丝头ID
,请提供异常和堆栈跟踪