Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

ArrayAdapter number of elements in data set is zero

I'm trying to build a list with a customized view for the rows, each row will consist of an image view and two text views.

in order to do so i extended the ArrayAdapter class (called PostersArrayAdapter) and overridden the getView() method in order to make the right connection between the data and the row layout.

However, when i try to construct a PostersArrayAdapter with an array of PosterData class (my implementation) with some data the result is that the adapter is empty, means getCount() returns zero and the listView is empty.

can anyone suggest what am i doing wrong? i'm relying on a code that i found here - http://www.vogella.de/articles/AndroidListView/article.html

Thank you very much!

here is the relevant code: (PosterData class is just a class with two string fields)

public class PostersListActivity extends ListActivity {
final private int NUM_OF_PICS = 2;
private ContentGetter   cg;
private PosterData[]    posters;
private ListView        listView;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    cg = new ContentGetter(NUM_OF_PICS);
    try 
    {
        posters = cg.parseIndexFile();
        int res = cg.DownloadPosterPics(1);

    } 
    catch (ClientProtocolException e) 
    {
        e.printStackTrace();
    } 
    catch (IOException e) 
    {
        e.printStackTrace();
    }

    // Use our own list adapter
    listView = (ListView)findViewById(android.R.id.list);
    //listView.setAdapter((ListAdapter) new ArrayAdapter<String>(this,R.layout.list_item,R.id.title,titles));
    PostersArrayAdapter postersAdapter = new PostersArrayAdapter(this, posters);
    Log.d("PostersListActivity.onCreate()","Number of elementes in the data set of the adapter is " + postersAdapter.getCount());
    listView.setAdapter(postersAdapter);
}


public class PostersArrayAdapter extends ArrayAdapter<PosterData> {
    private final Activity context;
    private final PosterData[] posters;

    public PostersArrayAdapter(Activity context, PosterData[] posters) {
        super(context, R.layout.list_item);
        this.context = context;
        this.posters = posters;
    }

    // static to save the reference to the outer class and to avoid access to
    // any members of the containing class
    class ViewHolder {
        public ImageView logo;
        public TextView  title;
        public TextView  names;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        // ViewHolder will buffer the assess to the individual fields of the row
        // layout

        ViewHolder holder;
        // Recycle existing view if passed as parameter
        // This will save memory and time on Android
        // This only works if the base layout for all classes are the same
        View rowView = convertView;
        if (rowView == null) 
        {
            LayoutInflater inflater = context.getLayoutInflater();
            rowView = inflater.inflate(R.layout.list_item, null, true);
            holder = new ViewHolder();
            holder.title = (TextView) rowView.findViewById(R.id.title);
            holder.names = (TextView) rowView.findViewById(R.id.names);
            holder.logo = (ImageView) rowView.findViewById(R.id.logo);
            rowView.setTag(holder);
        } 
        else 
        {
            holder = (ViewHolder) rowView.getTag();
        }

        holder.title.setText(posters[position].getTitle());
        holder.names.setText(posters[position].getNames());
        holder.logo.setImageResource(R.drawable.icon);

        return rowView;
    }
}   
}

Here is the list view layout i'm using:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">
    <TextView android:id="@+id/textView1" 
        android:textAppearance="?android:attr/textAppearanceLarge" 
        android:layout_height="wrap_content" 
        android:layout_width="wrap_content" 
        android:text="@string/selectPoster" 
        android:layout_gravity="center_horizontal">
    </TextView>
    <ListView android:id="@android:id/list" 
        android:layout_height="wrap_content"  
        android:layout_width="match_parent">
    </ListView>
</LinearLayout>

And here is the list element layout i'm using:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content" android:layout_height="wrap_content">

    <LinearLayout android:id="@+id/linearLayout1"
        android:layout_height="match_parent" 
        android:layout_width="wrap_content" >

        <ImageView android:id="@+id/logo" 
            android:src="@drawable/icon" 
            android:layout_height="wrap_content"            
            android:layout_width="22px"
            android:layout_marginTop="4px" 
            android:layout_marginRight="4px"
            android:layout_marginLeft="4px">
        </ImageView>

        <LinearLayout android:id="@+id/linearLayout2" 
            android:layout_height="match_parent" 
            android:layout_width="fill_parent" 
            android:orientation="vertical">
            <TextView android:id="@+id/title"
                android:text="TextView" 
                android:layout_width="wrap_content"
                android:layout_height="wrap_content" 
                android:textSize="30px">
            </TextView>
            <TextView android:id="@+id/names"  
                android:text="TextView"             
                android:layout_width="wrap_content" 
                android:layout_height="wrap_content">
            </TextView>             
        </LinearLayout>

    </LinearLayout>
</LinearLayout>
like image 673
Hagay Myr Avatar asked Sep 20 '11 10:09

Hagay Myr


1 Answers

Make sure getCount() is properly implemented so :

     @Override
     public int getCount(){
           return posters!=null ? posters.length : 0;
     }

EDIT: by calling the

   ArrayAdapter(Context context, int textViewResourceId)

constructor you are not passing your array of objects to the constructor.

You should be calling the

   ArrayAdapter(Context context, int textViewResourceId, T[] objects)

constructor which also takes as parameter the array of objects.

like image 147
Ovidiu Latcu Avatar answered Nov 10 '22 01:11

Ovidiu Latcu