2016-12-30 4 views
0

최근에 retrofit2로 json 파싱에 대해 조금 배웠습니다. 나는 독자적으로 구현을 시도했지만 출력이 표시되지 않으며 로그 고양이에도 오류가 없습니다. 무엇이 잘못 될 수 있습니까? 아래에있는 내 코드를 살펴 보자안드로이드 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) { 

     } 
    }); 

} 

을}

영화 데이터 모델 클래스는 다음과 같습니다

이 또한 내 recyclerview 어댑터 클래스를 살펴

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; 
} 

} :

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 데이터는 API 키로 themoviedb 웹 사이트에서 가져 왔습니다. 잘못된 점을 지적 해주십시오. 어댑터가 항상 더 elememnts이 없다는 생각 때문에

+0

는 관련없는 제거하려고하지만, 당신은'목록 목록 = response.body(). getMoviesResult()'및 그 이후의 루프가 필요하지 않습니다. –

+0

감사합니다. 내 logcat에서 응답이 오는 것을 볼 수는 있지만 수신 된 응답을 어떻게 표시합니까? 새끼 clerview. – Nzadibe

+0

이 질문에 정보를 추가해야합니다. 응답 본문에서 목록의 크기를 확인 했습니까? 데이터가 리턴되면, 어댑터가 데이터를 데이터 세트로 수신하는지 확인하십시오. – Orbit

답변

1

당신은, 당신은 크기가 0 인 새 목록을 작성하는

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

에서 실수가

그냥 moviesList = new ArrayList<>();

관련 문제