在GridView中获取相同的图片onItemClick

时间:2016-08-31 03:32:22

标签: android android-gridview android-cursoradapter android-cursor

当我启动应用程序时,它会正确加载所有电影海报。当我点击海报时,它应该启动DetailActivity并显示我选择的海报。然而,我点击的每张海报都显示相同的海报。

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 个答案:

答案 0 :(得分:0)

您需要根据COL_MOVIE_POSTER的网格视图中点击的项目更新DetailActivity中的变量MainActivityFragment