0

Wenn ich die App starte, lädt sie alle Filmplakate korrekt. Wenn ich auf ein Poster klicke, sollte es DetailActivity starten und das ausgewählte Poster anzeigen. Jedoch zeigt jedes Poster, auf das ich klicke, alle dasselbe an.Das gleiche Bild onItemClick in GridView erhalten

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

Ich sehe nicht, wo Sie die Daten aus der Absicht in der Detailaktivität abrufen. Und ich bin irgendwie verwirrt, wie Sie die Daten in die Absicht in der MainActivity setzen. –

+0

Entschuldigung, dass ich gerade meinen fetchmovietask-Code hinzugefügt habe, wenn das Verwirrung stiftet. –

+0

Nein. Das hilft nicht. Erhalten Sie irgendwelche Daten von der Absicht in der 'DetailActivity'? Und markieren Sie die Zeile, in der Sie die Daten auf die Absicht in Ihrer MainActivity setzen? –

Antwort

0

Sie müssen COL_MOVIE_POSTER in DetailActivity nach Punkt Variable aktualisieren in gridview von MainActivityFragment geklickt.

+0

Sollte es nicht mit dem onCreateLoader in der DetailActivity.class aktualisiert worden sein? –