Android: возможно ли обновить строку MatrixCursor (как решение для сброса просмотров при повороте)
У меня возникли проблемы с ListView на основе сброса значений MatrixCursor на клавиатуре и изменения ориентации.
Курсор матрицы заполнен данными из базы данных SQL. Это сделано потому, что я хочу, чтобы исходные столбцы базы данных были строками в виде списка:
public void fillList(boolean rewrite, int rewrite pos, int) {
myCols = getColArray();
SQLiteDatabase myDB = SQLiteDatabase.openDatabase(DB_PATH + DB_NAME, null, SQLiteDatabase.OPEN_READONLY);
myCursor = myDB.query("Scoring", statCols, null, null, null, null, null);
String[] menuCols = new String[] { "_id","Item","Value"};
int []to = new int[]{R.id.listitem, R.id.listitem_value};
mc = new MatrixCursor(menuCols);
for (int i = 0; i < (mChoices.size()); i++) {
statCursor.moveToPosition(draftId);
String item = mChoices.get(i);
String valueString = "";
int valueCol = statCursor.getColumnIndex(item);
int value = statCursor.getInt(valueCol);
valueString = (String.valueOf(value));
mc.addRow(new Object[] {
i,
item,
valueString
});
}
Этот метод fillList() вызывается в моем onCreate. Этот курсор затем используется для заполнения ListView путем расширения SimpleCursorAdapter. Моя цель для фрегата - позволить пользователю щелкнуть по одному из элементов списка, в результате чего появится диалоговое окно со строкой EditText:
@Override
public void onListItemClick(ListView l, final View v, int position, long id) {
final TextView valueL = (TextView) v.findViewById(R.id.listitem_value);
String valueString = (String) valueL.getText();
int value = 100;
try {
value = Integer.parseInt(valueString);
} catch(NumberFormatException nfe) {
}
//Create dialog layout
View view = getActivity().getLayoutInflater().inflate(R.layout.numberpick_popup, null);
final EditText mInputText = (EditText) view.findViewById(R.id.myText);
//Create Dialog
AlertDialog.Builder builder = new AlertDialog.Builder(this.getActivity());
builder.setTitle(title);
builder.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
valueL.setText(mInputText.getText().toString());
return;
}
});
builder.setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
return;
}
});
builder.setView (view);
final AlertDialog dialog = builder.create ();
dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);
dialog.show();
}
Проблема, с которой я сталкиваюсь, заключается в том, что компоновка фрагмента восстанавливается при скрытой клавиатуре или изменении ориентации, вызывая вызов fillData и перезаписывая любое значение, которое я обновил в списке. Это происходит, если я выбираю ОК в диалоговом окне без предварительной минимизации клавиатуры или при любом изменении ориентации.
Я думаю, что должен быть какой-то способ перезаписать значения в MatrixCursor, когда новые данные вводятся из диалога. Однако я не знаю, возможно ли это, или если курсор даже переживет изменения состояния.
Любая помощь будет принята с благодарностью.
1 ответ
Я работал над этим, создав HashMap пар ключ-значение в моем адаптере списка и добавив туда измененные значения. Поэтому в bindView() я бы проверил, существует ли ключ для инициализируемой строки, и если да, то использую эти значения вместо курсора.
Я просто сделал
HashMap<Long,String>
так как мне нужно было только одно значение, которое можно изменить, но вы можете легко создать собственный класс и сделать свой
HashMap<Long,CustomClass>
так что вы можете изменить много значений.
Поэтому при изменении значений вначале просто не забудьте обновить этот HashMap новыми значениями, чтобы при перерисовке вашего Списка отображались правильные значения. Это хорошо работает, потому что по своей природе один MatrixCursor обычно довольно мал. Это не было бы разумно в действительно большом списке, потому что HashMap вышел бы из-под контроля и занял бы слишком много памяти. Дайте знать, если у вас появятся вопросы.