Imageview становится пустым при использовании с gridLayoutManager в recyclerView

У меня есть два действия: одно показывает список фильмов, а другое показывает детали фильма. У меня есть общий элемент перехода на афише фильма. Он отлично работает, когда я использую linearlayoutmanager, но когда я использую gridLayoutManager для recyclerView, после того, как я нажму кнопку «Назад», чтобы вернуться из подробной активности, другое изображение становится пустым, как показано здесь. изображение

На этой картинке я нажал на постер фильма «Люди Икс», но изображение рядом с ним стало пустым.

Я установил уникальное имя перехода для каждого элемента. Вероятно, это не причина.

это моя деятельность

public class MainActivity extends AppCompatActivity implements MovieGridAdapter.OnItemClickListener {

private MovieGridAdapter mAdapter;

private int mPosition;

private Toolbar mToolbar;

private RecyclerView mMovieGridLayout;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    EventBus.getDefault().register(this);
    PreferenceManager.setDefaultValues(this, R.xml.pref_general, false);
    setContentView(R.layout.activity_main);
    mToolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(mToolbar);

    mMovieGridLayout = (RecyclerView) findViewById(R.id.movie_grid);
    GridLayoutManager gridLayoutManager = new GridLayoutManager(this, 3);
    mMovieGridLayout.setLayoutManager(gridLayoutManager);

    mAdapter = new MovieGridAdapter();
    mAdapter.setOnItemClickListener(this);
    mMovieGridLayout.setAdapter(mAdapter);
}

@Override
protected void onStart() {
    super.onStart();
    SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this);
    String sortBy = sharedPreferences.getString(getString(R.string.sort_by_key), getString(R.string.popularity));
    MoviePuller.getMoviePuller().discoverMovies(sortBy);
}

@Override
protected void onDestroy() {
    super.onDestroy();
    EventBus.getDefault().unregister(this);
}

@Override
protected void onResume() {
    super.onResume();
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.menu_main, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    int id = item.getItemId();

    if (id == R.id.action_settings) {
        Intent intent = new Intent(this, SettingActivity.class);
        startActivity(intent);
        return true;
    } else if (id == R.id.action_refresh) {
        SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this);
        String sortBy = sharedPreferences.getString(getString(R.string.sort_by_key), getString(R.string.popularity));
        MoviePuller.getMoviePuller().discoverMovies(sortBy);
    }

    return super.onOptionsItemSelected(item);
}

@Subscribe
public void onPullSuccessEvent(Integer eventId) {
    if (eventId == EventId.PULL_SUCCESS) {
        mAdapter.notifyDataSetChanged();
    }
}

@Override
public void onItemClick(View v, int position) {
    mPosition = position;
    Intent intent = new Intent(this, MovieDetailActivity.class);
    ImageView imageView = (ImageView) v.findViewById(R.id.poster);
    TextView title = (TextView) v.findViewById(R.id.title);
    ActivityOptionsCompat scaleUpAnimationOptions = createScaleUpAnimationOptions(imageView,title);
    intent.putExtra(Constants.POSITION, position);
    ActivityCompat.startActivity(this, intent, scaleUpAnimationOptions.toBundle());
}

private ActivityOptionsCompat createScaleUpAnimationOptions(View view, View view2) {
    Pair<View,String> pair = new Pair<>(view,view.getTransitionName());
    Pair<View,String> pair2 = new Pair<>(view2,view2.getTransitionName());
    Pair<View,String> pair3 = new Pair<View, String>(mToolbar,mToolbar.getTransitionName());
//        View statusBar = getWindow().getDecorView().findViewById(android.R.id.navigationBarBackground);
//        Pair<View,String> pair4 = new Pair<>(statusBar, ViewCompat.getTransitionName(statusBar));
    return ActivityOptionsCompat.makeSceneTransitionAnimation(this,pair,pair2,pair3);
}
}

это мой адаптер

public class MovieGridAdapter extends RecyclerView.Adapter<MovieGridAdapter.MyHolder> {

private JSONArray mMovies;

private OnItemClickListener mOnItemClickListener;

@Override
public MyHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    CardView cardView = (CardView) LayoutInflater.from(parent.getContext()).inflate(R.layout.item_movie, parent, false);
    return new MyHolder(cardView,mOnItemClickListener);
}

@Override
public void onBindViewHolder(MyHolder holder, int position) {
    holder.bind(position);
}

@Override
public int getItemCount() {
    mMovies = MoviePuller.getMovies();
    if (mMovies != null) {
        return mMovies.length();
    }
    return 0;
}

public interface OnItemClickListener {
    void onItemClick(View v, int position);
}

public void setOnItemClickListener(OnItemClickListener listener) {
    mOnItemClickListener = listener;
}

class MyHolder extends RecyclerView.ViewHolder implements View.OnClickListener {

    public ImageView mPoster;
    public TextView mTitle;
    private OnItemClickListener mOnItemClickListener;

    public MyHolder(View itemView, OnItemClickListener listener) {
        super(itemView);
        mOnItemClickListener = listener;
        mTitle = (TextView) itemView.findViewById(R.id.title);
        mPoster = (ImageView) itemView.findViewById(R.id.poster);
        itemView.setOnClickListener(this);
    }

    public void bind(int position) {
        if (mMovies != null) {
            try {
                JSONObject movie = mMovies.getJSONObject(position);
                String title = movie.getString(Constants.KEY_TITLE);
                String posterPath = movie.getString(Constants.KEY_POSTER_PATH);
                Picasso.with(itemView.getContext()).
                        load(MoviePuller.POSTER_BASE_URL + posterPath).into(mPoster);
                mPoster.setTransitionName(itemView.getResources().getString(R.string.transition_poster) + position);
                mTitle.setText(title);
            } catch (JSONException e) {
                e.printStackTrace();
            }
        }
    }

    @Override
    public void onClick(View v) {
        if (mOnItemClickListener != null) {
            mOnItemClickListener.onItemClick(v, getAdapterPosition());
        }
    }
}
}

это моя детальная деятельность

public class MovieDetailActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_moviedetail);
    Slide slide = new Slide(Gravity.BOTTOM);
    slide.addTarget(R.id.divider);
    slide.addTarget(R.id.vote_average);
    slide.addTarget(R.id.release_date);
    slide.addTarget(R.id.plot_synopsis);
    slide.addTarget(R.id.rating);
    slide.addTarget(R.id.divider1);
    getWindow().setEnterTransition(slide);

    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    ImageView poster = (ImageView) findViewById(R.id.poster);
    TextView tvTitle = (TextView) findViewById(R.id.title);
    RatingBar voteAverage = (RatingBar) findViewById(R.id.vote_average);
    TextView tvReleaseDate = (TextView) findViewById(R.id.release_date);
    TextView tvPlotSynopsis = (TextView) findViewById(R.id.plot_synopsis);
    TextView tvRating = (TextView) findViewById(R.id.rating);

    int position = getIntent().getIntExtra(Constants.POSITION, -1);
    poster.setTransitionName(getString(R.string.transition_poster) + position);
    JSONArray movies = MoviePuller.getMovies();
    if(movies != null && movies.length() > position) {
        try {
            JSONObject movie = movies.getJSONObject(position);
            String title = movie.getString(Constants.KEY_TITLE);
            String poster_path = movie.getString(Constants.KEY_POSTER_PATH);
            String release_date = movie.getString(Constants.KEY_RELEASE_DATE);
            String vote_average = movie.getString(Constants.KEY_VOTE_AVERAGE);
            String overview = movie.getString(Constants.KEY_OVERVIEW);
            String id = movie.getString(Constants.KEY_ID);
            MoviePuller.getMoviePuller().getTrailers(id);
            MoviePuller.getMoviePuller().getReviews(id);
            toolbar.setTitle(title);
            setSupportActionBar(toolbar);

            Picasso.with(this).load(MoviePuller.POSTER_BASE_URL+poster_path).into(poster);
            tvTitle.setText(title);
            tvReleaseDate.setText(release_date);
            tvPlotSynopsis.setText(overview);
            voteAverage.setRating(Float.parseFloat(vote_average)/2);
            tvRating.setText(vote_average);

        } catch (JSONException e) {
            e.printStackTrace();
        }
    }

}

@Subscribe
public void onEvent(EventId eventId){
    if(eventId.mId == EventId.GET_TRAILER_SUCCESS){
        JSONArray trailerArray = (JSONArray) eventId.mEventObject;
    }else if(eventId.mId == EventId.GET_REVIEW_SUCCESS){
        JSONArray reviewArray = (JSONArray) eventId.mEventObject;
    }
}
}

recyclerView xml выглядит так

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
app:layout_behavior="@string/appbar_scrolling_view_behavior"
tools:context=".activities.MainActivity"
tools:showIn="@layout/activity_main">

<android.support.v7.widget.RecyclerView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/movie_grid"/>
</RelativeLayout>

Что мне делать, чтобы избежать этого?

я записываю gif


person sunk    schedule 11.09.2016    source источник
comment
Можете ли вы опубликовать полный класс адаптера, класс активности или фрагмента, а также связанный с ним файл gridlayout xml.   -  person Gurupad Mamadapur    schedule 11.09.2016
comment
@Protino, я отредактировал его, пожалуйста, помогите мне с этим .. я борюсь с этим около 2 месяцев ...   -  person sunk    schedule 11.09.2016


Ответы (1)


Я предполагаю, что проблема в том, как вы передаете позиции представлений между DetailActivity и MainActivity.

В методе MainActivity onItemClick() замените это

intent.putExtra(Constants.POSITION, position);

с этим

Bundle bundle = new Bundle();
bundle.putInt(Constants.POSITION, position);
intent.putExtras(bundle);

И в DetailActivity замените это

int position = getIntent().getIntExtra(Constants.POSITION, -1);

с этим

int position = getIntent().getExtras().getInt(Constants.POSITION);

Кроме того, что такое itemView в методе MyHolder class, bind(). Вам нужно передать контекст адаптеру и использовать его.

Создайте этот конструктор в MovieGridAdapter :

public MovieGridAdapter(Context context) {
    this.context = context;
}

и в методе bind() замените вхождения itemView:

Picasso.with(context).load(MoviePuller.POSTER_BASE_URL + posterPath).into(mPoster);
mPoster.setTransitionName(context.getString(R.string.transition_poster) + position);

Инициализируйте MovieGridAdapter в MainActivity следующим образом:

mAdapter = new MovieGridAdapter(this);
person Gurupad Mamadapur    schedule 11.09.2016
comment
привет, я сделал то, что ты сказал, и это все равно произошло - person sunk; 11.09.2016
comment
я записываю гифку, чтобы вы могли увидеть это появление - person sunk; 11.09.2016