使用RecyclerView改造Android JSON解析 [英] Retrofit Android JSON Parsing With RecyclerView

查看:138
本文介绍了使用RecyclerView改造Android JSON解析的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我最近了解了一些有关Retrofit2进行json解析的知识.我尝试自己实施,但未显示任何输出,并且在log cat中也没有错误.有什么事吗看看下面的代码:

I recently learnt a bit about json parsing with retrofit2. I tried implementing on my own but no output is shown and no errors either in the log cat. What could be wrong? Take a look at my code below:

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) {

        }
    });

}

}

电影数据模型类如下所示:

Movies data model class is shown below:

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适配器类:

Also take a look at my recyclerview adapter class:

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网站获取的.请指出出什么问题.

The json data was fetched from themoviedb website with an api key. Kindly point out what's wrong.

推荐答案

您输入有误

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

您正在创建大小为0的新列表,因此您的适配器始终认为没有元素

You are creating new list , which size is 0, so your adapter always thinks there are no elememnts

只需尝试删除 moviesList = new ArrayList<>();

这篇关于使用RecyclerView改造Android JSON解析的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆