[英]Dynamic Spinner for android studios
好的,我正在創建一個將使用2個微調器的android項目。 第一個是從狀態的穩定數組列表中設置的。 第二個將列出該州的學校列表。 學校列表存儲在SQL數據庫中,並由用戶添加到學校中。 因此,一旦我通過州的價值,我就可以得到學校名單。 唯一的事情是我似乎無法避免來自schoolList的空指針。 這是頁面的代碼。 任何想法都會有所幫助。
public class Register extends AppCompatActivity implements View.OnClickListener {
Button bCancel, bRegister;
EditText etEmail, etPassword, etUserName;
Spinner stateList, schoolList;
//Scope variables strings
String uName=null,email=null,pass=null,school=null,state=null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_register);
bCancel = (Button) findViewById(R.id.bCancel);
bRegister = (Button) findViewById(R.id.bRegister);
etUserName = (EditText) findViewById(R.id.etUserName);
etPassword = (EditText) findViewById(R.id.etPassword);
etEmail = (EditText) findViewById(R.id.etEmail);
stateList = (Spinner) findViewById(R.id.stateList);
schoolList = (Spinner) findViewById(R.id.schoolList);
setState();
ArrayList<Object> defAda= new ArrayList<>();
defAda.add("Select State First");
ArrayAdapter schoollist = new ArrayAdapter<>(getApplicationContext(), android.R.layout.simple_spinner_item, defAda);
schoolList.setAdapter(schoollist);
schoolList.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
}
}
);
stateList.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
stateList = (Spinner)parent;
state=parent.getItemAtPosition(position).toString();
if (state !=null) {
setSchool(state);
schoolList.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
schoolList = (Spinner) parent;
school = parent.getItemAtPosition(position).toString();
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
}
});
}
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
}
});
bRegister.setOnClickListener(this);
bCancel.setOnClickListener(this);
}
public void setState(){
ArrayList<String> states=CCValueStore.getStatesList();
ArrayAdapter stateslist = new ArrayAdapter<>(getApplicationContext(), android.R.layout.simple_spinner_item, states);
stateList.setAdapter(stateslist);
}
public void setSchool(String state){
ArrayList<Object> schools;
ServerRequests getSchool;
getSchool = new ServerRequests(this);
schools=getSchool.getSchoolUserBackground(state, new GotSchoolCallBacks() {
@Override
public ArrayList done(ArrayList<Object> returnedSchools) {
return returnedSchools;
}
});
schools.add("Not Selected");
ArrayAdapter schoollist = new ArrayAdapter<>(getApplicationContext(), android.R.layout.simple_spinner_item, schools);
schoolList.setAdapter(schoollist);
}
@Override
public void onStart(){
super.onStart();
}
@Override
public void onStop() {
super.onStop();
}
@Override
public void onClick(View v) {
if (v.getId() == R.id.bCancel) {
startActivity(new Intent(this, logIn.class));
}
if (v.getId() == R.id.bRegister) {
uName = etUserName.getText().toString();
pass = etPassword.getText().toString();
email = etEmail.getText().toString();
state = stateList.getSelectedItem().toString();
school = schoolList.getSelectedItem().toString();
CCuser UserData = new CCuser(uName, pass, email, state, school);
boolean success = registerUser(UserData);
if (success) {
ServerRequests registered;
registered = new ServerRequests(this);
registered.storeUserDataBackground(UserData, new StoreUser() {
@Override
public void done(boolean isOk) {
}
});
startActivity(new Intent(this, logIn.class));
}
}
}
public boolean registerUser(final CCuser userData) {
boolean forward= Boolean.parseBoolean(null);
final String[] chkE = new String[1]; final String[] chkN = new String[1];
final ServerRequests chkUser = new ServerRequests(this);
chkUser.fetchUserDataByName(userData, new CheckUserName() {
@Override
public void done(CCuser returnedUser) {
chkN[0] = returnedUser.uName;
}
});
chkUser.fetchUserDataByEmail(userData, new CheckUserEmail() {
@Override
public void done(CCuser returnedUser) {
chkE[0] =returnedUser.email;
}
});
if (chkN[0].equals(userData.uName))
{
AlertDialog.Builder notFound = new AlertDialog.Builder(Register.this);
notFound.setMessage("User Name already exists");
notFound.setPositiveButton("OK", null);
notFound.show();
forward=false;
}
else if (chkE[0].equals(userData.email)){
AlertDialog.Builder notFound = new AlertDialog.Builder(Register.this);
notFound.setMessage("That email is already assigned to a user");
notFound.setPositiveButton("OK", null);
notFound.show();
forward = false;
}
else if (chkN[0].equals("") && chkE[0].equals("")) {
forward = true;
}
return forward;
}
}
為什么不嘗試將數據加載到具有狀態(作為鍵)和相應學校列表作為該鍵的條目的statesSpinner.setOnItemSelectedListener()
,然后從statesSpinner.setOnItemSelectedListener()
將正確的學校加載到新列表中並發送到SchoolsSpinnerAdapter。
我希望這能幫到您 :)
好的,問題出在我沒有張貼的東西上。 圍繞Web界面構建應用程序,我創建了一個身份驗證密鑰。 我在應用程序中命名了密鑰auth,並正在尋找appAuth進行檢索以獲得對我的Web服務器的訪問權限。 因此,空指針。 我在學校里遇到錯誤的原因僅僅是因為那是第一次訪問網絡。 一旦將發送的值與要檢索的值對齊,一切就順利進行了。
我還采用了另一種方法,創建了一個列表視圖而不是微調框,並且使用了零散數據,因為應用程序的其他部分也將使用相同的方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.