0

我正在尝试创建一个列表视图,当您单击一个条目时,您可以对其进行修改,并且在点击确认后它仍将显示您刚刚修改的条目,而不是滚动到顶部。

进行了建议的更改,离开编辑活动后,它仍然滚动到顶部并且找不到正确的滚动位置。我错过了什么吗?

static int firstPosition = 0;

protected void onListItemClick(ListView l, View v, int position, long id) {
    super.onListItemClick(l, v, position, id);
    Cursor c = mNotesCursor;
    ListView mListView = getListView();
    firstPosition = mListView.getFirstVisiblePosition();
    c.moveToPosition(position);
    Intent i = new Intent(this, QuoteEdit.class);
    i.putExtra(QuotesDBAdapter.KEY_ROWID, id);
    i.putExtra(QuotesDBAdapter.KEY_QUOTES, c.getString(
    c.getColumnIndexOrThrow(QuotesDBAdapter.KEY_QUOTES)));
    startActivityForResult(i, ACTIVITY_EDIT);
}
    public void onResume(int requestCode, int resultCode, Intent intent) {
ListView mListView = getListView();

if (mListView != null && firstPosition >= 0){
   mListView.scrollTo(0,firstPosition);
//  mListView.setSelection(firstPosition);

}

}
protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
    try {
        super.onActivityResult(requestCode, resultCode, intent);
        Bundle extras = intent.getExtras();
        switch(requestCode) {
            case ACTIVITY_CREATE:
                String title = extras.getString(QuotesDBAdapter.KEY_QUOTES);
                mDbHelper.createQuote(title);
                break;
            case ACTIVITY_EDIT: 
                ListView mListView = getListView();
                Long rowId = extras.getLong(QuotesDBAdapter.KEY_ROWID);
                if (rowId != null) {
                    String editTitle = extras.getString(QuotesDBAdapter.KEY_QUOTES);
                    mDbHelper.updateQuote(rowId, editTitle);
                    mListView.setSelection(firstPosition);
                }
                fillData();
                break;
        }
    }
    catch (Exception ex){
        Context context = getApplicationContext();
        CharSequence text = ex.toString();
        int duration = Toast.LENGTH_LONG;

        Toast toast = Toast.makeText(context, text, duration);
        toast.show();
    }
}
4

1 回答 1

1

您的编辑器是另一个Activity,您正在调用它startActivityForResult()。这一行实际上并没有在这里停止——它将继续处理方法的其余部分,包括mListView.setSelection(firstPosition);语句。换句话说,setSelection()在用户开始编辑值之前调用。

当编辑器Activity关闭时,它会将结果返回到onActivityResult(). 在这种方法中,您需要告诉它再次滚动ListView到正确的位置。所以也许是这样的......

static int firstPosition = 0; // this is a global variable - set it in onListItemClick()

public void onActivityResult (int requestCode, int resultCode, Intent data){
    mListView.setSelection(firstPosition);
    }

并更改您的onListItemClick()方法以使用全局变量,如下所示...

protected void onListItemClick(ListView l, View v, int position, long id) {
    super.onListItemClick(l, v, position, id);
    Cursor c = mNotesCursor;
    ListView mListView = getListView();
    firstPosition = mListView.getFirstVisiblePosition(); // changed this line
    c.moveToPosition(position);
    Intent i = new Intent(this, QuoteEdit.class);
    i.putExtra(QuotesDBAdapter.KEY_ROWID, id);
    i.putExtra(QuotesDBAdapter.KEY_QUOTES, c.getString(
    c.getColumnIndexOrThrow(QuotesDBAdapter.KEY_QUOTES)));
    startActivityForResult(i, ACTIVITY_EDIT);
    mListView.setSelection(firstPosition);
}

现在,该setSelection()方法不会改变滚动位置,但你可以试试这个......

onListItemClick()中,更改为以下...

    firstPosition = mListView.getScrollY();

在 中onActivityResult(),更改为以下...

    mlistView.scrollTo(0,firstPosition);

可能还会将以下代码添加到onResume()方法的末尾(在您的 main 中Activity),以便在您返回 main 时运行它Activity...

ListView mListView = getElementById("myListView");
if (mlistView != null && firstPosition >= 0){
    mlistView.scrollTo(0,firstPosition);
}
于 2012-04-27T02:53:55.063 回答