2017-07-31 26 views
0

私はonEditorActionListenerを設定したEditTextを持っています。つまり、ユーザーがテキストを入力してEnter/Searchを押すと、詳細が取得され、リサイクルビューが表示されます。私は、次のコードを書いている設定変更に状態を保存するために、今すぐRecyclerViewで、レイアウトマネージャを使用してスクロール位置を復元できない

-

Parcelable stateList; 

@Override 
protected void onSaveInstanceState(Bundle outState) { 
    super.onSaveInstanceState(outState); 

    //Saving instance of the state in Parcelable stateList 
    stateList = recyclerView.getLayoutManager().onSaveInstanceState(); 
    outState.putParcelable(RETAIN_STATE, stateList); 
} 

@Override 
protected void onRestoreInstanceState(Bundle savedInstanceState) { 
    super.onRestoreInstanceState(savedInstanceState); 

    if(savedInstanceState!=null) { 
     stateList = savedInstanceState.getParcelable(RETAIN_STATE); 
     recyclerView.getLayoutManager().onRestoreInstanceState(stateList); 
    } 
} 

しかし、私はこれを実行し、リサイクル業者ビューはstateListから状態を復元しません画面を回転パーセルブル。

私はMVPを使用していますので、プレゼンターのコールバックにアダプタを設定しています。

私は、画面が回転した後にキーボードのEnter/Searchをクリックすると状態を保持することができたので、onRestoreInstanceState()でこのハックを試みましたが、より良い方法があるはずですこの。

@Override 
protected void onRestoreInstanceState(Bundle savedInstanceState) { 
    super.onRestoreInstanceState(savedInstanceState); 

    if(savedInstanceState!=null) { 
     //The hack! 
     et_search.onEditorAction(EditorInfo.IME_ACTION_SEARCH); 
     stateList = savedInstanceState.getParcelable(RETAIN_STATE); 
     recyclerView.getLayoutManager().onRestoreInstanceState(stateList); 
    } 
} 

詳細情報が必要な場合は教えてください。 ありがとうございます。

答えて

0

はあなたにこれを含めますそのアクティビティのマニフェスト リサイラビューでの回転時のスクロール位置を保存するには、同じ機能が必要な場所でこのカスタムリサイクルビューをプロジェクトで使用できるように、次のgistを使用してコードを重複しないでください。

import android.content.Context; 
 
import android.os.Bundle; 
 
import android.os.Parcelable; 
 
import android.support.annotation.Nullable; 
 
import android.support.v7.widget.RecyclerView; 
 
import android.util.AttributeSet; 
 

 
/** 
 
* Class {@link StatefulRecyclerView} extends {@link RecyclerView} and adds position management on configuration changes. 
 
* 
 
* @author FrantisekGazo 
 
* @version 2016-03-15 
 
*/ 
 
public final class StatefulRecyclerView 
 
     extends RecyclerView { 
 

 
    private static final String SAVED_SUPER_STATE = "super-state"; 
 
    private static final String SAVED_LAYOUT_MANAGER = "layout-manager-state"; 
 

 
    private Parcelable mLayoutManagerSavedState; 
 

 
    public StatefulRecyclerView(Context context) { 
 
     super(context); 
 
    } 
 

 
    public StatefulRecyclerView(Context context, @Nullable AttributeSet attrs) { 
 
     super(context, attrs); 
 
    } 
 

 
    public StatefulRecyclerView(Context context, @Nullable AttributeSet attrs, int defStyle) { 
 
     super(context, attrs, defStyle); 
 
    } 
 

 
    @Override 
 
    protected Parcelable onSaveInstanceState() { 
 
     Bundle bundle = new Bundle(); 
 
     bundle.putParcelable(SAVED_SUPER_STATE, super.onSaveInstanceState()); 
 
     bundle.putParcelable(SAVED_LAYOUT_MANAGER, this.getLayoutManager().onSaveInstanceState()); 
 
     return bundle; 
 
    } 
 

 
    @Override 
 
    protected void onRestoreInstanceState(Parcelable state) { 
 
     if (state instanceof Bundle) { 
 
      Bundle bundle = (Bundle) state; 
 
      mLayoutManagerSavedState = bundle.getParcelable(SAVED_LAYOUT_MANAGER); 
 
      state = bundle.getParcelable(SAVED_SUPER_STATE); 
 
     } 
 
     super.onRestoreInstanceState(state); 
 
    } 
 

 
    /** 
 
    * Restores scroll position after configuration change. 
 
    * <p> 
 
    * <b>NOTE:</b> Must be called after adapter has been set. 
 
    */ 
 
    private void restorePosition() { 
 
     if (mLayoutManagerSavedState != null) { 
 
      this.getLayoutManager().onRestoreInstanceState(mLayoutManagerSavedState); 
 
      mLayoutManagerSavedState = null; 
 
     } 
 
    } 
 

 
    @Override 
 
    public void setAdapter(Adapter adapter) { 
 
     super.setAdapter(adapter); 
 
     restorePosition(); 
 
    } 
 
}

Link to gist

0

LayoutManagerの設定変更でonRestoreInstanceStateを呼び出す必要はありません。自動的に呼び出されるため(ライフサイクルオーナーから渡されたonSaveInstanceStateonRestoreInstanceStateのすべてのビューがあります)。あなたが望む場合でも、これで達成できるのは、ビューのスクロール位置を復元することだけです。

あなたが実際に行う必要があるのは、RecyclerViewアダプタで設定/使用されたデータを保存し、画面が回転したときに戻すことです。そして検索を呼び出す(または何でもフィルタリングする)。いくつかのビューなど

<activity android:name=".mainpage.view.MainActivity" android:configChanges="orientation|screenSize|screenLayout" > 

を隠す設定change.egをオーバーライドすることにより、任意のカスタムのものにしたくない場合は、あなたのための向きの変更をアンドロイド処理させることができ

+0

はい、私は、ビューのスクロール位置を復元するために探しています。 – hsm59

関連する問題