首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Android:是否可以更新MatrixCursor行(作为旋转时重置视图的解决方案)

Android:是否可以更新MatrixCursor行(作为旋转时重置视图的解决方案)
EN

Stack Overflow用户
提问于 2013-01-19 21:39:11
回答 1查看 1K关注 0票数 0

我在使用基于MatrixCursor的ListView时遇到了问题,它可以在键盘上重新设置值、最小化和更改方向。

矩阵游标由来自SQL数据库的数据填充。这样做是因为我希望原始数据库列是列表视图中的行:

代码语言:javascript
复制
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中调用。然后使用此游标通过扩展SimpleCursorAdapter来填充ListView。我对片断的目标是允许用户单击列表项之一,导致出现带有EditText行的对话框:

代码语言:javascript
复制
@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中的值。然而,我不知道这是否可能,或者游标是否会在状态变化中幸存下来。

任何帮助都将不胜感激。

EN

回答 1

Stack Overflow用户

发布于 2013-06-19 00:02:42

我在我的列表适配器中创建了一个键值对的HashMap,并在其中添加更改后的值,从而解决了这个问题。因此,在bindView()中,我将检查正在初始化的行的键是否存在,如果存在,则使用这些值,而不是游标中的值。

我就是这么做的

代码语言:javascript
复制
HashMap<Long,String>

因为我只需要一个可以更改的值,但是您可以很容易地创建自定义类并创建您的

代码语言:javascript
复制
HashMap<Long,CustomClass>

所以你可以改变很多值。

因此,当最初更改这些值时,只需记住使用新值更新该HashMap,以便在重新绘制列表时显示正确的值。这很好用,因为从本质上讲,MatrixCursor本身通常很小。在一个非常大的列表上这样做是不明智的,因为HashMap会变得失控并占用太多内存。如果你有任何问题,请告诉我。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14414925

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档