2016-12-30 18 views
0

最近、retrofit2でjsonの解析について少し勉強しました。私は自分で実装しようとしましたが、出力は表示されず、ログcatにもエラーはありません。何が間違っていますか?以下の私のコードを見てみましょう:AndroidのJSONをRecyclerViewで解析する

public class MainActivity extends AppCompatActivity { 

private RecyclerView recyclerView; 
private RestClient restClient; 
private List<Movies> moviesList = new ArrayList<>(); 
private MoviesAdapter adapter; 

private final String TAG = MainActivity.class.getCanonicalName(); 
private RelativeLayout relativeLayout; 

private static final String API_KEY = ""; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    relativeLayout = (RelativeLayout) findViewById(R.id.activity_main); 

    if (API_KEY.isEmpty()){ 
     Snackbar.make(relativeLayout, "Access Requires an API Key", Snackbar.LENGTH_LONG); 
    } 

    recyclerView = (RecyclerView) findViewById(R.id.rView); 
    recyclerView.setHasFixedSize(true); 
    recyclerView.setRecycledViewPool(new RecyclerView.RecycledViewPool()); 
    recyclerView.setLayoutManager(new LinearLayoutManager(this)); 

    adapter = new MoviesAdapter(MainActivity.this, moviesList, R.layout.movie_items_layout); 
    recyclerView.setAdapter(adapter); 

    restClient = new RestClient(); 
    RestEndpoint restService = restClient.getMoviesClient().create(RestEndpoint.class); 
    Call<MoviesResponse> moviesResponseCall = restService.getTopRatedMovies(API_KEY); 
    moviesResponseCall.enqueue(new Callback<MoviesResponse>() { 
     @Override 
     public void onResponse(Call<MoviesResponse> call, Response<MoviesResponse> response) { 

      moviesList.clear(); 
      moviesList.addAll(response.body().getMoviesResult()); 
      List<Movies> list = response.body().getMoviesResult(); 
      for (Movies movies : list){ 
       Movies movies1 = new Movies(movies.isAdult(), movies.getOverview(), movies.getReleaseDate(), 
         movies.getTitle(), movies.getBackdropPath(), movies.getVoteAverage()); 
      } 
      adapter.notifyDataSetChanged(); 

      //moviesList = response.body().getMoviesResult(); 

      Log.v(TAG, "Number of Movies Received:" + moviesList.size()); 

     } 

     @Override 
     public void onFailure(Call<MoviesResponse> call, Throwable t) { 

     } 
    }); 

} 

}

作品データモデルクラスを以下に示します。

public class Movies { 

@SerializedName("poster_path") 
private String posterPath; 

@SerializedName("adult") 
private boolean adult; 

@SerializedName("overview") 
private String overview; 

@SerializedName("release_date") 
private String releaseDate; 

@SerializedName("genre_ids") 
private List<Integer> genreIds; 

@SerializedName("id") 
private int id; 

@SerializedName("original_title") 
private String originalTitle; 

@SerializedName("original_language") 
private String originalLanguage; 

@SerializedName("title") 
private String title; 

@SerializedName("backdrop_path") 
private String backdropPath; 

@SerializedName("popularity") 
private double popularity; 

@SerializedName("vote_count") 
private String voteCount; 

@SerializedName("video") 
private boolean video; 

@SerializedName("vote_average") 
private double voteAverage; 

public Movies(boolean adult, String overview, String releaseDate, String title, String backdropPath, double voteAverage) { 
    this.adult = adult; 
    this.overview = overview; 
    this.releaseDate = releaseDate; 
    this.title = title; 
    this.backdropPath = backdropPath; 
    this.voteAverage = voteAverage; 
} 

public Movies() { 
} 

public boolean isAdult() { 
    return adult; 
} 

public void setAdult(boolean adult) { 
    this.adult = adult; 
} 

public String getOverview() { 
    return overview; 
} 

public void setOverview(String overview) { 
    this.overview = overview; 
} 

public String getReleaseDate() { 
    return releaseDate; 
} 

public void setReleaseDate(String releaseDate) { 
    this.releaseDate = releaseDate; 
} 

public String getTitle() { 
    return title; 
} 

public void setTitle(String title) { 
    this.title = title; 
} 

public String getBackdropPath() { 
    return backdropPath; 
} 

public void setBackdropPath(String backdropPath) { 
    this.backdropPath = backdropPath; 
} 

public double getVoteAverage() { 
    return voteAverage; 
} 

public void setVoteAverage(double voteAverage) { 
    this.voteAverage = voteAverage; 
} 

}

また、私recyclerviewアダプタクラスを見てみましょう:

public class MoviesAdapter extends RecyclerView.Adapter<MoviesHolder> { 

private Context context; 
private List<Movies> moviesList; 
private int rowLayout; 

public MoviesAdapter(Context context, List<Movies> moviesList, int rowLayout) { 
    this.context = context; 
    this.moviesList = moviesList; 
    this.rowLayout = rowLayout; 
} 

@Override 
public MoviesHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    View mView = LayoutInflater.from(parent.getContext()).inflate(rowLayout, parent, false); 
    return new MoviesHolder(mView); 
} 

@Override 
public void onBindViewHolder(MoviesHolder holder, int position) { 
    Movies movies = moviesList.get(position); 
    holder.title.setText(movies.getTitle()); 
    holder.date.setText(movies.getReleaseDate()); 
    holder.desription.setText(movies.getOverview()); 
    holder.rating.setText(String.valueOf(movies.getVoteAverage())); 

    Picasso.with(context) 
      .load(movies.getBackdropPath()) 
      .into(holder.backdrop); 
} 

@Override 
public int getItemCount() { 
    moviesList = new ArrayList<>(); 
    return moviesList.size(); 
} 

}

jsonデータは、apovキーを使用してthemoviedbウェブサイトから取得されました。何が間違っているかを親切に指摘する。

+0

無関係を削除してみてください何elememntsがないと思って、サイズが0である新しいリストを作成されますが、

@Override public int getItemCount() { moviesList = new ArrayList<>(); return moviesList.size(); } 

に誤りがありますリスト list = response.body()。getMoviesResult() 'とその後のループ –

+0

ありがとう、ありがとう。私のlogcatでは、応答が来ているのが分かるが、受信した応答を内部でどのように表示するかリサイclerview。 – Nzadibe

+0

この質問に情報を追加する必要があります。レスポンスボディからリストのサイズを確認しましたか?データが返されている場合は、アダプタがデータをデータセットに受け取っていることを確認してください。 – Orbit

答えて

1

あなたがあなたのアダプタが常に

だけmoviesList = new ArrayList<>();