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) に追加して、メインに戻ったときに実行されるようにすることもできますActivity...

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