I have researched this but nothing matches what i am looking for. I have a list of typesofrecipes, if I click on one of the categories (appetizers), it takes me into another list: a list view that contains a list of appetizers. If I click on one of these items in the list, it should take me to an activity that has an image, a title, cook time below title and the recipe itself below the image and textviews.
Edit to show code to query parse:
ParseQuery<ParseObject> query = new ParseQuery<ParseObject>("Appetizers");
query.addAscendingOrder("appetizer");
query.findInBackground(new FindCallback<ParseObject>() {
@Override
public void done(List<ParseObject> recipes, ParseException e) {
if (e == null) {
// success
} else {
// error
}
How would I do this?
List of Appetizers:
Activity:
Edits:
AppetizerAdapter:
public class AppetizerAdapter extends ArrayAdapter {
protected Context myContext;
protected List myAppetizer;
public AppetizerAdapter(Context context, List myappetizer) {
super(context, R.layout.custom_appetizer, myappetizer);
myContext = context;
myAppetizer = myappetizer;
}
// inflates each row of the app
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
// initialize viewholder
ViewHolder holder;
if (convertView == null) { // If no items in the view to be displayed
convertView = LayoutInflater.from(myContext).inflate(
R.layout.custom_appetizer, null);
// initialize the views
holder = new ViewHolder(); // creates a new view
holder.appetizerTextView = (TextView) convertView // calls the view
.findViewById(R.id.appetizer);
holder.appetizerImageView = (ImageView) convertView.findViewById(R.id.appetizerImage);
holder.cookTimeTextView = (TextView) convertView.findViewById(R.id.cookTime);
// call the view and setTag to the parameter (holder)
convertView.setTag(holder);
} else { // if view is previously displayed
// initialize holder
holder = (ViewHolder) convertView.getTag();
}
// get the position of the row
ParseObject appObject = (ParseObject) myAppetizer.get(position);
// Title and Cook Time
String app = appObject.getString("appetizer"); // column passing
holder.appetizerTextView.setText(app);
String cook = appObject.getString("cookTime");
holder.cookTimeTextView.setText(cook);
// image
Picasso.with(getContext()).load(appObject.getParseFile("imageFiles").getUrl())
.into(holder.appetizerImageView);
return convertView; // return the view
}
public static class ViewHolder {
// declaration of variables
TextView appetizerTextView;
TextView cookTimeTextView;
ImageView appetizerImageView;
}
}
Appetizer.java
public class Appetizer extends ListActivity {
protected List<ParseObject> mAppetizers;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_appetizer);
ParseAnalytics.trackAppOpenedInBackground(getIntent());
ParseQuery<ParseObject> query = new ParseQuery<ParseObject>("Appetizers");
query.addAscendingOrder("appetizer");
query.findInBackground(new FindCallback<ParseObject>() {
@Override
public void done(List<ParseObject> appetizer, ParseException e) {
if (e == null) {
// success
mAppetizers = appetizer;
AppetizerAdapter adapter = new AppetizerAdapter(getListView().getContext(),
mAppetizers);
setListAdapter(adapter);
} else {
// there is a problem
AlertDialog.Builder builder = new AlertDialog.Builder(Appetizer.this);
builder.setMessage(e.getMessage());
builder.setTitle("Sorry");
builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// close the dialog
dialog.dismiss();
}
});
AlertDialog dialog = builder.create();
dialog.show();
}
}
});
}
@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_directory, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
// click on a row item
@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
super.onListItemClick(l, v, position, id);
Intent intent = new Intent(Appetizer.this, AppetizerRecipe.class);
startActivity(intent);
}
}
I have a layout called content_appetizer_recipe that contains the layout in the pic with the image, and 3 textviews (not a list). The AppetizerRecipe is an AppCompatActivity.
Assuming you have a Recipe
class and some ArrayAdapter<Recipe>
implementation, you should be able to loop over that list of values that Parse returns to you and use the appropriate methods to pull values out of the ParseObject
.
The ArrayAdapter is responsible for displaying the correct data in the TextViews and ImageViews.
ListView lv = (ListView) findViewById(R.id.listView); // TODO
List<Recipe> recipeList = new ArrayList<Recipe>();
final RecipeAdapter adapter = new RecipeAdapter(RecipeActivity.this, recipeList);
lv.setAdapter(adapter);
ParseQuery<ParseObject> query = new ParseQuery<ParseObject>("Appetizers");
query.addAscendingOrder("appetizer");
query.findInBackground(new FindCallback<ParseObject>() {
@Override
public void done(List<ParseObject> recipes, ParseException e) {
if (e == null) {
for (ParseObject po : recipes) {
Recipe r = new Recipe();
// TODO: Retrieve fields from the ParseObject
r.setName(po.get...);
r.setTime(po.get...);
r.setImageUrl(po.get...);
adapter.add(r);
}
} else {
// error
}
});
If you don't have this Recipe
class, then just load List<ParseObject>
into the Adapter like you have done, then in the onListItemClick
method, you can obtain a specific object from that list using the position
parameter.
Here, you'll also need a field for public static final String ARG_NAME = "name";
in AppetizerRecipe.java
to keep your arguments consistent. You may refer to Passing data between Activities for more information on this. You'll additionally need to get data from the Intent inside of AppetizerRecipe.java
.
@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
super.onListItemClick(l, v, position, id);
ParseObject po = mAppetizers.get(position);
String name = po.getString("appetizer");
// TODO: Get more fields from Parse
Intent intent = new Intent(Appetizer.this, AppetizerRecipe.class);
intent.putExtra(AppetizerRecipe.ARG_NAME, name);
// TODO: Put more extras
startActivity(intent); // TODO: In other activity, get these extras
}