2012-03-25 7 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

getView() (그리고 그것으로 당신의 FillRecipeDataToHolder()) 메소드가 가시 화면에 표시 할 때마다 ListView가 (때문에 위아래로 스크롤 목록 사용자의) 새로운 뷰를 필요로 호출됩니다.

사용자가 마지막 요소까지 목록을 스크롤하면 어댑터의 모든 항목에 대해 메소드가 호출되고 사용자가 다시 위로 스크롤하기 시작하면 getView() 메소드가 사용자와 동일한 수의 요소에 대해 다시 호출됩니다 스크롤 (그리고 당신의 fill 메소드는 매번 호출 될 것입니다).

+0

왜 line : holder = (ViewHolder) convertView.getTag(); 결코 부르지 않니? – user1136875

+0

@ user1136875 목록에서보기를 재활용하기 때문에 해당 줄을 호출해야합니다. 얼마나 정확하게 그것이 불리지 않는다는 것을 알 수 있습니까? 또한 convertView.setTag (holder);는'convertView'를 부 풀린 후에 if 절에 위치해야합니다 (null 인 경우). – Luksprog

+0

고마워. 그것을 발견 – user1136875

1

프레임 워크는 표준 목록 어댑터를 사용할 때 (메모리 및 CPU주기를 절약하기 위해) 화면을 채우기에 충분합니다. 사용자 정의를 작성했으며 동일한 것을 수행하는보기 소유자를 사용하고 있습니다.

두 개 이상의 화면을 채우지 않는 목록을 만들면 기대하는 활동 (또는 그 lac)을 볼 수 있다고 생각합니다.

관련 문제