0

Когда я запускаю приложение, он загружает все плакаты фильма правильно. Когда я нажимаю на плакат, он должен начать DetailActivity и отображать выбранный вами плакат. Однако каждый плакат, который я нажимаю, отображает один и тот же.Получение одинакового изображения на экране в GridView

MainActivityFragment

/** 
* A placeholder fragment containing a simple view. 
*/ 
public class MainActivityFragment extends Fragment implements LoaderManager.LoaderCallbacks<Cursor>{ 
    private static final int MOVIE_LOADER = 0; 

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

    private static final String[] MOVIE_COLUMNS = { 
      MovieContract.MovieEntry.TABLE_NAME + "." + MovieContract.MovieEntry._ID, 
      MovieContract.MovieEntry.COLUMN_MOVIE_POSTER 
    }; 

    static final int COL_MOVIE_ID = 0; 
    static final int COL_MOVIE_URL = 1; 

    private MovieAdapter mMovieAdapter; 

    public MainActivityFragment() { 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 

     mMovieAdapter = new MovieAdapter(getActivity(),null,0); 

     final View rootView = inflater.inflate(R.layout.fragment_main, container, false); 

     GridView gridView = (GridView) rootView.findViewById(R.id.movieposter_image_gridview); 
     gridView.setAdapter(mMovieAdapter); 
     gridView.setOnItemClickListener(new AdapterView.OnItemClickListener(){ 
      @Override 
      public void onItemClick(AdapterView<?> adapterView, View view, int position, long l){ 
       Cursor cursor = (Cursor)adapterView.getItemAtPosition(position); 
       if(cursor != null){ 
        Intent intent = new Intent(getActivity(), DetailActivity.class) 
         .setData(MovieContract.MovieEntry.CONTENT_URI); 
       startActivity(intent); 
        Log.d("DEBUG", "Selected item position " + position + ", with id: " + l); 
       } 
      } 
     }); 


     return rootView; 
    } 

    @Override 
    public void onActivityCreated(Bundle savedInstanceState){ 
     getLoaderManager().initLoader(MOVIE_LOADER, null, this); 
     super.onActivityCreated(savedInstanceState); 
    } 

    private void updateApplication() { 

     FetchMovieTask movieTask = new FetchMovieTask(getActivity()); 
       SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getActivity()); 
     String sortBy = prefs.getString(getString(R.string.pref_sort_by_key), 
       getString(R.string.pref_popular_default)); 
     movieTask.execute(sortBy); 
    } 

    @Override 
    public void onStart() { 
     super.onStart(); 
     updateApplication(); 

    } 

    @Override 
    public Loader<Cursor> onCreateLoader(int i, Bundle bundle){ 
     Uri movieUri = MovieContract.MovieEntry.CONTENT_URI; 

     return new CursorLoader(getActivity(), 
     movieUri, 
     MOVIE_COLUMNS, 
     null, 
     null, 
     null); 
    } 

    @Override 
    public void onLoadFinished(Loader<Cursor> cursorLoader, Cursor cursor){ 
     mMovieAdapter.swapCursor(cursor); 
    } 

    @Override 
    public void onLoaderReset(Loader<Cursor> cursorLoader){ 
     mMovieAdapter.swapCursor(null); 
    } 
} 

DetailActivity

public class DetailActivity extends AppCompatActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_detail); 

     if (savedInstanceState == null) { 
      getSupportFragmentManager().beginTransaction() 
        .add(R.id.container, new DetailFragment()) 
        .commit(); 
     } 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.detail, menu); 
     return true; 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     // Handle action bar item clicks here. The action bar will 
     // automatically handle clicks on the Home/Up button, so long 
     // as you specify a parent activity in AndroidManifest.xml. 
     int id = item.getItemId(); 

     //noinspection SimplifiableIfStatement 
     if (id == R.id.action_settings) { 
      startActivity(new Intent(this, SettingsActivity.class)); 
      return true; 
     } 

     return super.onOptionsItemSelected(item); 
    } 

    public static class DetailFragment extends Fragment implements LoaderCallbacks<Cursor> { 

     private final String LOG_TAG = DetailFragment.class.getSimpleName(); 
     private static final String Movie_SHARE_HASHTAG = " #MovieApp"; 

     private ShareActionProvider mShareActionProvider; 
     private String mMovie; 
     ImageView poster; 



     private static final int DETAIL_LOADER = 0; 

     private final String[] DETAIL_COLUMNS = { 
       MovieContract.MovieEntry.TABLE_NAME + "." + MovieContract.MovieEntry._ID, 
       MovieContract.MovieEntry.COLUMN_MOVIE_POSTER 
     }; 

     private static final int COL_MOVIE_ID = 0; 
     private static final int COL_MOVIE_POSTER = 1; 

     public DetailFragment() { 
      setHasOptionsMenu(true); 
     } 

     @Override 
     public View onCreateView(LayoutInflater inflater, ViewGroup container, 
           Bundle savedInstanceState) { 

      return inflater.inflate(R.layout.fragment_detail, container, false); 
     } 

     @Override 
     public void onActivityCreated(Bundle savedInstanceState) { 
      getLoaderManager().initLoader(DETAIL_LOADER, null, this); 
      super.onActivityCreated(savedInstanceState); 
     } 

     @Override 
     public Loader<Cursor> onCreateLoader(int id, Bundle args) { 
      Log.v(LOG_TAG, "In onCreateLoader"); 
      Intent intent = getActivity().getIntent(); 
      if (intent == null) { 
       return null; 
      } 
      return new CursorLoader(
        getActivity(), 
        intent.getData(), 
        DETAIL_COLUMNS, 
        null, 
        null, 
        null 
      ); 
     } 

     @Override 
     public void onLoadFinished(Loader<Cursor> loader, Cursor data) { 


      Log.v(LOG_TAG, "In onLoadFinished"); 
      if (!data.moveToFirst()) { 
       return; 
      } 

      String posterURL = data.getString(COL_MOVIE_POSTER); 

      final String POSTERIMAGE_BASE_URL = "http://image.tmdb.org/t/p/"; 
      final String POSTERIMAGE_SIZE = "w500"; 



      poster = (ImageView) getView().findViewById(R.id.detailActivity_image_view); 
      final String POSTERIMAGE_URL = POSTERIMAGE_BASE_URL + POSTERIMAGE_SIZE + posterURL; 


      Picasso.with(this.getActivity()).load(POSTERIMAGE_URL).into(poster); 
      Log.v(LOG_TAG, "Poster Urls: " + POSTERIMAGE_URL); 
     } 

     @Override 
     public void onLoaderReset(Loader<Cursor> loader) { 
     } 

    } 

} 

MovieAdapter

public class MovieAdapter extends CursorAdapter { 

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

    public MovieAdapter(Context context, Cursor c, int flags){ 
     super(context,c,flags); 
    } 

    private String convertCursorRowToUXFormat(Cursor cursor){ 
     String poster = cursor.getString(MainActivityFragment.COL_MOVIE_URL); 
     return poster; 
    } 

    @Override 
    public View newView(Context context,Cursor cursor,ViewGroup parent){ 
     View view = LayoutInflater.from(context).inflate(R.layout.poster_image, parent, false); 
     return view; 
    } 

    @Override 
    public void bindView(View view, Context context, Cursor cursor) { 

     final String POSTERIMAGE_BASE_URL = "http://image.tmdb.org/t/p/"; 
     final String POSTERIMAGE_SIZE = "w500"; 

     ImageView posterImage = (ImageView)view; 
     final String POSTERIMAGE_URL = POSTERIMAGE_BASE_URL + POSTERIMAGE_SIZE + convertCursorRowToUXFormat(cursor); 

     Picasso.with(context).load(POSTERIMAGE_URL).into(posterImage); 
     Log.v(LOG_TAG, "Poster Urls: " + POSTERIMAGE_URL); 

    } 
} 

FetchMovieTask

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

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


    private final Context mContext; 

    public FetchMovieTask(Context context) { 
     mContext = context; 
    } 

    private boolean DEBUG = true; 

    private void getMovieDataJSON(String movieJSONStr) 
      throws JSONException { 

     final String MDB_RESULT = "results"; 
     final String MDB_POSTER = "poster_path"; 
     final String MDB_MOVIE_TITLE = "original_title"; 
     final String MDB_MOVIE_PLOT = "overview"; 
     final String MDB_MOVIE_RATING = "popularity"; 
     final String MDB_RELEASE_DATE = "release_date"; 

     try { 
      JSONObject movieJSON = new JSONObject(movieJSONStr); 
      JSONArray movieArray = movieJSON.getJSONArray(MDB_RESULT); 

      Vector<ContentValues> cVVector = new Vector<>(movieArray.length()); 

      for (int i = 0; i < movieArray.length(); i++) { 
       String poster; 
       String title; 
       String plot; 
       String rating; 
       String releaseDate; 


       //Get theJSON object representing the movie 
       JSONObject movieDetail = movieArray.getJSONObject(i); 

       poster = movieDetail.getString(MDB_POSTER); 
       title = movieDetail.getString(MDB_MOVIE_TITLE); 
       plot = movieDetail.getString(MDB_MOVIE_PLOT); 
       rating = movieDetail.getString(MDB_MOVIE_RATING); 
       releaseDate = movieDetail.getString(MDB_RELEASE_DATE); 

       ContentValues movieDetailValues = new ContentValues(); 
       movieDetailValues.put(MovieContract.MovieEntry.COLUMN_MOVIE_NAME, title); 
       movieDetailValues.put(MovieContract.MovieEntry.COLUMN_MOVIE_POSTER, poster); 
       movieDetailValues.put(MovieContract.MovieEntry.COLUMN_MOVIE_PLOT, plot); 
       movieDetailValues.put(MovieContract.MovieEntry.COLUMN_MOVIE_RATING, rating); 
       movieDetailValues.put(MovieContract.MovieEntry.COLUMN_MOVIE_REDATE, releaseDate); 

       cVVector.add(movieDetailValues); 
      } 
      int inserted = 0; 

      if (cVVector.size() > 0) { 
       ContentValues[] cvArray = new ContentValues[cVVector.size()]; 
       cVVector.toArray(cvArray); 

       inserted = mContext.getContentResolver().bulkInsert(MovieContract.MovieEntry.CONTENT_URI, cvArray); 
      } 

      Log.d(LOG_TAG, "FetchMovieTask Complete. " + inserted + " Inserted"); 



     } catch (JSONException e) { 
      Log.e(LOG_TAG, e.getMessage(), e); 
      e.printStackTrace(); 
     } 

    } 

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

      if (params.length == 0) { 
       return null; 
      } 

      HttpURLConnection urlConnection = null; 
      BufferedReader reader = null; 

      String movieJSONStr = null; 

      try { 

       final String MOVIE_BASE_URL = "http://api.themoviedb.org/3/movie"; 

       Uri builtUri = Uri.parse(MOVIE_BASE_URL).buildUpon() 
         .appendPath(params[0]) 
         .appendQueryParameter("api_key", BuildConfig.MOVIE_API_KEY) 
         .build(); 

       URL url = new URL(builtUri.toString()); 

       Log.v(LOG_TAG, "Built URI " + builtUri.toString()); 

       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) { 
       return null; 
      } 

      movieJSONStr = buffer.toString(); 
      getMovieDataJSON(movieJSONStr); 

     } catch (IOException e) { 
      Log.e(LOG_TAG, "Error ", e); 
     } 
      catch(JSONException e){ 
       Log.e(LOG_TAG, e.getMessage(), e); 
       e.printStackTrace(); 

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

     return null; 
    } 

} 
+1

Я не вижу, откуда вы извлекаете данные из намерения в подробном действии. И я немного смущен тем, как вы устанавливаете данные в намерение в «MainActivity». –

+0

Извините, что я только что добавил свой код fetchmovietask, если это поможет смутить. –

+0

Нет. Это не помогает. Вы извлекаете любые данные из намерения в «DetailActivity»? И выделите строку, в которой вы устанавливаете данные в намерении в своей «MainActivity»? –

ответ

0

Вам необходимо обновить переменную COL_MOVIE_POSTER в DetailActivity в соответствии с пунктом щелкнул в GridView из MainActivityFragment.

+0

Не должно ли оно быть обновлено с помощью onCreateLoader в DetailActivity.class? –

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