我在使用基于MatrixCursor的ListView重置键盘最小化和方向更改时遇到问题。
矩阵光标填充了SQL数据库中的数据。这样做是因为我希望原始数据库列是listview中的行:
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
});
}
在我的onCreate中调用此fillList()方法。然后,通过扩展SimpleCursorAdapter,此光标用于填充ListView。我的目标是允许用户点击其中一个列表项,导致带有EditText行的Dialog出现:
@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中的值。但是我不知道这是否可行,或者光标是否能在状态变化后存活下来。
非常感谢任何帮助。
答案 0 :(得分:1)
我通过在列表适配器中创建键值对的HashMap并在那里添加更改的值来解决这个问题。所以在bindView()中,我会检查是否存在用于初始化行的密钥,如果是,则使用这些值而不是光标。
我只是做了
HashMap<Long,String>
因为我只需要一个可以改变的值,但你可以轻松创建一个自定义类并制作你的
HashMap<Long,CustomClass>
所以你可以改变很多值。
因此,在最初更改值时,请记住使用新值更新该HashMap,以便在重绘List时显示正确的值。这很有效,因为就其本质而言,MatrixCursor本身通常非常小。这在一个非常大的列表中并不聪明,因为HashMap会失去控制并占用太多内存。如果您有任何问题,请告诉我。