2015-10-04 3 views
1

Я получаю данные от theMovieDb.com. В меню настроек у него есть опция для сортировки по самым популярным или самым высоким рейтингам. После того как пользователь выбирает его предпочтения, я хочу автоматически обновить основное действие. Я пробовал несколько вещей, но ничего не работало для меня.Как обновить MainActivity в зависимости от настроек предпочтений?

MainActivityFragment.java

public void onCreate(@Nullable Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    volleySingleton = VolleySingleton.getInstance(); 
    requestQueue = volleySingleton.getRequestQueue(); 
    sendJsonRequest(); 
} 

// To initialize the Image Adapter 
public ImageAdapter initializeAdapter() { 
    SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(getActivity()); 
    String sortby = preferences.getString(getString(R.string.pref_key), getString(R.string.pref_default_value)); 
    if (sortby.equals(getString(R.string.pref_rating))) { 
     mAdapter = new ImageAdapter(getActivity(), sortListRating); 
    } else if (!sortby.equals(getString(R.string.pref_rating))) { 
     mAdapter = new ImageAdapter(getActivity(), listMovie); 

    } 
    return mAdapter; 
} 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    View rootView = inflater.inflate(R.layout.fragment_main, container, false); 
    GridView gridView = (GridView) rootView.findViewById(R.id.grid_view_movies); 


    final ImageAdapter mFinalAdapter = initializeAdapter(); 

    gridView.setAdapter(mFinalAdapter); 
    gridView.setOnItemClickListener(new AdapterView.OnItemClickListener() 

            { 
             public void onItemClick(AdapterView<?> parent, View v, 
                   int position, long id) { 
              Movie movieSelected = listMovie.get(position); 
              String movieTitle = movieSelected.getTitle(); 
              String movieThumbnail = movieSelected.getUrlThumbnail(); 
              String movieReleaseDate = movieSelected.getReleaseDate(); 
              String movieOverview = movieSelected.getOverview(); 
              String movieRating = movieSelected.getRating(); 
              Intent i = new Intent(getActivity(), DetailsMovies.class); 
              i.putExtra(EXTRA_MESSAGE_1, movieThumbnail); 
              i.putExtra(EXTRA_MESSAGE_2, movieTitle); 
              i.putExtra(EXTRA_MESSAGE_3, movieReleaseDate); 
              i.putExtra(EXTRA_MESSAGE_4, movieRating); 
              i.putExtra(EXTRA_MESSAGE_5, movieOverview); 

              startActivity(i); 
             } 
            } 

    ); 


    return rootView; 
} 


private void sendJsonRequest() { 
    //In the case of theMovieDB it is JSON Object Request 
    //Specify several argument in JSON Object Request 
    JsonObjectRequest request = new JsonObjectRequest(Request.Method.GET, 
      getRequestUrl(), 
      new Response.Listener<JSONObject>() { 
       @Override 
       public void onResponse(JSONObject response) { 
        parseJsonResponse(response); 
       } 
      }, 
      new Response.ErrorListener() { 
       @Override 
       public void onErrorResponse(VolleyError error) { 

       } 
      }); 
    requestQueue.add(request); 

} 

private void parseJsonResponse(JSONObject response) { 
    if (response == null || response.length() == 0) { 
     return; 
    } 

    long id = -1; 
    String title = Constants.NA; 
    String releaseDate = Constants.NA; 
    String synopsis = Constants.NA; 
    String urlThumbnail = Constants.NA; 
    String rating = Constants.NA; 
    String popularity = Constants.NA; 
    String votecount = Constants.NA; 

    try { 
     if (response.has(KEY_RESULTS)) { 
      JSONArray jsonArray = response.getJSONArray(KEY_RESULTS); 
      for (int i = 0; i < jsonArray.length(); i++) { 
       JSONObject currentMovies = jsonArray.getJSONObject(i); 
       //Get the id of the current movie 
       //If statement is used to check whether id is null or not. 
       if (currentMovies.has(KEY_ID) && !currentMovies.isNull(KEY_ID)) { 
        id = currentMovies.getLong(KEY_ID); 
       } 
       //Get the synopsis of the current movie 
       if (currentMovies.has(KEY_OVERVIEW) && !currentMovies.isNull(KEY_OVERVIEW)) { 
        synopsis = currentMovies.getString(KEY_OVERVIEW); 
       } 
       //Get the title of the current movie 
       if (currentMovies.has(KEY_TITLE) && !currentMovies.isNull(KEY_TITLE)) { 
        title = currentMovies.getString(KEY_TITLE); 
       } 
       //Get the urlThumbnail of the current movie 
       if (currentMovies.has(KEY_POSTER_PATH) && !currentMovies.isNull(KEY_POSTER_PATH)) { 
        urlThumbnail = currentMovies.getString(KEY_POSTER_PATH); 
       } 
       //Get the release date of the current movie 
       if (currentMovies.has(KEY_RELEASE_DATE) && !currentMovies.isNull(KEY_RELEASE_DATE)) { 
        releaseDate = currentMovies.getString(KEY_RELEASE_DATE); 
       } 
       //Get the rating of current movie 
       if (currentMovies.has(KEY_VOTE_AVERAGE) && !currentMovies.isNull(KEY_VOTE_AVERAGE)) { 
        rating = currentMovies.getString(KEY_VOTE_AVERAGE); 
       } 

       //Get the popularity of the current movie 
       if (currentMovies.has(KEY_POPULARITY) && !currentMovies.isNull(KEY_POPULARITY)) { 
        popularity = currentMovies.getString(KEY_POPULARITY); 
       } 

       //Get the vote_count of the current movie 
       if (currentMovies.has(KEY_VOTE_COUNT) && !currentMovies.isNull(KEY_VOTE_COUNT)) { 
        votecount = currentMovies.getString(KEY_VOTE_COUNT); 
       } 
       //Create movie object 
       movie = new Movie(); 
       movie.setId(id); 
       movie.setTitle(title); 
       movie.setUrlThumbnail("http://image.tmdb.org/t/p/w185/" + urlThumbnail); 
       movie.setReleaseDate(releaseDate); 
       movie.setOverview(synopsis); 
       movie.setRating(rating); 
       movie.setPopularity(popularity); 
       movie.setVoteCount(votecount); 
       //This decides when to add movies to the ArrayList 
       if (id != -1 && !title.equals(Constants.NA)) { 
        listMovie.add(movie); 
        sortListRating.add(movie); 

       } 

      } 

     } 
     Collections.sort(sortListRating); 


    } catch (JSONException e) { 
     Log.e("error", e.getMessage()); 

    } 

} 

public String getRequestUrl() { 
    //SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(getActivity()); 
    //String order = pref.getString(getString(R.string.pref_order_key), getString(R.string.pref_popularity)); 

    //if(order.equals(getString(R.string.pref_rating))) 
    // return URL + "vote_average" + UrlEndpoints.URL_PARAM + MyApplication.API_KEY; 
    //else 
    return URL + "popularity" + UrlEndpoints.URL_PARAM + MyApplication.API_KEY; 

} 

//Base Adapter which is used to put poster in grid view 
public class ImageAdapter extends BaseAdapter { 
    private Context mContext; 
    private ArrayList<Movie> movieItems; 

    public ImageAdapter(Context c, ArrayList<Movie> movieList) { 
     this.mContext = c; 
     this.movieItems = movieList; 
    } 

    public int getCount() { 
     return movieItems.size(); 
    } 

    public Object getItem(int position) { 
     return movieItems.get(position); 
    } 

    public long getItemId(int position) { 
     return position; 
    } 

    // create a new ImageView for each item referenced by the Adapter 
    public View getView(int position, View convertView, ViewGroup parent) { 
     if (inflater == null) { 
      inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

     } 
     if (convertView == null) { 
      convertView = inflater.inflate(R.layout.grid_item_movies, null); 
     } 

     mNetworkImageView = (NetworkImageView) convertView.findViewById 
       (R.id.networkImageView); 
     //Getting movie data for the row 
     Movie m = movieItems.get(position); 
     //Thumbnail Image 
     //ImageLoader is used to load the images from json object retrieved. 


     SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(getActivity()); 
     String sortby = preferences.getString(getString(R.string.pref_key), getString(R.string.pref_default_value)); 
     if (sortby.equals(getString(R.string.pref_rating))) { 
      imageLoader = VolleySingleton.getInstance().getImageLoader(); 
      mNetworkImageView.setImageUrl(m.getUrlThumbnail(), imageLoader); 
     } else if (!sortby.equals(getString(R.string.pref_rating))) { 
      imageLoader = VolleySingleton.getInstance().getImageLoader(); 
      mNetworkImageView.setImageUrl(m.getUrlThumbnail(), imageLoader); 

     } 

     return convertView; 
    } 

} 

SettingsActivity.java

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    // Add 'general' preferences, defined in the XML file 
    // Added preferences from XML 
    addPreferencesFromResource(R.xml.pref_general); 


    // For all preferences, attach an OnPreferenceChangeListener so the UI summary can be 
    // updated when the preference changes. 
    // Added preferences 
    bindPreferenceSummaryToValue(findPreference(getString(R.string.pref_key))); 
} 

/** 
* Attaches a listener so the summary is always updated with the preference value. 
* Also fires the listener once, to initialize the summary (so it shows up before the value 
* is changed.) 
*/ 
private void bindPreferenceSummaryToValue(Preference preference) { 
    // Set the listener to watch for value changes. 
    preference.setOnPreferenceChangeListener(this); 

    // Trigger the listener immediately with the preference's 
    // current value. 
    onPreferenceChange(preference, 
      PreferenceManager 
        .getDefaultSharedPreferences(preference.getContext()) 
        .getString(preference.getKey(), "")); 
} 

@Override 
public boolean onPreferenceChange(Preference preference, Object value) { 
    String stringValue = value.toString(); 

    if (preference instanceof ListPreference) { 
     // For list preferences, look up the correct display value in 
     // the preference's 'entries' list (since they have separate labels/values). 
     ListPreference listPreference = (ListPreference) preference; 
     int prefIndex = listPreference.findIndexOfValue(stringValue); 
     if (prefIndex >= 0) { 
      preference.setSummary(listPreference.getEntries()[prefIndex]); 
     } 
    } else { 
     // For other preferences, set the summary to the value's simple string representation. 
     preference.setSummary(stringValue); 
    } 
    return true; 
} 

Я хранения данных в ArrayList на основе популярности фильма, а затем сортировка и тот же список массива на основе рейтинга и сохранение в новом ArrayList. Как обновить данные при изменении предпочтений?

+0

Обновите свой список и вызовите 'notifyDataSetChanged()' на ваш адаптер. – kphil

ответ

0

Когда вы возобновляете свою деятельность, адаптер должен быть уведомлен о том, что базовые данные были изменены. Вы должны использовать:

mAdapter.notifyDataSetChanged(); 
+0

Я должен использовать его внутри onResume(). – rozer

+0

Это не имеет значения, но если вы используете тот же экземпляр активности, то вы хотите называть его, когда он возобновляется. –

+1

Его не работает bro ... – rozer

Смежные вопросы