2016-09-11 8 views
0

私は2つのアクティビティを持っています.1つはムービーリストを示し、もう1つはムービーの詳細を示します。私は映画のポスターで共有要素の移行を持っています。私はlinearlayoutmanagerで使用するとうまく動作しますが、recyclerViewにgridLayoutManagerを使用すると、戻るボタンを押して詳細アクティビティから戻った後、他の画像はここに示すように空白になります。 imagerecyclerViewでgridLayoutManagerと併用すると、画像ビューが空白になります

この写真では、x-men'sムービーポスターをクリックしましたが、隣の画像は空白になります。

すべてのアイテムに一意のtransitionNameを設定しました。それはおそらく理由ではないでしょう。

この

が、これは私のアダプタ

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 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 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> 
のようなものです

これを避けるにはどうすればよいですか?

私は、問題はあなたがDetailActivityMainActivity間の意見の位置を渡している方法であると思いgif

+0

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

をバインド()メソッドでは、itemViewの出現箇所を置き換えます。このようにMainActivityで

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

初期化MovieGridAdapterあなたは完全なアダプタクラス、アクティビティ、またはフラグメントクラス、さらにはアトソをポストしますcated gridlayout xml。 –

+0

@Protino私はそれを編集しました。この2ヶ月の間、この闘いで私を助けてください... – sunk

答えて

0

を記録。 MainActivity

onItemClick()方法この

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

この

intent.putExtra(Constants.POSITION, position); 

を交換しDetailActivityにこの

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

のwiを置き換えますこの

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

番目また、bind()方法、​​でitemViewものです。コンテキストをアダプターに渡して、それを使用する必要があります。

MovieGridAdapterでこのコンストラクタを作成しますことができます

mAdapter = new MovieGridAdapter(this); 
+0

こんにちは、私はあなたが言ったことをやったが、それはまだ起こった – sunk

+0

私はgifを記録するので、このappearence – sunk

関連する問題