androidparse-platformparse-server

Retrieving data from a listview and displaying it in a textview/imageview


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.


Solution

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