recycleview无法获取json数据

时间:2017-10-15 19:45:40

标签: java android json network-programming

我有电影Android应用程序,其中包含recycleview与它的适配器,并与api json数据联网,所以当我运行应用程序时,它安装并打开但我得到一个白色空包含在recycleview中没有数据(图像)并且不要'为什么呢 这是我的代码:

主要活动:

public class MainActivity extends AppCompatActivity {

        RecyclerViewAdapter mAdapter;
        RecyclerView mMoviesList;

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

        mMoviesList = (RecyclerView) findViewById(R.id.rv_movies);

        GridLayoutManager LayoutManager = new GridLayoutManager(this, 2);

        mMoviesList.setLayoutManager(LayoutManager);

        mMoviesList.setHasFixedSize(true);

        mAdapter = new RecyclerViewAdapter(this);

        mMoviesList.setAdapter(mAdapter);

        loadMoviesData();
    }

    private void loadMoviesData() {
        showMovieDataView();
        new FetchMoviesTask().execute();
    }

    private void showMovieDataView() {
        mMoviesList.setVisibility(View.VISIBLE);
    }

    public class FetchMoviesTask extends AsyncTask<String, Void, ArrayList<MovieItem>> {

        @Override
        protected ArrayList<MovieItem> doInBackground(String... params) {
            if (params.length == 0) {
                return null;
            }
            String movie = params[0];
            URL moviesRequestUrl = NetworkUtils.buildUrl(movie);

            try {
                String jsonMovieResponse = NetworkUtils.getResponseFromHttpUrl(moviesRequestUrl);

                ArrayList<MovieItem> simpleJsonMovieData = OpenMovieJsonUtils.getSimpleMovieStringsFromJson(MainActivity.this, jsonMovieResponse);

                return simpleJsonMovieData;

            } catch (Exception e) {
                e.printStackTrace();
                return null;
            }
        }

        protected void onPostExecute(ArrayList<MovieItem> movieData) {
            if (movieData != null) {
                showMovieDataView();
                    mAdapter.setMovieData(movieData);

            }
        }
    }

        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            MenuInflater inflater = getMenuInflater();
            inflater.inflate(R.menu.sort, menu);
            return true;
        }

        @Override
        public boolean onOptionsItemSelected(MenuItem item) {
            int id = item.getItemId();

            if (id == R.id.most_popular) {
                loadMoviesData();
                return true;
            }

            if (id == R.id.top_rated) {
                return true;
            }

            return super.onOptionsItemSelected(item);
        }
    }

RecycleView适配器:

public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.RecyclerViewHolder> {

    private static final String TAG = RecyclerViewAdapter.class.getSimpleName();
    ArrayList<MovieItem> mMoviesItems;
    private Context context;

    public RecyclerViewAdapter(MainActivity mainActivity) {

    }



    @Override
    public RecyclerViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {
        context = viewGroup.getContext();
        int layoutIdForListItem = R.layout.movie_list_item;
        LayoutInflater inflater = LayoutInflater.from(context);
        boolean shouldAttachToParentImmediately = false;

        View view = inflater.inflate(layoutIdForListItem, viewGroup, shouldAttachToParentImmediately);
        RecyclerViewHolder viewHolder = new RecyclerViewHolder(view);

        return viewHolder;
    }

    @Override
    public void onBindViewHolder(RecyclerViewHolder holder, int position) {
        holder.MoviePopularity.setText(String.valueOf(mMoviesItems.get(position).getPopularity()));
        Picasso.with(this.context).load(mMoviesItems.get(position).getPhoto()).into(holder.MoviePoster);
        holder.MovieName.setText(mMoviesItems.get(position).getName());
    }


    @Override
    public int getItemCount() {
        if (null == mMoviesItems) return 0;
        return mMoviesItems.size();
    }

    public void setMovieData(ArrayList<MovieItem> movieData) {
        mMoviesItems = movieData;
        notifyDataSetChanged();
    }

    class RecyclerViewHolder extends RecyclerView.ViewHolder {

        TextView MoviePopularity;
        ImageView MoviePoster;
        TextView MovieName;

        public RecyclerViewHolder(View itemView) {
            super(itemView);
            MoviePopularity = (TextView)itemView.findViewById(R.id.movie_popularity);
            MoviePoster = (ImageView)itemView.findViewById(R.id.iv_item_movie);
            MovieName = (TextView)itemView.findViewById(R.id.movie_name);
        }
    }
}

网络:

public final class NetworkUtils {

    private static final String TAG = NetworkUtils.class.getSimpleName();

    private static final String MOVIES_BASE_URL = "https://api.themoviedb.org/3/movie/";
    private static final String MOVIES_URL  = MOVIES_BASE_URL;
    private static final String apiKey = "36666cbb5d7e20041e705d1b2c4e7a79";

    final static String SORT_Order = "popular";
    final static String API_PARAM = "api_key";

    public static URL buildUrl(String MoviesQuery) {
        Uri builtUri = Uri.parse(MOVIES_URL).buildUpon()
                .appendPath(SORT_Order)
                .appendQueryParameter(API_PARAM, apiKey)
                .build();

        URL url = null;
        try {
            url = new URL(builtUri.toString());
        } catch (MalformedURLException e) {
            e.printStackTrace();
        }

        Log.v(TAG, "Built URI " + url);
        return url;
    }

    public static String getResponseFromHttpUrl(URL url) throws IOException {
        HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
        try {
            InputStream in = urlConnection.getInputStream();

            Scanner scanner = new Scanner(in);
            scanner.useDelimiter("\\A");

            boolean hasInput = scanner.hasNext();
            if (hasInput) {
                return scanner.next();
            } else {
                return null;
            }
        } finally {
            urlConnection.disconnect();
        }
    }
}

JSON:

public final class OpenMovieJsonUtils {

    public static ArrayList<MovieItem> getSimpleMovieStringsFromJson(Context context, String moviesJsonString)
            throws JSONException {

        final String RESULTS = "results";
        final String POPULARITY = "popularity";
        final String POSTER_PATH = "poster_path";
        final String ORIGINAL_TITLE = "original_title";

        ArrayList<MovieItem> parsedMovieData = new ArrayList<MovieItem>();

        JSONObject moviesObject = new JSONObject(moviesJsonString);
        JSONArray moviesArray = moviesObject.getJSONArray(RESULTS);

        for (int i = 0; i < moviesArray.length(); i++) {
            double popularity;
            String poster_path;
            String original_title;

            moviesObject = moviesArray.getJSONObject(i);

            popularity = moviesObject.getDouble(POPULARITY);
            poster_path = moviesObject.getString(POSTER_PATH);
            original_title = moviesObject.getString(ORIGINAL_TITLE);

            parsedMovieData.add(new MovieItem(popularity, poster_path, original_title));

        }

        return parsedMovieData;
    }
}

自定义类:

public class MovieItem {
    private double popularity;
    private String photo;
    private String name;

    public MovieItem(double popularity, String poster_path, String original_title) {
        this.popularity = popularity;
        this.photo = photo;
        this.name = name;
    }

    public double getPopularity() { return popularity; }
    public String getPhoto() { return photo; }
    public String getName() { return name; }
}

问题出在哪里?

0 个答案:

没有答案