0

您好我有一個簡單的應用程序,它具有一個帶列表項目(每個代表一個「Movie」對象)的recyclerView。電影列表項目的內容是從API調用(themoviedb。 org)。我試圖通過點擊一個recyclerView列表項來打開一個「細節片段」,我希望點擊的Movie項目中的所有內容都能出現在下一個片段中,現在當我點擊列表項時,什麼都沒有發生,沒有崩潰,甚至我認爲我已經正確設置了監聽器接口,但也許這就是問題,任何人都可以看到我要出錯的地方嗎? 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來創建它( )。