2012-03-25 4 views
2

以下は私のListViewアダプタです。リストアイテムのデータを埋め込むFillData関数があることがわかります。私はそれが常に呼び出されることがわかります。リストとListAdapterは1項目につき1回記入してはいけませんか?私は間違って何をしていますか?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

getView()方法はListViewが表示画面に表示する(なぜならアップとダウンリストをスクロールするユーザの)新しいビューが必要になりますたびに呼び出されます。

最後の要素までリストをスクロールすると、アダプタ内のすべての項目に対してメソッドが呼び出されます。ユーザーが再びスクロールアップを開始すると、getView()メソッドもユーザーと同じ数の要素に対して再度呼び出されますスクロールします(また、fillメソッドも毎回呼び出されます)。

+0

なぜ:line = holder =(ViewHolder)convertView.getTag();決して呼ばれない? – user1136875

+0

@ user1136875リストがビューをリサイクルするので、その行を呼び出す必要があります。あなたはそれが呼ばれていないことをどのくらい正確に見ていますか? 'convertView.setTag(holder);'は、 'convertView'を展開した後にif節に置かなければなりません(nullの場合)。 – Luksprog

+0

ありがとうございました。それを見つけた – user1136875

1

フレームワークは、標準のリストアダプターを使用すると、(メモリーとCPUのサイクルを節約するために)画面を埋めるのに十分なだけです。カスタムのものを作成し、同じことをしているビューホルダーを使用しています。

複数の画面に表示されないリストを作成した場合、期待しているアクティビティ(またはそのlac)が表示されると思います。 (これで、あなたFillRecipeDataToHolder()

関連する問題