2016-10-19 11 views
-1

何かの前に、私はアンドロイド開発の初心者だと教えてください。私はAPIからJSONでデータを取得する音楽ストリーミングアプリを開発してきました。私は retrofit2をHTTPクライアントとして、GSONライブラリをJSON解析用に使用しています。なぜ私のアプリは、APIからJSONで取得され、retrofitを使用して、アンドロイドのrecyclerviewでデータを表示しないのですか?

私はTopArtistの情報を取得するためのAPIメソッドに取り組んでいました。そして以下は、クラスやレイアウトです:

MainActicity.java:これが主な活動である

package com.example.myapplication; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.support.v7.widget.RecyclerView; 
import android.support.v7.widget.StaggeredGridLayoutManager; 
import android.util.Log; 
import com.example.myapplication.APIServices.API_Service; 
import com.example.myapplication.Models.Artist; 
import com.example.myapplication.Models.LastAPIRecyclerViewAdapter; 
import java.util.List; 
import butterknife.Bind; 
import butterknife.ButterKnife; 
import retrofit.Call; 
import retrofit.Callback; 
import retrofit.GsonConverterFactory; 
import retrofit.Response; 
import retrofit.Retrofit; 

public class MainActivity extends AppCompatActivity { 

    public static final String API_Url = "http://ws.audioscrobbler.com/2.0/"; 
    public static final String API_Key = "//my API-key"; 

    @Bind(R.id.recyclerView) 
    RecyclerView recyclerView; 

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

     ButterKnife.bind(this); 

     StaggeredGridLayoutManager mStaggeredGridLayoutManager = new StaggeredGridLayoutManager(1, StaggeredGridLayoutManager.VERTICAL); 
     recyclerView.setLayoutManager(mStaggeredGridLayoutManager); 

     Retrofit retrofit = new Retrofit.Builder() 
      .baseUrl(API_Url) 
      .addConverterFactory(GsonConverterFactory.create()) 
      .build(); 

     API_Service api_service = retrofit.create(API_Service.class); 
     Call<List<Artist>> call = api_service.getTopArtist(); 

     call.enqueue(new Callback<List<Artist>>() { 
      @Override 
      public void onResponse(Response<List<Artist>> response, Retrofit retrofit)  
      { 
       List<Artist> artist = response.body(); 
       Log.d("Artist", "onResponse: " + response.code()); 
       LastAPIRecyclerViewAdapter lastAPIRecyclerViewAdapter = new LastAPIRecyclerViewAdapter(artist); 
       recyclerView.setAdapter(lastAPIRecyclerViewAdapter); 
      } 
      @Override 
      public void onFailure(Throwable t) 
      { 
       Log.d("Artist", "onFailure: " + t.getMessage()); 
      } 
     }); 
    } 
} 

APIService.java:

import com.example.myapplication.MainActivity; 
import com.example.myapplication.Models.Artist; 
import java.util.List; 
import retrofit.Call; 
import retrofit.http.GET; 

public interface API_Service { 
    @GET("?method=tag.gettoptracks&tag=pop&api_key=" + MainActivity.API_Key + "&format=json") 
    Call<List<Artist>> getTopArtist(); 
} 

Artist.java:これはモデル/ POJOクラスですこれは、APIのGETリクエストからフェッチされたすべてのデータを格納します。

import java.util.ArrayList; 
import java.util.List; 
import javax.annotation.Generated; 
import com.google.gson.annotations.Expose; 
import com.google.gson.annotations.SerializedName; 

@Generated("org.jsonschema2pojo") 
public class Artist { 
    @SerializedName("name") 
    @Expose 
    private String name; 
    @SerializedName("mbid") 
    @Expose 
    private String mbid; 
    @SerializedName("url") 
    @Expose 
    private String url; 
    @SerializedName("streamable") 
    @Expose 
    private String streamable; 
    @SerializedName("image") 
    @Expose 
    private List<Image> image = new ArrayList<Image>(); 
    @SerializedName("@attr") 
    @Expose 
    private Attr attr; 

    /** 
    * 
    * @return 
    * The name 
    */ 
    public String getName() { 
     return name; 
    } 

    /** 
    * 
    * @param name 
    * The name 
    */ 
    public void setName(String name) { 
     this.name = name; 
    } 

    /** 
    * 
    * @return 
    * The mbid 
    */ 
    public String getMbid() { 
     return mbid; 
    } 

    /** 
    * 
    * @param mbid 
    * The mbid 
    */ 
    public void setMbid(String mbid) { 
     this.mbid = mbid; 
    } 

    /** 
    * 
    * @return 
    * The url 
    */ 
    public String getUrl() { 
     return url; 
    } 

    /** 
    * 
    * @param url 
    * The url 
    */ 
    public void setUrl(String url) { 
     this.url = url; 
    } 

    /** 
    * 
    * @return 
    * The streamable 
    */ 
    public String getStreamable() { 
     return streamable; 
    } 

    /** 
    * 
    * @param streamable 
    * The streamable 
    */ 
    public void setStreamable(String streamable) { 
     this.streamable = streamable; 
    } 

    /** 
    * 
    * @return 
    * The image 
    */ 
    public List<Image> getImage() { 
     return image; 
    } 

    /** 
    * 
    * @param image 
    * The image 
    */ 
    public void setImage(List<Image> image) { 
     this.image = image; 
    } 

    /** 
    * 
    * @return 
    * The attr 
    */ 
    public Attr getAttr() { 
     return attr; 
    } 

    /** 
    * 
    * @param attr 
    * The @attr 
    */ 
    public void setAttr(Attr attr) { 
     this.attr = attr; 
    } 
} 

LastAPIRecyclerViewAdapter.java:

import android.support.v7.widget.CardView; 
import android.support.v7.widget.RecyclerView; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.ImageView; 
import android.widget.TextView; 
import com.example.myapplication.R; 
import java.util.List; 
import butterknife.Bind; 
import butterknife.ButterKnife; 

public class LastAPIRecyclerViewAdapter extends RecyclerView.Adapter<LastAPIRecyclerViewAdapter.LastAPIRecyclerViewHolder>{ 

    private List<Artist> artists; 

    public LastAPIRecyclerViewAdapter(List<Artist> _artist) { 
     this.artists = _artist; 
    } 

    @Override 
    public LastAPIRecyclerViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     View viewItem = LayoutInflater.from(parent.getContext()).inflate(R.layout.custom_cardview, parent, false); 
     return new LastAPIRecyclerViewHolder(viewItem); 
    } 

    @Override 
    public void onBindViewHolder(LastAPIRecyclerViewHolder holder, int position) { 
     holder.title.setText(artists.get(position).getName()); 
    } 

    @Override 
    public int getItemCount() { 
     return 0; 
    } 

    class LastAPIRecyclerViewHolder extends RecyclerView.ViewHolder{ 

     @Bind(R.id.cardView) 
     CardView cardView; 

     @Bind(R.id.textView) 
     TextView title; 

     @Bind(R.id.imageView) 
     ImageView image; 

     LastAPIRecyclerViewHolder(View itemView) { 
      super(itemView); 
      ButterKnife.bind(this, itemView); 
     } 
    } 
} 

custom_cardview.xml:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    android:orientation="horizontal" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:background="@android:color/transparent"> 

    <android.support.v7.widget.CardView 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:id="@+id/cardView" 
     app:cardElevation="2dp"> 

     <ImageView 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:id="@+id/imageView" 
      android:contentDescription="ImageView of the Recycler View" /> 

     <TextView 
      android:text="TextView" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:id="@+id/textView" /> 

    </android.support.v7.widget.CardView> 

</LinearLayout> 

activity_main:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout 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:orientation="vertical" 
    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.myapplication.MainActivity"> 

    <android.support.v7.widget.RecyclerView 
     android:layout_width="wrap_content" 
     android:layout_height="match_parent" 
     android:id="@+id/recyclerView"> 

    </android.support.v7.widget.RecyclerView> 
</LinearLayout> 

私は、このアプリケーションを実行するたびにそう、それは表示されません。私は何でもビュー。ただ空白な活動。どこで私は間違えましたか?

+1

'公共のint getItemCount(){ リターン0; } 'それはどういうことだと思いますか? – njzk2

答えて

1

私の知る限り、他のすべては大丈夫

+0

申し訳ありませんが、それはまだ動作しません。 –

+0

APIからの応答が得られないか、適切にシリアル化できないようです。 ??? –

+0

まあ、それは? 'Log.d(" Artist "、" onResponse: "+ response.code());'あなたが応答を受け取っているかどうかを教えてください。 –

0

は「アーティスト」は値を持っているかどうかを確認し、そのサイズを返すことを忘れないでくださいに見え

@Override 
public int getItemCount() { 
    return 0; 
} 

リストの長さを返すために、これを更新する必要があります。

あなたはこのような何かを追加する必要があります

@Override 
public int getItemCount() { 
    return (null != artist ? artist.size() : 0); 
} 
+0

Nah。それはまだ同じです。エンドポイントからの応答ではないようです。どう思いますか? –

+0

応答が成功したかどうかを確認してください。 'response.isSuccessful();' どのように対応する必要がありますか? –

関連する問題