当前位置: 首页 > 知识库问答 >
问题:

毕加索与Android回收视图不加载图像

养焱
2023-03-14

我正在使用volley向tmdb数据库发出RESTAPI请求,以加载有关电影的信息。回收器视图应显示缩略图图像海报。但它没有显示任何东西。我正在使用毕加索图书馆加载图像。图像链接构造得很好,我已经用log语句检查过了

主要活动。xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.example.android.moviesapp.MainActivity">
    <android.support.v7.widget.RecyclerView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/movierecyclerview">
    </android.support.v7.widget.RecyclerView>
</RelativeLayout>

列出项目布局。xml

<?xml version="1.0" encoding="utf-8"?>
   <android.support.v7.widget.CardView
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/movie_poster_cardview">
        <ImageView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/movie_poster_imageview"/>
    </android.support.v7.widget.CardView>

主要活动

package com.example.android.moviesapp;

import android.content.Context;
import android.net.Uri;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;

import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.JsonObjectRequest;
import com.squareup.picasso.Callback;
import com.squareup.picasso.Picasso;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.HashMap;


public class MainActivity extends AppCompatActivity {

    private ArrayList<HashMap<String, String>> movies = new ArrayList<>();
    private ArrayList<String> moviePosters = new ArrayList<>();

    final static String POSTER_PATH = "poster_path";
    final static String TITLE = "title";
    final static String VOTE_COUNT = "vote_count";
    final static String VOTE_AVERAGE = "vote_average";
    final static String OVERVIEW = "overview";
    final static String RELEASE_DATE ="release_date";

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

        final MoviesAdapter adapter = new MoviesAdapter(getApplicationContext(), moviePosters);

        RecyclerView moviesRecyclerView = (RecyclerView) findViewById(R.id.movierecyclerview);
        moviesRecyclerView.setAdapter(adapter);
        moviesRecyclerView.setLayoutManager(new GridLayoutManager(getApplicationContext(), 2));

       try {

           final String BASE_URL =
                   "https://api.themoviedb.org/3/movie/";
           final String movieOrder = "popular";
           final String APPID = /* API KEY HERE */;

           Uri builtUri = Uri.parse(BASE_URL).buildUpon().appendPath(movieOrder).appendQueryParameter("api_key",APPID).build();

           URL url = new URL(builtUri.toString());

            JsonObjectRequest movieRequest = new JsonObjectRequest(Request.Method.GET, url.toString(), null, new Response.Listener<JSONObject>() {

                @Override
                public void onResponse(JSONObject response) {
                    try {


                        JSONArray results = response.getJSONArray("results");

                        Log.d ("DEBUG", response.toString());
                        for (int i = 0; i < results.length(); i++) {

                            JSONObject movieJSON = results.getJSONObject(i);
                            HashMap<String, String> movie = new HashMap<>();
                            movie.put(POSTER_PATH,movieJSON.getString(POSTER_PATH));
                            movie.put(TITLE,movieJSON.getString(TITLE));
                            movie.put(VOTE_COUNT,movieJSON.getString(VOTE_COUNT));
                            movie.put(VOTE_AVERAGE, movieJSON.getString(VOTE_AVERAGE));
                            movie.put(OVERVIEW, movieJSON.getString(OVERVIEW));
                            movie.put(RELEASE_DATE, movieJSON.getString(RELEASE_DATE));
                            movies.add(movie);
                        }
                    }
                    catch (JSONException e) {
                        Log.d ("DEBUG", "JSON exception");
                    }

                    for (HashMap<String, String> movie:movies) {
                        moviePosters.add(movie.get(POSTER_PATH));
                        adapter.notifyDataSetChanged();
                    }
                }
            }, new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError error) {
                    Log.d ("DEBUG","Network Error");
                }
            });

           RequestQueue mRequestQueue = MovieDataLoader.getSingletonInstance(this.getApplicationContext()).getRequestQueue();


            mRequestQueue.add(movieRequest);
        }
        catch (MalformedURLException e) {
            Log.d("DEBUG", "url not formed correctly");
        }



    }

    public class MoviesAdapter extends RecyclerView.Adapter<MoviesAdapter.MoviesViewHolder> {

        private ArrayList<String> movies;
        private Context mContext;

        public class MoviesViewHolder extends RecyclerView.ViewHolder {

            public ImageView mImageView;

            public MoviesViewHolder (View itemView) {
                super(itemView);
                mImageView = (ImageView) itemView.findViewById(R.id.movie_poster_imageview);
            }

        }

        public MoviesAdapter(Context context, ArrayList<String> movies) {
            this.movies = movies;
            mContext = context;
        }

        @Override
        public MoviesViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

            LayoutInflater inflater = LayoutInflater.from(parent.getContext());
            View moviesView = inflater.inflate(R.layout.list_item_layout,parent,false);
            return new MoviesViewHolder(moviesView);

        }

        @Override
        public int getItemCount() {
            return movies.size();
        }

        @Override
        public void onBindViewHolder(MoviesViewHolder holder, int position) {
            String moviePosterPath = movies.get(position);
            final String BASE_URL = " http://image.tmdb.org/t/p/";
            final String IMAGE_SIZE = "w185";

            Uri posterPath = Uri.parse(BASE_URL).buildUpon().appendPath(IMAGE_SIZE).appendEncodedPath(moviePosterPath).build();
            Log.d("DEBUG",posterPath.toString());
            picasso.with(mContext).load(posterPath.toString()).into(holder.mImageView);

        }
    }
}

电影数据加载器

package com.example.android.moviesapp;

import android.content.Context;
import android.graphics.Bitmap;
import android.util.LruCache;

import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.toolbox.ImageLoader;
import com.android.volley.toolbox.NetworkImageView;
import com.android.volley.toolbox.Volley;

public class MovieDataLoader {

    private static MovieDataLoader mSingletonInstance;
    private RequestQueue mRequestQueue;
    private static Context mCtx;

    private MovieDataLoader(Context ctx) {
        mCtx = ctx;
        mRequestQueue = getRequestQueue();

    }

    public static synchronized MovieDataLoader getSingletonInstance(Context ctx) {
        if (mSingletonInstance == null) {
            mSingletonInstance = new MovieDataLoader(ctx);
        }
        return mSingletonInstance;
    }

    public RequestQueue getRequestQueue() {
        if(mRequestQueue == null) {

            mRequestQueue = Volley.newRequestQueue(mCtx.getApplicationContext());
        }
        return mRequestQueue;
    }

    public <T> void addToRequestQueue(Request<T> req) {
        getRequestQueue().add(req);
    }


}

共有1个答案

谢昊乾
2023-03-14

我将指出bug的位置以及如何找到它们。

  • 仔细阅读日志,您将看到与权限相关的错误
  • 通过添加断点并在调试模式下运行,检查onBindViewHolder中的代码。某个常数存在问题
  • 检查您的活动\u main。xml,尤其是RecyclerView的属性

只有在找不到的情况下才能继续。

  • 需要在manifest.xml.中添加use-INTERNET权限
  • BASE_URL有一个额外的领先空间。移除它。
  • 更改wrap_contentmatch_parent

此外,您不应该以这种方式添加侦听器。您应该在main活动中实现它们。类本身,这样您就不需要将适配器变量声明为final。检查此处的拉动请求。

 类似资料:
  • 当我尝试将Image URL解析到ImageView中时,回收器视图不显示,活动为空。我正在使用Picasso将图像加载到适配器类中的onBinfViewHolder方法中。这是相关代码 代表: } RepRvAdapter: } 解析JSON数据的方法: 现在,我有一行解析图像URL的代码被注释掉了。行取消注释后,活动将不再显示。如何获取要在ImageView中解析和显示的图像url?我认为这可

  • 问题内容: 我想使用Picasso在列表视图中一个接一个地加载三个连续的图像。使用毕加索提供的方法可以轻松做到这一点。但是,由于这些图像在不同的时间加载,因此在图像进入时会产生闪烁效果。例如,有时图像2出现在图像1之前,而当图像1加载时会导致不自然的结结。如果可以将listview的可见性设置为不可见,直到可以显示所有图像,那将更好。但是,我找不到用于毕加索的回调方法,该方法会在加载图像时发出信号

  • 我正在使用毕加索图书馆。我知道,如果我将图片从URL加载到图像视图中,有一种回调方法。但我不想加载到imageview中。相反,我想将其另存为位图。所以我用了下面的代码 我怎样才能得到一个回调方法,知道我的图像是成功下载使用毕加索? 不要说位图对象的空检查。这会导致错误。

  • 正如你可以看到的使用链接,毕加索只有3个选项加载一个图像。我的问题是,如果您有一个从API的JSON响应解析的base64字符串,那么如何加载图像?

  • 我试图显示图像从Firebase数据库中的回收视图在Android Studio,但图像不显示。我不确定我哪里出错了,也不知道问题出在哪里。 主Activity.xml 标志和物品。xml 标志tems.java 主要活动。JAVA LogoItemsAdapter。JAVA

  • 我面临毕加索无法快速加载图像的问题。 有3个显示左、中、右图像。在快进/后退时,对于给定的时间点,选择左、中、右并显示在三个框中。 这是初始化。缓存是100MB以及99MB的 窗口移动的图像数是3000。所以我将图像预加载为 平均图像大小为10KB-320x180,因此达到35MB,小于99MB。 当快速循环工作时,许多图像是(来自)和(来自),但在几个快速循环之后,3个图像冻结或变得非常慢。此时