2011-09-20 1 views
5

Я пытаюсь создать список с индивидуальным представлением для строк, каждая строка будет состоять из представления изображения и двух текстовых представлений.ArrayAdapter число элементов в наборе данных равно нулю

, чтобы сделать это, я расширил класс ArrayAdapter (называемый PostersArrayAdapter) и переопределил метод getView(), чтобы сделать правильное соединение между данными и макетом строк.

Однако, когда я пытаюсь построить PostersArrayAdapter с массивом класса PosterData (моя реализация) с некоторыми данными, результатом является то, что адаптер пуст, означает, что getCount() возвращает ноль, а listView пуст.

Может ли кто-нибудь предложить, что я делаю неправильно? Я полагаюсь на код, который я нашел здесь - http://www.vogella.de/articles/AndroidListView/article.html

Большое спасибо!

здесь соответствующий код: (класс PosterData просто класс с два строковых полей)

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

Вот макет в виде списка, я использую:

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

И вот расположение элемента списка я использую:

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

ответ

13

Убедитесь getCount() правильно реализован так:

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

EDIT: вызывая конструктор

ArrayAdapter(Context context, int textViewResourceId) 

вы не проходящее ваш массив объектов конструктора.

Вы должны вызвать конструктор

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

который также принимает в качестве параметра массив объектов.

+0

Ну, теперь оно возвращает правильное число. Даже лучше, теперь список отображается правильно (до того, как список был пуст). Почему переопределение метода getCount разрешило это? –

+0

Я думаю, это потому, что вы не вызываете правый супер-конструктор –

+0

Вызов правильного будет предотвращать необходимость переопределения getCount? Почему вы думаете, что я не называю правильный? Какой принцип привел вас к такому выводу? –