Javacadabra
Javacadabra

Reputation: 5758

Issue displaying data using custom array adapter

I am trying to create a basic List view application. I had it working fine with the default system array adapter. I then tried to modify it to allow me to use a custom adapter. Unfortunately I have run into a problem.

When I run the application I get no runtime errors, rather I just get a black screen where the list should be displayed which makes me think that perhaps it is displaying a list but for some reason the adapter is not finding the data....

Anyways, Below is my List activity:

    package com.example.waitronproto2;

    import java.util.ArrayList;
    import java.util.List;

    import android.app.ListActivity;
    import android.os.Bundle;
    import android.view.View;
    import android.widget.ArrayAdapter;
    import android.widget.ListView;
    import android.widget.Toast;

    public class AppetizersActivity extends ListActivity{

            //Instance Variables
            //Array to hold menu appetizers - In future this will be pulled from web server
            private List<MenuItem> appetizers;
            private MenuItemArrayAdapter appetizersAdapter;


            @Override
            public void onCreate(Bundle savedInstanceState){
                super.onCreate(savedInstanceState);
                //Garbage collection
                System.gc();
                setContentView(R.layout.appetizers_list);

                fillList();

                //Create custom array adapter - links list with source of data, an array.
                appetizersAdapter = new MenuItemArrayAdapter(this, appetizers);


                //Set the newly created adapter as the lists adapter.
                this.setListAdapter(appetizersAdapter); 
            }

            @Override
            protected void onListItemClick(ListView l, View v, int position, long id){
                //Toast for testing
                Toast.makeText(this.getApplicationContext(), l.getItemAtPosition(position) + " Clicked!", Toast.LENGTH_LONG).show();        

                //store clicked item in String variable
                String choice = l.getItemAtPosition(position).toString();

                //add to an array that is being passed from Activity to Activity
            }

            //fill the list with  menu items
            private void fillList(){
                appetizers = new ArrayList<MenuItem>();
                appetizers.add(new MenuItem("Appetizer 1", "Appetizer", 8.95));
                appetizers.add(new MenuItem("Appetizer 2", "Appetizer", 9.95));
                appetizers.add(new MenuItem("Appetizer 3", "Appetizer", 12.95));
                appetizers.add(new MenuItem("Appetizer 4", "Appetizer", 4.95));
                appetizers.add(new MenuItem("Appetizer 5", "Appetizer", 5.95));
                appetizers.add(new MenuItem("Appetizer 6", "Appetizer", 7.95));
                appetizers.add(new MenuItem("Appetizer 7", "Appetizer", 5.95));
                appetizers.add(new MenuItem("Appetizer 8", "Appetizer", 12.95));
                appetizers.add(new MenuItem("Appetizer 9", "Appetizer", 10.95));


            }
    }

and here is my adapter class:

    package com.example.waitronproto2;

import java.util.List;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.TextView;

//Default array adapter for menu items
public class MenuItemArrayAdapter extends ArrayAdapter<MenuItem> {

    private List<MenuItem> menuItems;

    //Constructor
    public MenuItemArrayAdapter(Context context, List<MenuItem> menuItems) {
        super(context, R.layout.menuitem_row);
        this.menuItems = menuItems;
    }

    //get views
    public View getView(final int position, View convertView, ViewGroup parent){
        View v = convertView;


        if(v == null){
            LayoutInflater vi = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            v = vi.inflate(R.layout.menuitem_row, null);
        }

        //assign values to view
        MenuItem item = this.menuItems.get(position);

        TextView nameView = (TextView) v.findViewById(R.id.item_name);
        TextView priceView = (TextView) v.findViewById(R.id.item_price);


        nameView.setText(item.getName());
        priceView.setText(String.valueOf(item.getPrice()));

        return v;

    }

}

Any ideas where I might be going wrong?

Many thanks!

Upvotes: 0

Views: 739

Answers (1)

Sam
Sam

Reputation: 86948

By extending ArrayAdapter but using a local list in your custom adapter, you muddled things up a bit. ArrayAdapter doesn't know the list has any data because its getCount() references an empty list.

Use this super constructor instead:

//Constructor
public MenuItemArrayAdapter(Context context, List<MenuItem> menuItems) {
    super(context, R.layout.menuitem_row, menuItems);
    //  Pass the ArrayAdapter your list   ^^^^^^^^^
}

And don't keep menuItems yourself or you code will become overly complicated over time. You'll need to use getItem(position) where you currently use this.menuItems.get(position).


Alternatively you can override getCount(), getItem(), and getItemId() to point to your menuItems list. But if you do this, you might as well extend BaseAdapter directly since you have taken away must of the benefits of ArrayAdapter.

Upvotes: 1

Related Questions