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이 없다는 생각 때문에
는 관련없는 제거하려고하지만, 당신은'목록 목록 = response.body(). getMoviesResult()'및 그 이후의 루프가 필요하지 않습니다. –
감사합니다. 내 logcat에서 응답이 오는 것을 볼 수는 있지만 수신 된 응답을 어떻게 표시합니까? 새끼 clerview. – Nzadibe
이 질문에 정보를 추가해야합니다. 응답 본문에서 목록의 크기를 확인 했습니까? 데이터가 리턴되면, 어댑터가 데이터를 데이터 세트로 수신하는지 확인하십시오. – Orbit