ArrayAdapter The number of elements in the dataset is zero.

I am trying to create a list with a custom view for strings, each line will consist of an image view and two text views.

to do this, I extended the ArrayAdapter class (called PostersArrayAdapter) and redefined the getView () method to make the connection between the data and the row layout correct.

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

can anyone suggest what i am doing wrong? I rely on the code I found here - http://www.vogella.de/articles/AndroidListView/article.html

Many thanks!

here is the relevant code: (The 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 layout I am 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 layout of the list item that I am 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>
+5
source share
1 answer

Make sure it getCount()is implemented correctly like this:

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

EDIT: causing

   ArrayAdapter(Context context, int textViewResourceId)

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

You have to call

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

which also takes an array of objects as a parameter.

+13
source

All Articles