2016-10-11 8 views
0

Dies ist mein Code zum Speichern des Gridview-Scroll-Status. Aber es wird nicht in der Wiederherstellungsinstanz abgerufen. Nur dieser Schritt ist erforderlich, um mein Projekt zu bestehen.SavedInstance Scroll-Position für gridView funktioniert nicht

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstance){ 
     rootView = inflater.inflate(R.layout.fragment_movies, null); 

     if (savedInstance != null) { 
      MovieTask.mProgressDialog.onRestoreInstanceState(savedInstance); 
      gridView.smoothScrollToPosition(savedInstance.getInt("scroll")); 
     } 

     setHasOptionsMenu(true); 
     return rootView; 
    } 

    @Override 
    public void onSaveInstanceState(Bundle savedInstanceState) { 
     MovieTask.mProgressDialog.onSaveInstanceState(); 
     savedInstanceState.putInt("scroll",gridView.getFirstVisiblePosition()); 
     super.onSaveInstanceState(savedInstanceState); 
    } 

Hier ist der AsyncTask-Code. Wo initialisiere ich die Gridview.

@Override 
protected void onPreExecute(){ 
    mProgressDialog = new ProgressDialog(mContext); 
    SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(mContext); 
    String categoryType = preferences.getString(mContext.getString(R.string.pref_key_category) ,mContext.getString(R.string.pref_category_default_value)); 
    if(categoryType.equals(Constants.TOP_RATED_KEY)){ 
     Category = Constants.TOP_RATED_KEY; 
     mProgressDialog.setTitle("Top Rated Movies"); 
    } else if (categoryType.equals(Constants.POPULARITY_KEY)){ 
     Category = Constants.POPULARITY_KEY; 
     mProgressDialog.setTitle("Popular Movies"); 

    } 
    mProgressDialog.setMessage("Loading..."); 
    mProgressDialog.setIndeterminate(false); 
    mProgressDialog.show(); 
} 

@Override 
protected String[] doInBackground(String... strings) { 

    try { 

     URL url = new URL(Constants.MOVIE_URL + Category + Constants.API_KEY); 

     Log.d(LOG_TAG, String.valueOf(url)); 

     // Create the request to OpenWeatherMap, and open the connection 
     urlConnection = (HttpURLConnection) url.openConnection(); 
     urlConnection.setRequestMethod("GET"); 
     urlConnection.connect(); 

     // Read the input stream into a String 
     InputStream inputStream = urlConnection.getInputStream(); 
     StringBuffer buffer = new StringBuffer(); 
     if (inputStream == null) { 
      // Nothing to do. 
      return null; 
     } 
     reader = new BufferedReader(new InputStreamReader(inputStream)); 

     String line; 
     while ((line = reader.readLine()) != null) { 
      // Since it's JSON, adding a newline isn't necessary (it won't affect parsing) 
      // But it does make debugging a *lot* easier if you print out the completed 
      // buffer for debugging. 
      buffer.append(line + "\n"); 
     } 

     if (buffer.length() == 0) { 
      // Stream was empty. No point in parsing. 
      return null; 
     } 
     movieJsonStr = buffer.toString(); 
    } catch (IOException e) { 
     Log.e("PlaceholderFragment", "Error ", e); 
     // If the code didn't successfully get the weather data, there's no point in attemping 
     // to parse it. 
     return null; 
    } finally { 
     if (urlConnection != null) { 
      urlConnection.disconnect(); 
     } 
     if (reader != null) { 
      try { 
       reader.close(); 
      } catch (final IOException e) { 
       Log.e("PlaceholderFragment", "Error closing stream", e); 
      } 
     } 
    } 

    try { 
     return getMovieDataFromJson(movieJsonStr); 
    } catch (JSONException e) { 
     Log.d(LOG_TAG, e.getMessage(), e); 
     e.printStackTrace(); 
    } 

    return null; 
} 

@Override 
protected void onPostExecute(String[] result){ 
    if(result != null) { 
     mProgressDialog.dismiss(); 

     if(NetworkUtility.isOnline(mContext)){ 

      List<Model> favoriteMovie = Model.listAll(Model.class); 
      MovieAdapter movieAdapter = new MovieAdapter(mContext, favoriteMovie, new MovieAdapter.Callback() { 
       @Override 
       public void onItemSelected(String title, String poster, String plot, double ratings, String release, long id) { 
        if (MainActivity.mTwoPane) { 
         ((FragmentActivity)mContext).getSupportFragmentManager().beginTransaction() 
           .replace(R.id.details_fragment_container, DetailsFragment.newInstance(title, poster, plot, ratings, release, id)) 
           .commit(); 
        } else { 
         Intent intent = new Intent(mContext, DetailsActivity.class); 
         intent.putExtra("title", title); 
         intent.putExtra("poster", poster); 
         intent.putExtra("plot",plot); 
         intent.putExtra("ratings", ratings); 
         intent.putExtra("release", release); 
         intent.putExtra("id", id); 
         mContext.startActivity(intent); 

        } 
       } 

      }); 
      MoviesFragment.gridView = (GridView) MoviesFragment.rootView.findViewById(R.id.grid_view); 
      MoviesFragment.gridView.setAdapter(movieAdapter); 
      int index = MoviesFragment.gridView.getFirstVisiblePosition(); 
      MoviesFragment.gridView.smoothScrollToPosition(index); 
     } else { 
      Toast.makeText(mContext,"Please Enable Internet Services",Toast.LENGTH_SHORT).show(); 
     } 

    } 
} 
+0

wo/wie deklarieren/initialisieren Sie "gridView"? – 0X0nosugar

+0

@ 0X0nosugar Ich initialisiere die GridView in meiner AsyncTask in der PostExecute-Methode. – Se7en

+0

Nun, wenn Ihr Problem weiterhin besteht, denken Sie darüber nach, etwas Code hinzuzufügen (z. B. Code zum Starten der AsyncTask/des Codes von AsyncTask). Nur das Raten macht nicht wirklich Spaß. – 0X0nosugar

Antwort

0

Möchten Sie auf gemeinsame Vorliebe verwenden Otherway es versuchen

gridView.setSelection(savedInstance.getInt("scroll"))

+0

Versucht, aber es funktioniert nicht – Se7en

+0

Meiner Meinung nach entfernen savedInstance.getInt ("scroll") verwenden, um gemeinsame Einstellung – gkhngngr

0

Wissen Sie, wann onSaveInstanceState und onRestoreInstanceState aufgerufen. Wenn Sie die Aktivität manuell schließen, z. B. zurückschlagen, ist savedInstance immer Null.

Ich glaube, Sie für sharedPreference suchen die Scroll-Position während der Ausführung von onCreateView()

0

Am folgenden Punkt zu speichern, es sieht aus wie die AsyncTask gestartet wurde (zumindest Sie zugreifen MovieTask.mProgressDialog und nichts stürzt ab, also denke ich onPreExecute() wurde erfolgreich beendet).

MovieTask.mProgressDialog.onRestoreInstanceState(savedInstance); 
gridView.smoothScrollToPosition(savedInstance.getInt("scroll")); 

Wenn onPostExecute() läuft nach dieser Zeilen ausgeführt werden, dann sind die folgenden Aussagen einfach die Scroll-Position zu Beginn des Inhalts gesetzt:

MoviesFragment.gridView.setAdapter(movieAdapter); 
int index = MoviesFragment.gridView.getFirstVisiblePosition(); 
MoviesFragment.gridView.smoothScrollToPosition(index); 

Dies geschieht, weil von Grund auf neu erstellt und die GridView wird darüber informiert, dass von nun an der anzuzeigende Inhalt von diesem Adapter bereitgestellt wird. So passiert das Übliche: getCount() wird aufgerufen, die GridView wird von Anfang an gefüllt und die Scroll-Position wird ebenfalls auf den Anfang gesetzt.

die gewünschte Bildlaufposition zu erhalten, Sie

int lastScrollPosition = -1; 

in MovieTask eine Variable einführen können. Setzen Sie den Wert auf die gewünschte Position in onCreateView() wenn die savedInstanceState != null

int index = savedInstance.getInt("scroll", -1); 
// case 1: AsyncTask still busy 
MovieTask.lastScrollPosition = index; 
// case 2: AsyncTask already finished 
if (index >= 0) 
{ 
    // seems from the source of AbsListView = parent of GridView 
    // that there will be no crash if index is too big 
    MoviesFragment.gridView.smoothScrollToPosition(index); 
} 

und lesen Sie es in onPostExecute():

if (lastScrollPosition >= 0 and lastScrollPosition < movieAdapter.getCount()) 
{ 
    MoviesFragment.gridView.smoothScrollToPosition(lastScrollPosition);  
} 

Auf diese Weise wird die Bildlaufposition, wenn möglich verwendet werden.

+0

Was soll ich tun, um die Scroll-Position wiederherzustellen? – Se7en

Verwandte Themen