2017-01-30 4 views
1

私はvolleyを使用してムービーに関する情報をロードするためのtmdbデータベースへのREST APIリクエストを作成しています。リサイクラビューにサムネイル画像のポスターが表示されます。しかし、それは何も表示されていません。私は画像を読み込むためにピカソライブラリを使用しています。画像リンクは私がアンドロイドリサイクラービューのPicassoはイメージをロードしません

activity_main.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> 

list_item_layout.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> 

MainActivity

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

     } 
    } 
} 

MovieDataLoaderログ文で確認している、細かい構成され

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


} 
+0

これに続くhttp://stackoverflow.com/questions/25744344/android-picasso-load-image-failed-how-to-show-error-messageピカソのエラーメッセージを記録し、ログで質問を編集してください –

+0

どのようにしてデータベースにイメージを保存しましたか?flower.pngのような単一の写真を保存しましたか?http:/Images/flower.png –

+0

@LutaayaHuzaifahIdrisどこのイメージを保存していません...私は午前画像ビューにピカソライブラリを使用してそれらを読み込むだけです。 –

答えて

2

バグがどこにあるのか、どのように見つけられるのかを指摘します。

  • は慎重にログを読んで、あなたはブレークポイントを追加し、debug modeで実行することにより、onBindViewHolder内のコードを点検権限
  • に関連するエラーが表示されます。いくつかの定数には問題があります。
  • activity_main.xml、特にRecyclerViewの属性を確認してください。

これらが見つからない場合にのみ先に進んでください。


  • あなたがのmanifest.xmlにuses - INTERNET権限を追加する必要があります。
  • BASE_URLに余分な先頭スペースがあります。それを除く。
  • wrap_contentからmatch_parentに変更してください。

また、このようにリスナーを追加しないでください。 adapter変数をfinalとして宣言する必要がないように、MainActivity.class自体に実装する必要があります。プルリクエストhereを確認してください。

+0

@GurupadMamadpur答えをありがとう。リサイクルビューの属性を最初は空であるため変更する必要がありますので、コンテンツはありません。 –

+0

@BharatMukkala喜んで助けてください。私は根本的な原因が分からないので、 'GridLayoutManager'はwrap_contentに設定されていると幅と高さを測定できないと思います。いくつかのバグ修正とそれに関連する問題があるように見えます。[1](http://stackoverflow.com/questions/26649406/nested-recycler-view-height-doesnt-wrap-its-content)、[2] (http://stackoverflow.com/questions/36382391/recycler-view-item-fill-up-entire-recycler-view-height-after-upgrading-support-l)&[3](http:// stackoverflow。 com/questions/35619022/nullpoint-in-dissapearence-animation-of-recyclerview-from-support-v-2)を参照してください。 –

関連する問題