以下は私の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;
}
}
なぜ:line = holder =(ViewHolder)convertView.getTag();決して呼ばれない? – user1136875
@ user1136875リストがビューをリサイクルするので、その行を呼び出す必要があります。あなたはそれが呼ばれていないことをどのくらい正確に見ていますか? 'convertView.setTag(holder);'は、 'convertView'を展開した後にif節に置かなければなりません(nullの場合)。 – Luksprog
ありがとうございました。それを見つけた – user1136875