我有一个问题,不允许我在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
}