Android应用程序从api(模型到活动)检索数据

时间:2015-11-04 03:55:08

标签: java android api android-activity

我正在制作鸡尾酒安卓应用。

我搜索一个鸡尾酒的名字,然后收到我使用的API中所有鸡尾酒的列表视图。我在列表视图中单击项目(鸡尾酒),然后在新活动(称为CocktailDisplay)中显示鸡尾酒(名称,缩略图,成分等)的信息。我通过intent传递了SearchCocktail活动中的鸡尾酒名称。从那里,我只是在CocktailDisplay中显示该文本。

我想首先展示鸡尾酒的图像和名称。

我遇到了麻烦,新的帮助,访问模型以获取缩略图所需的信息以及最终的成分和其他信息。

我是Android开发的新手,所以我不确定我是否走在正确的道路上。

提前致谢!这是我的代码。

SearchActivity.java(将数据传递给CocktailDisplay.java的部分)

        ListView1.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> arg0, View v, int position, long id) {
            DrinkRecipeModel value = (DrinkRecipeModel) ListView1.getItemAtPosition(position);
            // selected item
            String cocktail = value.getDrinkName();
            Intent myIntent = new Intent(getApplicationContext(), CocktailDisplay.class);
            // sending data to new activity
            myIntent.putExtra("selected-item", cocktail);
            startActivity(myIntent);

        }
    });

DrinkRecipeModel.java

import com.google.gson.annotations.SerializedName;

import java.util.ArrayList;


public class DrinkRecipeModel {
    @SerializedName("idDrink")
    private int drinkId;

    @SerializedName("strDrink")
    private String drinkName;

    @SerializedName("categories")
    private String drinkCategories;

    @SerializedName("strDrinkThumb")
    private String drinkThumb;

    @SerializedName("ingredients")
    private ArrayList<String> ingredients;

    public int getDrinkId() {
        return drinkId;
    }

    public String getDrinkName(){
        return drinkName;
    }

    public String getDrinkCategories(){
        return drinkCategories;
    }

    public String getDrinkThumb(){
        return drinkThumb;
    }

    public ArrayList<String> getIngredients() { return ingredients; }


    public void setDrinkId(int drinkId) { this.drinkId = drinkId; }

    public void setDrinkName(String drinkName) { this.drinkName = drinkName; }

    public void setDrinkCategories(String drinkCategories) {
        this.drinkCategories = drinkCategories;
    }

    public void setDrinkThumb(String drinkThumb) {
        this.drinkThumb = drinkThumb;
    }

    public void setIngredients(ArrayList<String> ingredients) {
        this.ingredients = ingredients;
    }
}

activity_cocktail_display.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: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=".CocktailDisplayActivity" >

<ImageView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/cocktailImage"
    android:layout_alignParentTop="true"
    android:layout_centerInParent="true"
    android:layout_centerHorizontal="true"
    android:maxHeight="80dp"
    android:maxWidth="80dp"
    android:minHeight="10dp"
    android:minWidth="10dp" />

<TextView
    android:id="@+id/cocktailName"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_below="@+id/cocktailImage"
    android:textStyle="bold"
    android:layout_centerInParent="true" />

</RelativeLayout>

CocktailDisplay.java

public class CocktailDisplay extends Activity {
    TextView cocktailName;
    ImageView cocktailImage;

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

    cocktailName = (TextView) findViewById(R.id.cocktailName);
    cocktailImage = (ImageView) findViewById(R.id.cocktailImage);

    // get the intent from which this activity is called.
    Intent intent = getIntent();

   // ***** Trying to access model data here...not happy *****
    DrinkRecipeModel recipe = *not sure how to call*;


    // fetch value from key-value pair and make it visible on TextView.
    String item = intent.getStringExtra("selected-item");
    cocktailName.setText(item);


    // fetch value from key-value pair and make it visible on ImageView.
    // ***** Trying to access thumbnail here...not happy *****
    cocktailImage.setImageResource(recipe.getDrinkId());

}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.menu_cocktail_display, menu);
    return true;
}

}

2 个答案:

答案 0 :(得分:0)

一个选项可能是让您的自定义类实现Serializable接口,然后您可以使用Intent#putExtra()方法的putExtra(Serializable ..)变体在intent中传递对象实例。try this link

答案 1 :(得分:0)

使用这个精彩的网站= http://www.parcelabler.com/

在那里,粘贴你的'模型类'代码,在输出中你会得到这样的东西 -

import com.google.gson.annotations.SerializedName;
import java.util.ArrayList;

public class DrinkRecipeModel implements Parcelable {
@SerializedName("idDrink")
private int drinkId;

@SerializedName("strDrink")
private String drinkName;

@SerializedName("categories")
private String drinkCategories;

@SerializedName("strDrinkThumb")
private String drinkThumb;

@SerializedName("ingredients")
private ArrayList<String> ingredients;

public int getDrinkId() {
    return drinkId;
}

public String getDrinkName(){
    return drinkName;
}

public String getDrinkCategories(){
    return drinkCategories;
}

public String getDrinkThumb(){
    return drinkThumb;
}

public ArrayList<String> getIngredients() { return ingredients; }


public void setDrinkId(int drinkId) { this.drinkId = drinkId; }

public void setDrinkName(String drinkName) { this.drinkName = drinkName; }

public void setDrinkCategories(String drinkCategories) {
    this.drinkCategories = drinkCategories;
}

public void setDrinkThumb(String drinkThumb) {
    this.drinkThumb = drinkThumb;
}

public void setIngredients(ArrayList<String> ingredients) {
    this.ingredients = ingredients;
}

protected DrinkRecipeModel(Parcel in) {
    drinkId = in.readInt();
    drinkName = in.readString();
    drinkCategories = in.readString();
    drinkThumb = in.readString();
    if (in.readByte() == 0x01) {
        ingredients = new ArrayList<String>();
        in.readList(ingredients, String.class.getClassLoader());
    } else {
        ingredients = null;
    }
}

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

@Override
public void writeToParcel(Parcel dest, int flags) {
    dest.writeInt(drinkId);
    dest.writeString(drinkName);
    dest.writeString(drinkCategories);
    dest.writeString(drinkThumb);
    if (ingredients == null) {
        dest.writeByte((byte) (0x00));
    } else {
        dest.writeByte((byte) (0x01));
        dest.writeList(ingredients);
    }
}

@SuppressWarnings("unused")
public static final Parcelable.Creator<DrinkRecipeModel> CREATOR = new Parcelable.Creator<DrinkRecipeModel>() {
    @Override
    public DrinkRecipeModel createFromParcel(Parcel in) {
        return new DrinkRecipeModel(in);
    }

    @Override
    public DrinkRecipeModel[] newArray(int size) {
        return new DrinkRecipeModel[size];
    }
};

现在用上面的代码替换你的模型类'代码,你的模型类不是'parcelable'。 因此,您现在可以使用 -

myIntent.putExtra("receipe_item", drinkReceipeOBjectWhichIsParcelableNow);

您可以在下一个活动中重新开始展示。