行の 1 つのデータが別のソースからのパラメーターと一致する場合にのみ、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.provaImg で、XML レイアウトによって VISIBILITY が GONE に設定されています。ただし、少なくとも私がしなければならないことからすると、アダプターのキャッシュメカニズムがうまく機能していないようです。
コード
User user = getItem (position);
と
String email = user.getEmail ();
正しく、私が見ているものと一致しています。最初は正しいアイコンのみが表示されますが、何かをスクロールし始めると getView が間違った行にアイコンの可視性を設定します。これは、キャッシング メカニズムがロジックとは異なる動作をするかのようです。
最後にgetView()は、メールが一致しない行のアイコンの可視性を設定します。
多分私は解決策に近づいていますが、助けは間違いなく私の命を救うでしょう. どうもありがとうございました。