다음은 내 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;
}
}
왜 line : holder = (ViewHolder) convertView.getTag(); 결코 부르지 않니? – user1136875
@ user1136875 목록에서보기를 재활용하기 때문에 해당 줄을 호출해야합니다. 얼마나 정확하게 그것이 불리지 않는다는 것을 알 수 있습니까? 또한 convertView.setTag (holder);는'convertView'를 부 풀린 후에 if 절에 위치해야합니다 (null 인 경우). – Luksprog
고마워. 그것을 발견 – user1136875