2012-03-25 95 views
2

以下所有的時間是我ListView適配器。你可以看到它有一個FillData功能列表項目填充數據。我發現它總是被稱爲。如若不在名單和每個項目的ListAdapter補一次?我究竟做錯了什麼?的ListView填充物品的適配器

public class GlobalRecipeListAdapter extends ArrayAdapter<Recipe> { 

    private final static String mTAG = "GlobalRecipeListAdapter"; 

    private LayoutInflater mInflater = null; 
    private int mListViewItemResId = -1; 
    private ImageLoader mImageLoader = new ImageLoader(CookTales.Instance()); 

    public GlobalRecipeListAdapter(Context context, int resId, ArrayList<Recipe> items) { 
     super(context, resId, items); 
     mListViewItemResId = resId; 
     mInflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     ViewHolder holder = new ViewHolder(); 

     if (convertView == null) { 
      convertView = mInflater.inflate(mListViewItemResId, null); 
      holder.recipePic = new DisplayableImageView((ImageView) convertView.findViewById(R.id.list_RecipeImageViewId)); 
      holder.name = (TextView) convertView.findViewById(R.id.name_entry); 
      holder.author = (TextView) convertView.findViewById(R.id.username_entry); 
      holder.likes = (TextView) convertView.findViewById(R.id.likes_entry); 
      holder.diffculty = (ImageView) convertView.findViewById(R.id.list_DifficultyImageViewId); 
      holder.preparationTime = (ImageView) convertView.findViewById(R.id.list_TimeImageViewId); 
      holder.recipePic.GetImageView().setOnClickListener(new ImageClickListener(getContext(), holder.recipePic)); 
       holder.name.setTypeface(CookTales.Fonts.ARIAL); 
      holder.name.setTextSize( CookTales.Fonts.RUNNING_TEXT_SIZE); 
      holder.author.setTypeface( CookTales.Fonts.ARIAL); 
      holder.author.setTextSize( CookTales.Fonts.RUNNING_TEXT_SIZE); 
      holder.likes.setTypeface( CookTales.Fonts.ARIAL); 
      holder.likes.setTextSize( CookTales.Fonts.RUNNING_TEXT_SIZE); 
     } else { 
      holder = (ViewHolder) convertView.getTag(); 
     } 

     if(super.getItem(position) != null) { 
      if(position == 0 && position == getCount() - 1) { 
       convertView.setBackgroundResource(R.drawable.list_single);    } else if(position == 0) { 
       convertView.setBackgroundResource(R.drawable.list_up); 
      } 
      else if(position == getCount() - 1) { 
       convertView.setBackgroundResource(R.drawable.list_down); 
      } else { 
       convertView.setBackgroundResource(R.drawable.list_middle);    } 

      FillRecipeDataToHolder(position, holder); 
      convertView.setTag(holder); 
     } else { 
      holder = (ViewHolder)convertView.getTag(); 
     }  
     return convertView; 
    } 

    protected void FillRecipeDataToHolder(int position, ViewHolder viewHolder) { 
     viewHolder.name.setText(getItem(position).GetName()); 
     viewHolder.author.setText(getItem(position).GetAuthor()); 
     viewHolder.likes.setText(getItem(position).GetNumOfLikes() + " likes."); 

     viewHolder.diffculty.setImageResource(Convertor.Difficulty2ImageResId(getItem(position).GetDifficulty(), mTAG)); 
     viewHolder.preparationTime.setImageResource(Convertor.Time2ImageResId(getItem(position).GetPreparationTime())); 

     if(getItem(position).GetRecipePicture().isValid()){ 
      viewHolder.recipePic.GetImageView().setImageResource(Convertor.Category2ImageView(getItem(position).GetCategory(), mTAG)); 
      mImageLoader.DisplayImage( getItem(position).GetRecipePicture().GetImageLocation(), 
             getItem(position).GetRecipePicture().isUploaded() == false, 
             getContext(), 
             viewHolder.recipePic); 
     } 
     else 
     { 
      viewHolder.recipePic.GetImageView().setImageResource(Convertor.Category2ImageView(getItem(position).GetCategory(), mTAG)); 
     } 
    } 

    static protected class ViewHolder { 
     DisplayableImageView recipePic; 
     TextView    name; 
     TextView    author; 
     TextView    likes; 
     ImageView    diffculty; 
     ImageView    preparationTime; 
    } 
} 

回答

1

每當ListView需要一個新的視圖(因爲用戶滾動上下列表)以在可見屏幕上顯示時,將調用getView()(和您的FillRecipeDataToHolder())方法。

如果該列表,直到最後一個元素的方法將被要求在適配器每一個項目,那麼如果用戶開始再次向上滾動,則getView()方法也將再次爲許多元素的用戶稱爲用戶滾動卷軸(並且每次都會調用您的填充方法)。

+0

但是爲什麼行:支架=(ViewHolder)convertView.getTag();從未被稱爲? – user1136875 2012-03-25 18:49:02

+0

@ user1136875該行應該叫,因爲列表將回收的意見。你究竟如何看待它不被稱爲?在'convertView'膨脹後(如果它爲null),'convertView.setTag(holder);'應該放在if子句中。 – Luksprog 2012-03-25 18:53:09

+0

非常感謝。找到了 – user1136875 2012-03-25 18:54:56

1

當您使用標準列表適配器時,框架只能建立足夠的空間來填充屏幕(以節省內存和CPU週期)。你已經構建了一個自定義的視圖,並且正在使用一個視圖持有者,它正在做同樣的事情。

如果您不填寫超過一個屏幕,我相信你會看到活動(或它們的LAC),你期待一個列表。