gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 00:18:00 26 4
gpt4 key购买 nike

我一直在努力让回收者的观点与改造一起工作。我似乎从 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/

26 4 0
文章推荐: java - 每次滑动刷新后,如何阻止 WebView 应用程序进入主页?
文章推荐: javascript - 如何在标签条中添加多张图片 (Kendo TabStrip)
文章推荐: javascript - 未捕获的类型错误 : Object # has no method '_isNullOrUndefined'