简体   繁体   中英

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:

类别项目清单

Activity:

用来保存来自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);
}

}

开胃菜类..解析

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.

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
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM