Динамическое создание счетчика и установка его значения из SQLite
Нашел мою проверку проблемы под "Обновлением" для кода
Хорошо, у меня проблема с загрузкой правильного значения из Sqlite в мой Spinner. Вот как устроено мое приложение
мой onCreate () устанавливает счетчик с именем spinTypes:
public class MyClass extends Activity{
// local members . . .
.
.
.
//spinner
private Spinner spinTypes, spinNames = null;
// string array decl.
private String [] types, names1, names2, names3 = null;
// array adapters for string arrays
private ArrayAdapter<String> typesAdapter, names1Adapter,
names2Adapter, names3Adapter;
// create a Dbhelper object to access the db
private DbHelper mdbHelper = null;
// on create
@Override
public void onCreate(Bundle savedIstanceState){
// call to super class
// set my content view
// instantiate all members
// Dbhelper object to access the db
mdbHelper = new DbHelper(getBaseContext());
// spinners
spinTypes = (Spinner) findViewById(R.id.spin_types);
spinNames = (Spinner) findViewById(R.id.spin_names);
// get string arrays from resources and create a ArrayAdapter<string>
types = getResources().getStringArray(R.array.types);
typesAdapter = new ArrayAdapter<String>(getBaseContext(),
android.R.layout.simple_spinner_item, types);
typesAdapter. setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
// want to create a dynamic spinner based on these arrays
names1 = getResources().getStringArray(R.array.names_1);
names2 = getResources().getStringArray(R.array.names_2);
names3 = getResources().getStringArray(R.array.names_3);
// do this for all names++ arrays
names1Adapter = new ArrayAdapter<String>(getBaseContext(),
android.R.layout.simple_spinner_item, names1);
names1Adapter. setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
// etc . . . for the other two
// set the adapter for the types spinner
spinTypes.setAdapter(typesAdapter);
}
У меня есть метод создания для вставки всех моих данных в БД, который работает нормально, моя проблема в том, когда я хочу попробовать и заполнить счетчики для редактирования записи.
Приложение работает так: вы нажимаете кнопку добавления, чтобы открыть диалоговое окно, которое создает элемент списка в представлении вызова. Я использую два счетчика для его создания, один для типа, который динамически заполняет счетчик вторых имен в зависимости от типа.
когда я получаю доступ к объекту базы данных, я возвращаю строки из счетчика, но по какой-то причине, когда я создаю оператор if, проверяющий позицию строки в массиве, второй счетчик каждый раз устанавливает позицию 0.
метод, включающий оператор if, о котором я упоминал выше, выглядит так:
public void populate(){
mdbHelper.open();
// if there is an item create a cursor rowId != null
Cursor mTypes = mdbHelper.fetchItem(rowId);
if(mTypes.moveToFirst()){
String tType = mTypes.getString(mTypes.getColumnIndexOrThrow(DbAdapter.KEY_TYPE));
String tName = mTypes.getString(mTypes.getColumnIndexOrThrow(DbAdapter.KEY_NAME));
int t = spinTypes.getPosition(tType);
spinTypes.setSelection(t);
// ** this does not seem to do the job i want it to**
if(t == 0){
spinNames.setAdapter(names1Adapter); // set the adapter based on t value
int n1 = names1Adapter.getPosition(tName); // use name return from db to get pos
spinNames.setSelection(n1); // set the position
}else if(t ==1){
spinNames.setAdapter(names2Adapter);
int n2 = names1Adapter.getPosition(tName);
spinNames.setSelection(n2);
}else{
spinNames.setAdapter(names3Adapter);
int n3 = names3Adapter.getPosition(tName);
spinNames.setSelection(n3);
}
}// end populate
} // end class
Все счетчики работают, но они не заканчиваются на значении с tName, которое я возвращаю.
Может кто-нибудь помочь с этим?
** Я регистрирую имя, возвращенное из БД, и использую его, чтобы найти индекс элемента в моей ошибке, и я возвращаю правильное значение, но спиннер по умолчанию все еще равен 0 **
Кто-нибудь знает, в чем может быть моя ошибка? пожалуйста
Обновление (окончательный код опубликован ниже) Я сделал немало изменений, чтобы заставить это работать, чтобы понять, что я сделал, вы должны прочитать весь этот пост, чтобы ничего не пропустить!
добавили переменную передonCreate()
private int spinNamePos;
добавил эту строку после моей последней строкиonCreate()
// add a listener to the spinner
spinTypes.setOnItemSelectedListener(TypesListener);
и создал этот слушатель так
OnItemSelectedListener TypesListener = new OnItemSelectedListener(){
public void onItemSelected(AdapterView<?> parent, View view, int pos, long id){
// use the position of this spinner to set the second spinner
switch(pos){
case 0 :
spinNames.setAdapter(names1Adapter);
break;
//etc. . for the other two
case 1:
// etc
break;
}
case 2:
// etc
break;
}
// created an int for the position of the second spinner before calling onCreate()
// and use it to set this spinners position
spinNames.setSelection(spinNamePos);
// this value is grabbed in onSavedInstanceState() and used to set the pos when onRestoreInstanceState() is called to handle orientation changes and activity paused
}
};
Затем я изменил свойonPopulate()
работать так, вызывая новый метод, чтобы установить позицию второго счетчика
public void populate(){
mdbHelper.open();
// if there is an item create a cursor rowId != null
Cursor mTypes = mdbHelper.fetchItem(rowId);
if(mTypes.moveToFirst()){
String tType = mTypes.getString(mTypes.getColumnIndexOrThrow(DbAdapter.KEY_TYPE));
String tName = mTypes.getString(mTypes.getColumnIndexOrThrow(DbAdapter.KEY_NAME));
int t = spinTypes.getPosition(tType);
spinTypes.setSelection(t);
// call to the new method
spinNamePos = setSpinNamesPos( t, tName);
// set the position
spinNames.setSelection(spinNamePos)
}// end populate
// new method to set the position when i want to update/change the list item
private int setSpinNamesPos(int m, String name){
int pos = 0;
switch(m){
case 0:
pos = names1Adapter.getPosition(name);
break;
case 1:
pos = names2Adapter.getPosition(name);
break;
case 2:
pos = names3Adapter.getPosition(name);
break;
}
return pos;
}
Так рад видеть это работает любые вопросы или комментарии приветствуются