그래서 두 개의 스피너가 있습니다. 첫 번째 스피너 Parent (account_type_spinner)와 두 번째 스피너 인 Child (account_name_spinner)를 호출합니다. 부모의안드로이드는 "부모"회 전자의 선택에 따라 회 전자를 업데이트합니다 - .notifyDataSetChange()가 실행되지 않습니까?
이//---define spinner objects as variables, assign adapters and listeners---
account_type_spinner = (Spinner) findViewById(R.id.account_type_spinner);
account_type_adapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, account_type_array);
account_type_adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
account_type_spinner.setAdapter(account_type_adapter);
account_type_spinner.setOnItemSelectedListener(new SpinnerSelectionListener());
account_name_spinner = (Spinner) findViewById(R.id.account_name_spinner);
account_name_adapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, account_name_array);
account_name_adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
account_name_spinner.setAdapter(account_name_adapter);
선택 : 다음 코드 아동 (account_name_spinner)에 대한 ArrayAdapter와 초기화를주의하십시오, 나는 그것을 문자열 내가 이전에 다음 코드 줄 전에 쿼리 계정 이름의 배열 (account_name_array)를 공급하고있다 spinner가 OnItemSelectedListener를 구현하는 클래스 인 "SpinnerSelectionListener"를 트리거합니다. 분명히이 클래스 화재 선택은 부모의 회 전자에서 만든 각각의 시간과 코드는 다음과 같습니다 : 위의 코드는 수입 또는 비용 계정을 가진 아동 (account_name_spinner)를 업데이트해야
public class SpinnerSelectionListener implements OnItemSelectedListener {
public void onItemSelected(AdapterView<?> parent,
View view, int pos, long id) {
String spinner_selection = parent.getItemAtPosition(pos).toString();
if(spinner_selection.contentEquals(INCOME)) {
//---grab Income type accounts from db and build array---
db.open();
account_name_array = db.getAccounts(INCOME);
account_name_adapter.notifyDataSetChanged();
dr_amount_textview.setVisibility(View.GONE);
dr_amount.setVisibility(View.GONE);
cr_amount_textview.setVisibility(View.VISIBLE);
cr_amount.setVisibility(View.VISIBLE);
db.close();
} else {
//---grab Expense type accounts from db and build array---
db.open();
account_name_array = db.getAccounts(EXPENSE);
account_name_adapter.notifyDataSetChanged();
cr_amount_textview.setVisibility(View.GONE);
cr_amount.setVisibility(View.GONE);
dr_amount_textview.setVisibility(View.VISIBLE);
dr_amount.setVisibility(View.VISIBLE);
db.close();
}
}
public void onNothingSelected(AdapterView<?> parent) {
// Do nothing.
}
}
마다에서 부모의 선택이 변경 EXPINSE INCOME 또는 그 반대로 (이것은 회계 응용 프로그램입니다). 하위 창의 회 전자 목록 업데이트는 "account_name_adapter.notifyDataSetChanged();"에 의해 촉진되어야합니다. 그러나 아무것도 일어나지 않고있다.
StackOverflow에서이 문제를 조사한 결과 목록이 업데이트되기 전에 내 Child 's ArrayAdapter (account_name_adapter)의 항목을 .clear() 또는 .remove()해야한다는 것을 알았지 만 "account_name_adapter.clear); " ArrayAdapter에 알리기 전에 작업이 잘못되었다는 오류가 발생합니다. 내가 뭘 잘못하고 있는거야?
정말로 새로운 어댑터를 만들고 재 지정해야합니까? 나는 데이터를 변경할 수없고 원래 어댑터에 알릴 수 없다는 것에 상당히 놀랐다. 이것이 왜 있는지 아십니까? – AutoM8R
나는 똑같은 일을 찾고 있었고, 해결책으로 채택 된 것의 재 할당 만 발견했습니다. 나는 알고있다, 나는 너무 놀랐다. ... – BrainCrash
대답 해 주셔서 감사합니다, 이것에 대해서 저는 결코 혼자서 생각해 내지 못했을 것입니다. 이것은 매우 놀랍습니다. 사실, 나는 이것이 어제 다른 곳에서 제안 된 것을 본 것으로 믿고 나는 그것이 틀렸다고 완전히 생각했다. 따라서이 답변을보고 가짜라고 생각하면 불행하지 않습니다. – AutoM8R