ArrayAdapter getView():我在ListView中看到的与链接到适配器的数据下的内容不匹配



我有一个问题,不允许我在ListView中的一行显示一个图标,只有当一行的一个数据匹配来自另一个源的参数时。在我的示例中,我将强制此参数为静态。

我有这段代码,基本上工作得很好:

public class CustomListViewAdapter extends ArrayAdapter<User> {
Context context;
List<User> items;
public CustomListViewAdapter(Context context, int resourceId, List<User> items) {
    super(context, resourceId, items);
    this.context = context;
    this.items = items;
}
public int getCount() {
    return this.items.size();
}
/* private view holder class */
private class ViewHolder {
    ImageView rubrPhoto;
    TextView rubrNick;
    TextView rubrEmail;
    ImageView provaImg;
}
public View getView(int position, View convertView, ViewGroup parent) {
    Log.d("CustomListViewAdapter", "position = "+position);
    ViewHolder holder = null;
    User user = getItem(position);
    LayoutInflater mInflater = (LayoutInflater) context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
    if (convertView == null) {
        convertView = mInflater.inflate(R.layout.rubrica_list_view, null);
        holder = new ViewHolder();
        holder.rubrPhoto = (ImageView) convertView.findViewById(R.id.rubrPhoto);
        holder.rubrNick = (TextView) convertView.findViewById(R.id.rubrNick);
        holder.rubrEmail = (TextView) convertView.findViewById(R.id.rubrEmail);
        holder.provaImg = (ImageView) convertView.findViewById(R.id.rubrNewMess);
        //extra logic
        String email = user.getEmail();
        Log.d("CustomListViewAdapter", "FIRST TIME CREATED---> "+email);
        if(email.equals("giada@email.com")){
            Log.d("CustomListViewAdapter", "##############IN THE IF ... ");
            holder.provaImg.setVisibility(View.VISIBLE);
        }
        //end
        convertView.setTag(holder);
    } else {
        holder = (ViewHolder) convertView.getTag();
        //extra logic
        Log.d("CustomListViewAdapter", "CACHED---> email user ---->"+user.getEmail());
        CharSequence email = user.getEmail();
        if(email.equals("giada@email.com")){
            Log.d("CustomListViewAdapter", "IN THE IF.. ");
            holder.provaImg.setVisibility(View.VISIBLE);
        }
    //end
    }
    holder.rubrPhoto.setImageResource(user.getPhoto());
    holder.rubrNick.setText(user.getNick());
    holder.rubrEmail.setText(user.getEmail());
    holder.provaImg.setImageResource(user.getNewMess());
    return convertView;
}

最初所有的holder。我可以通过XML布局将VISIBILITY设置为go。然而,适配器的缓存机制似乎不能很好地工作,至少从我必须做的来看。

的代码
User user = getItem (position);

String email = user.getEmail ();

是正确的,与我所看到的一致。最初只显示正确的图标,但是当我开始滚动一些东西时,崩溃和getView将图标的可见性设置在错误的行中,好像缓存机制与逻辑不同。

最后getView()设置电子邮件不匹配行中图标的可见性。

也许我已经接近解决办法了,但是一个帮助绝对会拯救我的生命。非常感谢。

您设置的证明 ImageView的可见性不正确。应该是这样的:

if (convertView == null) {
//...
    convertView.setTag(holder);
}else{
    holder = (ViewHolder) convertView.getTag();
}
holder.rubrPhoto.setImageResource(user.getPhoto());
holder.rubrNick.setText(user.getNick());
holder.rubrEmail.setText(user.getEmail());
holder.provaImg.setImageResource(user.getNewMess());
CharSequence email = user.getEmail();
// if the email is the right one, show the ImageView
if(email.equals("giada@email.com")){
    Log.d("CustomListViewAdapter", "##############IN THE IF ... ");
    holder.provaImg.setVisibility(View.VISIBLE);
} else {
    // hide the ImageView so we don't end up with row problems
    // as the convertView could be non-null and the row from where that convertView
    // is coming could have the ImageView set to visible we need to make sure
    // we revert the row to the correct state
    holder.provaImg.setVisibility(View.INVISIBLE); // or GONE
}

相关内容

最新更新