2011-09-20 6 views
5

Estoy tratando de crear una lista con una vista personalizada para las filas, cada fila consistirá en una vista de imagen y dos vistas de texto.El número de elementos ArrayAdapter en el conjunto de datos es cero

para hacerlo amplié la clase ArrayAdapter (llamada PostersArrayAdapter) y anulé el método getView() para establecer la conexión correcta entre los datos y el diseño de la fila.

Sin embargo, cuando intento construir un ArsenalAdaptador de Posters con una matriz de clase PosterData (mi implementación) con algunos datos el resultado es que el adaptador está vacío, significa que getCount() devuelve cero y listView está vacío.

¿alguien puede sugerir qué estoy haciendo mal? estoy confiando en un código que encontré aquí - http://www.vogella.de/articles/AndroidListView/article.html

¡Muchas gracias!

Este es el código correspondiente: (clase PosterData es sólo una clase de campos de dos cuerdas)

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

Este es el diagrama de vista de lista que estoy usando:

<?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> 

Y aquí está el diseño de lista de elementos que estoy usando:

<?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> 

Respuesta

13

Asegúrese getCount() se aplica correctamente por lo que:

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

EDIT: llamando al constructor

ArrayAdapter(Context context, int textViewResourceId) 

no está pasando su gama de objetos para el constructor.

usted debería ser una llamada al constructor

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

que también toma como parámetro de la matriz de objetos.

+0

Bueno, ahora devuelve el número correcto. Mejor aún, ahora la lista aparece correctamente (antes de que la lista estuviera vacía). ¿Por qué anular el método getCount solucionó esto? –

+0

Creo que es porque no está llamando al super constructor correcto –

+0

¿Llamar a la correcta evitará la necesidad de anular getCount? ¿Por qué crees que no estoy llamando a la correcta? ¿Qué principio te llevó a esta conclusión? –

Cuestiones relacionadas