0

こんにちは、リストアイテム(それぞれが "Movie"オブジェクトを表しています)を持つrecyclerViewを備えたシンプルなアプリケーションを持っています。 org)私はrecyclerViewリストアイテムをクリックして "detail fragment"を開こうとしています。クリックしたムービーアイテムのすべてのコンテンツを次のフラグメントにも表示したいと思います。何も起こりませんが、クラッシュはありません。リスナーインターフェイスを正しく設定したと思っていましたが、おそらくそれは問題です。 RecyclerView(ムービーリスト)が最初に表示されます:RecyclerViewアイテムからフラグメントを開くことができません。クリック

ここ
public class ResultsFragment extends Fragment { 
private RecyclerView mRecyclerView; 
Movie_Results_Adapter results_adapter; 
ArrayList<Movie> movieList; 
onMovieSelectedListener listener; 
public ResultsFragment(){ 
} 

@Nullable 
@Override 
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 
    View rootView = inflater.inflate(R.layout.fragment_layout_1, container, false); 
    mRecyclerView = (RecyclerView) rootView.findViewById(R.id.recycler); 
    mRecyclerView.setVisibility(View.VISIBLE); 
    results_adapter = new Movie_Results_Adapter(movieList, listener); 
    listener = new onMovieSelectedListener() { 
     @Override 
     public void onMovieSelected(Movie selectedMovie) { 
      Intent launchIntent = new Intent(getContext(), MovieDetailActivity.class); 
      launchIntent.putExtra(MovieDetailActivity.EXTRA_MOVIE, "movie"); 
      Log.d("PaulsApp", selectedMovie + ""); 
      launchIntent.putExtra(MovieDetailActivity.NEW_EXTRA, (Serializable) selectedMovie); 
      startActivity(launchIntent); 
     } 
    }; 
    RecyclerView.LayoutManager mLayoutManager = new LinearLayoutManager(getContext()); 
    mRecyclerView.setLayoutManager(mLayoutManager); 
    mRecyclerView.setAdapter(results_adapter); 
    Log.d("TAGG", "AAAH" + movieList.toString()); 
    return rootView; 
} 

public void parseJson(String jsonToParse) throws JSONException { 


    JSONObject responseObject= new JSONObject(jsonToParse); 
    JSONArray resultsArray = responseObject.getJSONArray("results"); 
    for(int i = 0; i < resultsArray.length(); i++){ 
     JSONObject movie = resultsArray.getJSONObject(i); 
     String movieName = movie.getString("title"); 
     String movieReleaseDate = movie.getString("release_date"); 
     String movieScore = movie.getString("vote_average"); 
     String moviePopularity = movie.getString("vote_count"); 
     String movieImage = movie.getString("poster_path"); 
     String movieDescription = movie.getString("overview"); 
     Movie movie1 = new Movie(movieName, movieReleaseDate, movieScore, moviePopularity, movieImage, movieDescription); 
     movieList.add(movie1); 
    } 

} 

@Override 
public void setArguments(Bundle args) { 
    movieList = new ArrayList<>(); 
    String arguments = args.getString("JSON_STRING"); 
    try { 
     parseJson(arguments); 
    } catch (JSONException e) { 
     e.printStackTrace(); 
    } 
    super.setArguments(args); 
} 

public interface onMovieSelectedListener{ 
    public void onMovieSelected(Movie selectedMovie); 
} 

}

"結果" 断片ためRecyclerViewアダプタである:ここ

public class Movie_Results_Adapter extends RecyclerView.Adapter<Movie_Results_Adapter.ResultViewHolder>{ 
    ArrayList<Movie> MovieListArray; 
    ResultsFragment.onMovieSelectedListener listener; 
    private Activity mActivity; 



    public class ResultViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{ 
     TextView titleText; 
     TextView dateText; 
     TextView scoreText; 
     TextView popularityText; 
     ImageView movieImage; 
     public Movie movie; 
     public ResultViewHolder(View itemView){ 
      super(itemView); 
      titleText = (TextView) itemView.findViewById(R.id.movie_title_text); 
      dateText = (TextView) itemView.findViewById(R.id.movie_date_text); 
      scoreText = (TextView) itemView.findViewById(R.id.movie_score_text); 
      popularityText = (TextView) itemView.findViewById(R.id.movie_popularity_text); 
      movieImage = (ImageView) itemView.findViewById(R.id.movie_image); 
     } 

     @Override 
     public void onClick(View view) { 
      if (listener != null) { 
       listener.onMovieSelected(MovieListArray.get(getAdapterPosition())); 
       Toast.makeText(view.getContext(), "clicked: " + MovieListArray.get(getAdapterPosition()), Toast.LENGTH_SHORT).show(); 

      } 
     } 
    } 

    public Movie_Results_Adapter(ArrayList<Movie> movieList, ResultsFragment.onMovieSelectedListener listener){ 
     MovieListArray = movieList; 
     this.listener = listener; 
    } 


    @Override 
    public ResultViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.movie_result_list_item, parent, false); 

     ResultViewHolder vh = new ResultViewHolder(v); 
     return vh; 
    } 

    @Override 
    public void onBindViewHolder(ResultViewHolder holder, int position) { 
     holder.titleText.setText(MovieListArray.get(position).getmTitle()); 
     Log.d("TAGG", MovieListArray.toString()); 
     holder.dateText.setText("Released "+MovieListArray.get(position).getmReleaseYear()); 
     holder.scoreText.setText("TMDB Score: "+MovieListArray.get(position).getmScore()); 
     holder.popularityText.setText(MovieListArray.get(position).getmPopularity()+" votes"); 
     Context context = holder.movieImage.getContext(); 
     Picasso.with(context).load(Constants.TMDB_POSTER+MovieListArray.get(position).getmImage()).into(holder.movieImage); 
    } 

    @Override 
    public int getItemCount() { 
     return MovieListArray.size(); 
    } 


} 

の詳細断片(および付随する活性)である:

package jetsetpaul.movienerd; 

import android.content.Context; 
import android.os.Bundle; 
import android.support.annotation.Nullable; 
import android.support.v4.app.Fragment; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.ImageView; 
import android.widget.TextView; 

import com.squareup.picasso.Picasso; 

/** 
* Created by pauljoiner on 8/17/16. 
*/ 
public class MovieDetailFragment extends Fragment { 
    public String movieTitle; 
    public String movieImage; 
    public String movieDate; 
    public String movieDescription; 


    @Nullable 
    @Override 
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 
     View rootView = inflater.inflate(R.layout.movie_detail_fragment, container, false); 
     TextView mTitleText = (TextView) rootView.findViewById(R.id.movie_detail_title); 
     ImageView mMovieImage = (ImageView) rootView.findViewById(R.id.movie_detail_image); 
     TextView mDateText = (TextView) rootView.findViewById(R.id.movie_detail_release_date); 
     TextView mDescriptionText = (TextView) rootView.findViewById(R.id.movie_detail_description); 
     mTitleText.setText(movieTitle); 
     mDateText.setText(movieDate); 
     mDescriptionText.setText(movieDescription); 
     Context context = mMovieImage.getContext(); 
     Picasso.with(context).load(Constants.TMDB_POSTER+movieImage); 

     return rootView; 
    } 
    public void setMovieTitle(String title){ 
     this.movieTitle = title; 
    } 
    public void setMovieImage(String image){ 
     this.movieImage = image; 
    } 
    public void setMovieDate(String date){ 
     this.movieDate = date; 
    } 
    public void setMovieDescription(String description){ 
     this.movieDescription = description; 
    } 
} 

活性: パッケージjetsetpaul.movi​​enerd;

import android.content.Intent; 
import android.os.Bundle; 
import android.support.annotation.Nullable; 
import android.support.v4.app.Fragment; 
import android.support.v4.app.FragmentTransaction; 
import android.support.v7.app.AppCompatActivity; 
import android.util.Log; 

/** 
* Created by pauljoiner on 8/17/16. 
*/ 
public class MovieDetailActivity extends AppCompatActivity { 
    public static final String EXTRA_MOVIE = "movie"; 
    public static final String NEW_EXTRA = "movie2"; 
    @Override 
    protected void onCreate(@Nullable Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_movie_detail); 

     Intent i = getIntent(); 
     if(i.hasExtra(NEW_EXTRA)) { 
      Log.d("PaulsApp", "Had Extra!"); 
      //set the text in my fragment 
      Movie movie = (Movie) i.getSerializableExtra(NEW_EXTRA); 
      Fragment newFragment = new MovieDetailFragment(); 

      FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); 
      transaction.replace(R.id.detail_fragment, newFragment); 
      transaction.commit(); 
      ((MovieDetailFragment) newFragment).setMovieTitle(movie.getmTitle()); 
      ((MovieDetailFragment) newFragment).setMovieImage(movie.getmImage()); 
      ((MovieDetailFragment) newFragment).setMovieDate(movie.getmReleaseYear()); 
      ((MovieDetailFragment) newFragment).setMovieDescription(movie.getmDescription()); 

     } 
    } 
} 

必要に応じてさらにコードを投稿できます。再度、感謝します!

+0

この投稿をご覧ください: https://stackoverflow.com/questions/24885223/why-doesnt-recyclerview-have-onitemclicklistener-and-how-recyclerview-is-dif –

答えて

1

あなたのリスナーはしかし正直に言うと、あなたのresults_adapter前

listener = new onMovieSelectedListener() { 
    @Override 
    public void onMovieSelected(Movie selectedMovie) { 
     Intent launchIntent = new Intent(getContext(), MovieDetailActivity.class); 
     launchIntent.putExtra(MovieDetailActivity.EXTRA_MOVIE, "movie"); 
     Log.d("PaulsApp", selectedMovie + ""); 
     launchIntent.putExtra(MovieDetailActivity.NEW_EXTRA, (Serializable) selectedMovie); 
     startActivity(launchIntent); 
    } 
}; 
results_adapter = new Movie_Results_Adapter(movieList, listener); 

を作成する必要があり、それは代わりに新しいonMovieSelectedListenerを使用して、それを作成するのでリスナー(インタフェース)を実装するためにあなたのフラグメントのための最高のだろう( )。

関連する問題