2

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:

list of category items

Activity:

activity to hold objects from parse.com

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

}

Appetizer class .. Parse

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.

Hope this helps to resolve my issue.

LizG
  • 2,246
  • 1
  • 23
  • 38
  • Please [edit] your question to show some code where you are querying Parse. – OneCricketeer Jun 14 '16 at 01:01
  • Alright, thanks for editing, now about about a [mcve]? You should have a `ListView` and maybe an `ArrayAdapter`? – OneCricketeer Jun 14 '16 at 01:29
  • Yes, for every listactivity, i have an adapter extending an ArrayAdapter. – LizG Jun 14 '16 at 01:31
  • Okay, great. Then have you tried replacing that `//success` code with a for loop over that `List` to populate that adapter or the data list that it holds? – OneCricketeer Jun 14 '16 at 01:33
  • I thought about using an adapter the same way i did for the listActivities but where i am not putting it into a list, didn't seem viable. Can you give me an example of what you mean? I am an android noobie sorry – LizG Jun 14 '16 at 01:38
  • I am still stuck on this problem, can anyone offer any assistance? I've tried everything that has been recommended but nothing has worked yet. I've even tried a ViewAnimator and that didn't even work. I'm lost! – LizG Jun 15 '16 at 19:06
  • My answer below works. All you need to do is fill in the code you have. I would have updated my answer if you read about creating a [mcve]. Things that need to be added are your ArrayAdapter class, the Java object that is displays and the schema of your Parse "Appetizers" table. – OneCricketeer Jun 15 '16 at 19:15
  • ok sorry @cricket_007. I will do that. I do appreciate your help – LizG Jun 15 '16 at 19:17

1 Answers1

3

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
}
Community
  • 1
  • 1
OneCricketeer
  • 179,855
  • 19
  • 132
  • 245
  • all of this goes in my "AppCompatActivity" class? – LizG Jun 14 '16 at 02:05
  • 1
    Could go in onCreate, yes. You'll need to fix the code that obviously won't work. Such as replacing (or implementing) the getListView method – OneCricketeer Jun 14 '16 at 02:07
  • What was your question? How to use `findViewById`? – OneCricketeer Jun 14 '16 at 02:08
  • getListView method – LizG Jun 14 '16 at 02:10
  • 1
    I put the comment of TODO next to it for a reason. It's not a method of AppCompatActivity, so you are welcome to write it yourself, or remove it and replace it with `findViewById` for the listview in the XML – OneCricketeer Jun 14 '16 at 02:13
  • I put what you recommended in my onListItemClick() in my ListActivity class (Appetizer) but .. when i try and put in r.setName ... i get red code – LizG Jun 14 '16 at 03:31
  • 1
    Not trying to be difficult, but like I said, you'll obviously need to replace the code with what you actually have implemented. There is no `get...` method of a ParseObject. And I don't have any idea if you have a Recipe class or not, put if you did, I would hope there's some setter methods on it. I understand if you are new to Android and/or Parse, but these are general Java concepts we are talking about. – OneCricketeer Jun 14 '16 at 03:59
  • No, i understand that. – LizG Jun 14 '16 at 04:01
  • 1
    Alright, sorry. Then what exactly is red? And I'm not sure the on list item click is the best place for any of this code because this is supposed to populate the list before you even click on anything – OneCricketeer Jun 14 '16 at 04:03
  • where is the best place to put this code? onCreate? in the AppCompatActivity or somewhere else? – LizG Jun 14 '16 at 04:08
  • 1
    For a beginner I would recommend onCreate, yes. I like to structure my code differently, but what I answered with is designed to start at onCreate – OneCricketeer Jun 14 '16 at 04:11
  • Let us [continue this discussion in chat](http://chat.stackoverflow.com/rooms/114789/discussion-between-lizg-and-cricket-007). – LizG Jun 15 '16 at 21:35