2017-10-20 21 views
0

私はretrofitでリサイクルビューを操作しようとしています。私はgetRecipes()メソッド内からJSONの罰金を引っ張っているようですが、私のログはいくつかのデータがそこにあることを私に示しています。JSONのArrayListにRetrofitを使用し、RecyclerViewを埋め込む問題

しかし、私がgetRecipes()メソッドをonCreate()から呼び出すと、何かが間違っているようです。私のrecipeList配列にonCreate内のJSON結果が含まれているかどうかを確認すると、空であることがわかります。 getRecipes()メソッド内のログにデータがあることが示されているのはなぜですか?

私のリサイクラーの視点に問題があるのか​​、換装をしているのか、それとも何か他のものがあるかどうかは不明です。何日も試してみようとしていたので、どんなアドバイスも大歓迎です。

JSON https://d17h27t6h515a5.cloudfront.net/topher/2017/May/59121517_baking/baking.json

public class ItemListActivity extends AppCompatActivity { 

private boolean mTwoPane; 
public static final String LOG_TAG = "myLogs"; 
public static List<Recipe> recipeList = new ArrayList<>(); 


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

    getRecipes(); 

    //Logging to check that recipeList contains data 

    if(recipeList.isEmpty()){ 
     Log.d(LOG_TAG, "Is empty"); 
    }else { 
     Log.d(LOG_TAG, "Is not empty"); 
    } 

    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
    setSupportActionBar(toolbar); 
    toolbar.setTitle(getTitle()); 

    RecyclerView recyclerView = (RecyclerView) findViewById(R.id.item_list); 
    RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(this); 
    recyclerView.setLayoutManager(layoutManager); 

    SimpleItemRecyclerViewAdapter simpleItemRecyclerViewAdapter = new SimpleItemRecyclerViewAdapter(recipeList); 

    recyclerView.setAdapter(simpleItemRecyclerViewAdapter); 

    if (findViewById(R.id.item_detail_container) != null) { 

     mTwoPane = true; 
    } 

} 


public void getRecipes(){ 

    String ROOT_URL = "https://d17h27t6h515a5.cloudfront.net/topher/2017/May/59121517_baking/"; 

    Retrofit RETROFIT = new Retrofit.Builder() 
      .baseUrl(ROOT_URL) 
      .addConverterFactory(GsonConverterFactory.create()) 
      .build(); 

    RecipeService service = RETROFIT.create(RecipeService.class); 

    Call<List<Recipe>> call = service.getMyJson(); 
    call.enqueue(new Callback<List<Recipe>>() { 
     @Override 
     public void onResponse(Call<List<Recipe>> call, Response<List<Recipe>> response) { 
      Log.d(LOG_TAG, "Got here"); 
      if (!response.isSuccessful()) { 
       Log.d(LOG_TAG, "No Success"); 
      } 

      Log.d(LOG_TAG, "Got here"); 

      recipeList = response.body(); 

      //Logging to check data is there 
      Log.v(LOG_TAG, "LOGS" + recipeList.size()); 

      for (int i = 0; i < recipeList.size(); i++) { 
       String newString = recipeList.get(i).getName(); 

       Ingredients[] ingredients = recipeList.get(i).getIngredients(); 
       for(int j = 0; j < ingredients.length; j++){ 
        Log.d(LOG_TAG, ingredients[j].getIngredient()); 
       } 

       Steps[] steps = recipeList.get(i).getSteps(); 
       for(int k = 0; k < steps.length; k++){ 
        Log.d(LOG_TAG, steps[k].getDescription()); 
       } 

       Log.d(LOG_TAG, newString); 


      } 


     } 

     @Override 
     public void onFailure(Call<List<Recipe>> call, Throwable t) { 
      Log.e("getRecipes throwable: ", t.getMessage()); 
      t.printStackTrace(); 

     } 
    }); 


} 



public class SimpleItemRecyclerViewAdapter 
     extends RecyclerView.Adapter<SimpleItemRecyclerViewAdapter.ViewHolder> { 

    private final List<Recipe> mValues; 

    public SimpleItemRecyclerViewAdapter(List<Recipe> items) { 
     mValues = items; 
    } 

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

    @Override 
    public void onBindViewHolder(final ViewHolder holder, int position) { 

     holder.mItem = mValues.get(position); 
     holder.mContentView.setText(mValues.get(position).getName()); 

     holder.mView.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       if (mTwoPane) { 
        Bundle arguments = new Bundle(); 
        arguments.putString(ItemDetailFragment.ARG_ITEM_ID, holder.mItem.getId()); 
        ItemDetailFragment fragment = new ItemDetailFragment(); 
        fragment.setArguments(arguments); 
        getSupportFragmentManager().beginTransaction() 
          .replace(R.id.item_detail_container, fragment) 
          .commit(); 
       } else { 
        Context context = v.getContext(); 
        Intent intent = new Intent(context, ItemDetailActivity.class); 
        intent.putExtra(ItemDetailFragment.ARG_ITEM_ID, holder.mItem.getId()); 

        context.startActivity(intent); 
       } 
      } 
     }); 
    } 

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

    public class ViewHolder extends RecyclerView.ViewHolder { 
     public View mView; 
     public TextView mContentView; 
     public Recipe mItem; 


     public ViewHolder(View view) { 
      super(view); 
      mView = view; 
      mContentView = (TextView) view.findViewById(R.id.content); 

     } 

     @Override 
     public String toString() { 
      return super.toString() + " '" + mContentView.getText() + "'"; 
     } 
    } 
} 

RecipeService

public interface RecipeService { 
@GET("baking.json") 
Call<List<Recipe>> getMyJson();} 

モデル

レシピ

public class Recipe{ 

private Ingredients[] ingredients; 

private String id; 

private String servings; 

private String name; 

private String image; 

private Steps[] steps; 

public Ingredients[] getIngredients() 
{ 
    return ingredients; 
} 

public void setIngredients (Ingredients[] ingredients) 
{ 
    this.ingredients = ingredients; 
} 

public String getId() 
{ 
    return id; 
} 

public void setId (String id) 
{ 
    this.id = id; 
} 

public String getServings() 
{ 
    return servings; 
} 

public void setServings (String servings) 
{ 
    this.servings = servings; 
} 

public String getName() 
{ 
    return name; 
} 

public void setName (String name) 
{ 
    this.name = name; 
} 

public String getImage() 
{ 
    return image; 
} 

public void setImage (String image) 
{ 
    this.image = image; 
} 

public Steps[] getSteps() 
{ 
    return steps; 
} 

public void setSteps (Steps[] steps) 
{ 
    this.steps = steps; 
} 

@Override 
public String toString() 
{ 
    return "[ingredients = "+ingredients+", id = "+id+", servings = "+servings+", name = "+name+", image = "+image+", steps = "+steps+"]"; 
}} 

成分

public class Ingredients{ 
private String measure; 

private String ingredient; 

private String quantity; 

public String getMeasure() 
{ 
    return measure; 
} 

public void setMeasure (String measure) 
{ 
    this.measure = measure; 
} 

public String getIngredient() 
{ 
    return ingredient; 
} 

public void setIngredient (String ingredient) 
{ 
    this.ingredient = ingredient; 
} 

public String getQuantity() 
{ 
    return quantity; 
} 

public void setQuantity (String quantity) 
{ 
    this.quantity = quantity; 
} 

@Override 
public String toString() 
{ 
    return "[measure = "+measure+", ingredient = "+ingredient+", quantity = "+quantity+"]"; 
}} 

ステップ

public class Steps{ 

private String id; 
    private String shortDescription; 

    private String description; 

    private String videoURL; 

    private String thumbnailURL; 

    public String getId() 
    { 
     return id; 
    } 

    public void setId (String id) 
    { 
     this.id = id; 
    } 

    public String getShortDescription() 
    { 
     return shortDescription; 
    } 

    public void setShortDescription (String shortDescription) 
    { 
     this.shortDescription = shortDescription; 
    } 

    public String getDescription() 
    { 
     return description; 
    } 

    public void setDescription (String description) 
    { 
     this.description = description; 
    } 

    public String getVideoURL() 
    { 
     return videoURL; 
    } 

    public void setVideoURL (String videoURL) 
    { 
     this.videoURL = videoURL; 
    } 

    public String getThumbnailURL() 
    { 
     return thumbnailURL; 
    } 

    public void setThumbnailURL (String thumbnailURL) 
    { 
     this.thumbnailURL = thumbnailURL; 
    } 

    @Override 
    public String toString() 
    { 
     return "[id = "+id+", shortDescription = "+shortDescription+", description = "+description+", videoURL = "+videoURL+", thumbnailURL = "+thumbnailURL+"]"; 
    }} 

ログ

https://gist.github.com/2triggers/12b6eeb32ed8909ab50bbadd4742d7f7

+0

デバッグを試して、Log.v(LOG_TAG、 "LOGS" + recipeList.size());をチェックしてください。サイズは何ですか ? –

答えて

0

これは、レシピリストをポピュレートする前にレシピリストを送信しているためです。レシピリストを空になったアダプタに送信した後、getRecipesメソッドからレシピリストを作成していると思われるかもしれません。実際にgetRecipesはバックグラウンドスレッド上で動作するので、レシピリストが作成される前でもアダプタの割り当てがメインスレッド上で行われるので、基本的に割り当てられているので、getRecipesメソッドはアダプタに割り当てられます。空のリストは、データが変更されたとき、またはレシピリストがgetRecipeメソッド内のデータで満たされたときに通知することができます。あなたはこの後recipelist = response.body権を割り当てるとき

あなたは、アダプタに

に通知したり、右getRecipes方法で

recipelist = response.body; 

後、この二行

SimpleItemRecyclerViewAdapter simpleItemRecyclerViewAdapter = new SimpleItemRecyclerViewAdapter(recipeList); 
recyclerView.setAdapter(simpleItemRecyclerViewAdapter); 

を移動することができます

+0

YEEEESSSSSSSS!ありがとうございました ! – Rogerto

1

この行は、サーバーからの応答を取得する前に実行されますので、これは常に空になります。

if(recipeList.isEmpty()){ 
     Log.d(LOG_TAG, "Is empty"); 
    }else { 
     Log.d(LOG_TAG, "Is not empty"); 
    } 

この行の後にこれをよく呼び出す。recipeList = response.body();

SimpleItemRecyclerViewAdapter simpleItemRecyclerViewAdapter = new SimpleItemRecyclerViewAdapter(recipeList); 

     recyclerView.setAdapter(simpleItemRecyclerViewAdapter); 

     if (findViewById(R.id.item_detail_container) != null) { 

      mTwoPane = true; 
     } 
0

あなたRecipe.class

等から全てatributesとコンストラクタを作成してみてください: 公共成分(文字列測定は、文字列の成分、ストリング量){ this.measure =尺度。 this.ingredients = ingredients; this.quantity =数量

リストのオブジェクトを構成するすべてのクラスで同じ操作を行います。