java - 使用 Retrofit 和填充 RecyclerView 的 JSON ArrayList 问题

标签 java android json android-recyclerview retrofit

我一直在努力让回收者的观点与改造一起工作。我似乎从 getRecipes() 方法中提取了 JSON,并且我的日志显示一些数据在那里。

但是,当我从 onCreate() 调用我的 getRecipes() 方法时,似乎出了点问题。当我检查我的 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() + "'";
        }
    }
}

食谱服务

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

最佳答案

这将始终为空,因为该行将在获得服务器响应之前执行。

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

关于java - 使用 Retrofit 和填充 RecyclerView 的 JSON ArrayList 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46857467/

相关文章:

java - 如何在 Java 上使用 Sikuli 保存屏幕截图

java - 我们如何分割路径中的日期?

javascript - 如何使用具有父子关系的 JSON 数据创建带复选框的树?

Java 图形用户界面/图形

java - 如何判断一个对象是同一个还是不同的

android - ADB(但不​​是通过 Eclipse)通过 USB 找到我的 Android 设备

android - android中的进程、线程、沙箱和DalvikVM实例是什么?

android - 在设备上构建和安装后自动启动Android应用

MySQL JSON_SEARCH - 不使用双引号

java - 带有 Java 服务器页面的 JSONP