2015-11-08 19 views
1

我建立在主面板上的GridView控件顯示電影這部電影的應用程序後,GridView控件不刷新,然後我可以點擊他們,並顯示有關該電影的一些信息,我也有一些設置更改的標準顯示的電影:熱門,最受好評或最愛。收藏夾是保存在用戶選擇的sharedPreferences中的本地集合。
下面是在這一切發生的情況:改變設置

public class MovieFragment extends Fragment{ 
    public String[][] matrixMoviesInfo; 
    public GridView gridView; 
    public String[] mArrayImages; 
    private String baseUrl; 
    private String apiKey; 

public MovieFragment(){ 
    matrixMoviesInfo = new String[20][10]; 
    mArrayImages = new String[20]; 
    baseUrl = "http://api.themoviedb.org/3/movie/"; 
    apiKey = "?api_key=37068e0a72b2cc1751b4246899923ba7"; 
} 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
} 

@Override 
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { 
    super.onCreateOptionsMenu(menu, inflater); 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    return super.onOptionsItemSelected(item); 
} 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    View rootView = inflater.inflate(R.layout.fragment_main, container, false); 
    gridView = (GridView) rootView.findViewById(R.id.gridview); 
    gridView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
     public void onItemClick(AdapterView<?> parent, View v, 
           int position, long id) { 
      Intent intent = new Intent(getActivity(), DetailActivity.class) 
        .putExtra(Intent.EXTRA_TEXT, matrixMoviesInfo[position]); 
      intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
      startActivity(intent); 
     } 
    }); 
    return rootView; 
} 

private void setImages() { 
    for(int i=0;i<mArrayImages.length;i++){ 
     if(matrixMoviesInfo[i][0]!=null) { 
      mArrayImages[i] = matrixMoviesInfo[i][0]; 
     } 
    } 
    gridView.setAdapter(null); 
    gridView.setAdapter(new ImageAdapter(getActivity(), mArrayImages)); 
    Log.v(null, "SETIMAGESCALLED"); 
} 

private void updateMovies() { 
    SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getActivity()); 
    String preference = prefs.getString(getString(R.string.pref_sortby_key), getString(R.string.pref_sortby_default)); 
    if(preference.toLowerCase().equals("favorites")){ 
     SharedPreferences preferences = getContext().getSharedPreferences("favorites_list", Context.MODE_PRIVATE); 
     Map<String, ?> allEntries = preferences.getAll(); 
     String[] keyNames = new String[allEntries.size()]; 
     Log.v(null,"SIZE: "+allEntries.size()); 
     String[] keyValues; 
     int iterator=0; 
     for (Map.Entry<String, ?> entry : allEntries.entrySet()) { 
      Log.v("KEY: " +entry.getKey(), "VALUE: "+entry.getValue().toString()); 
     } 
     for (Map.Entry<String, ?> entry : allEntries.entrySet()) { 
      if(entry.getKey()!=null) { 
       keyNames[iterator] = entry.getKey(); 
       keyValues = entry.getValue().toString().split("#"); 
       for (int i = 0; i < 10; i++) { 
        Log.v("INDEX: " + i, " VALUES: " + keyValues[i]); 
        matrixMoviesInfo[iterator][i] = keyValues[i]; 
       } 
       iterator++; 
      } 
     } 
     setImages(); 
    }else{ 
     Log.v(null,"EXECUTETASK"); 
     new FetchMoviesTask().execute(baseUrl+preference.toLowerCase()+apiKey, "i"); 
    } 
} 

@Override 
public void onStart() { 
    super.onStart(); 
    updateMovies(); 
} 

public class FetchMoviesTask extends AsyncTask<String, String, Void> { 

    private final String LOG_TAG = FetchMoviesTask.class.getSimpleName(); 

    private Void getMovieDetailsFromJson(String movieJSONstr) throws JSONException { 

     final String OWM_RESULTS = "results"; 
     final String OWM_ID = "id"; 
     final String OWM_POSTERPATH = "poster_path"; 
     final String OWM_TITLE = "original_title"; 
     final String OWM_OVERVIEW = "overview"; 
     final String OWM_USERRATING = "vote_average"; 
     final String OWM_RELEASEDATE = "release_date"; 

     JSONObject movieJson = new JSONObject(movieJSONstr); 
     JSONArray movieArray = movieJson.getJSONArray(OWM_RESULTS); 

     for(int i = 0; i < movieArray.length(); i++) { 
      JSONObject movieObj = movieArray.getJSONObject(i); 
      matrixMoviesInfo[i][0] = movieObj.getString(OWM_POSTERPATH); 
      matrixMoviesInfo[i][1] = movieObj.getString(OWM_ID); 
      matrixMoviesInfo[i][2] = movieObj.getString(OWM_TITLE); 
      matrixMoviesInfo[i][3] = movieObj.getString(OWM_OVERVIEW); 
      matrixMoviesInfo[i][4] = movieObj.getString(OWM_USERRATING); 
      matrixMoviesInfo[i][5] = movieObj.getString(OWM_RELEASEDATE); 
     } 
     for(int i=0;i<20;i++) { 
      new FetchMoviesTask().execute(baseUrl + matrixMoviesInfo[i][1] + "/reviews" + apiKey, Integer.toString(i)); 
      new FetchMoviesTask().execute(baseUrl + matrixMoviesInfo[i][1] + "/videos" + apiKey, "v"); 
     } 
     Log.v(null,"GETMOVIEDETAILS"); 
     return null; 
    } 

    private Void getMovieReviewsFromJson(String movieJSONstr, String position) throws JSONException{ 

     int pos = Integer.parseInt(position); 
     final String OWM_RESULTS = "results"; 
     final String OWM_AUTHOR = "author"; 
     final String OWM_CONTENT = "content"; 
     final String OWM_TOTALRESULTS = "total_results"; 

     JSONObject movieJson = new JSONObject(movieJSONstr); 
     JSONArray movieArray = movieJson.getJSONArray(OWM_RESULTS); 
     int numberOfResults = Integer.parseInt(movieJson.getString(OWM_TOTALRESULTS)); 

     if(numberOfResults >= 1) { 
      matrixMoviesInfo[pos][6] = movieArray.getJSONObject(0).getString(OWM_AUTHOR); 
      matrixMoviesInfo[pos][7] = movieArray.getJSONObject(0).getString(OWM_CONTENT); 
     } 
     if(numberOfResults > 1) { 
      matrixMoviesInfo[pos][8] = movieArray.getJSONObject(1).getString(OWM_AUTHOR); 
      matrixMoviesInfo[pos][9] = movieArray.getJSONObject(1).getString(OWM_CONTENT); 
     } 

     return null; 
    } 

    private Void getMovieVideosFromJson(String movieJSONstr){ 

     return null; 
    } 

    @Override 
    protected Void doInBackground(String... params) { 

     HttpURLConnection urlConnection = null; 
     BufferedReader reader = null; 

     String movieJSONstr = null; 

     try{ 
      URL url = new URL(params[0]); 
      urlConnection = (HttpURLConnection) url.openConnection(); 
      urlConnection.setRequestMethod("GET"); 
      urlConnection.connect(); 

      InputStream inputStream = urlConnection.getInputStream(); 
      StringBuffer buffer = new StringBuffer(); 
      if(inputStream == null){ 
       return null; 
      } 
      reader = new BufferedReader(new InputStreamReader(inputStream)); 

      String line; 
      while((line = reader.readLine()) != null){ 
       buffer.append(line + "\n"); 
      } 

      if(buffer.length() == 0){ 
       movieJSONstr = null; 
      } 
      movieJSONstr = buffer.toString(); 
     } catch (IOException e) { 
      Log.e(LOG_TAG, "Error ", e); 

      return null; 
     } finally{ 
      if (urlConnection != null) { 
       urlConnection.disconnect(); 
      } 
      if (reader != null) { 
       try { 
        reader.close(); 
       } catch (final IOException e) { 
        Log.e("MovieFragment", "Error closing stream", e); 
       } 
      } 
     } 

     try{ 
      if(params[1].equals("i")){ 
       Log.v(null,"EXECUTEGETMOVIEDETAILS"); 
       return getMovieDetailsFromJson(movieJSONstr); 
      } 
      else { 
       if (params[1].equals("v")){ 
        return getMovieVideosFromJson(movieJSONstr);} 
       else{ 
        return getMovieReviewsFromJson(movieJSONstr, params[1]);} 
      } 
     }catch (JSONException e) { 
      Log.e(LOG_TAG, e.getMessage(), e); 
      e.printStackTrace(); 
     } 

     return null; 
    } 

    @Override 
    protected void onPostExecute(Void aVoid) { 
     String[] mArrayImages = new String[20]; 
     for(int i=0;i<20;i++){ 
      mArrayImages[i] = matrixMoviesInfo[i][0]; 
     } 
     gridView.setAdapter(new ImageAdapter(getActivity(), mArrayImages)); 
     Log.v(null, "IMAGES SET GRIDVIEW REFRESHED"); 
    } 
} 

類名說明:
有2條路徑:

熱門或TopRated:上方法UpdateMovies開始,然後執行的AsyncTask獲取從數據api,然後執行getMoviesFromJson來提取所有與所有電影相關的信息。然後它結束onPostExecute,用ImageAdapter填充gridview。

收藏夾:從方法UpdateMovies開始,在這裏它從sharedpreferences中獲取數據,並使用該數據填充數組,然後調用方法setImages以使用ImageAdapter填充gridView。

這是我的問題:當我顯示熱門電影並將設置更改爲收藏夾時,它會在sharedpreferences上顯示正確的電影,但不會從gridview中「清除」剩餘的電影。
此外,我怎麼能調整GridView控件的滾動來匹配它的細胞(在沒有電影來填充單元格,我隱藏它是這樣的:

imageView.setVisibility(View.GONE); 

回答

0

做一個適配器擴展GridView控件從BaseAdapter,或使用從BaseAdapter延伸的適配器。

然後調用notifyDataSetChanged該適配器上,當你的收藏中的內容發生了變化。

+0

它不會做任何事情。 –