2

行の 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()は、メールが一致しない行のアイコンの可視性を設定します。

多分私は解決策に近づいていますが、助けは間違いなく私の命を救うでしょう. どうもありがとうございました。

4

1 に答える 1

2

provaImg の可視性を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
}
于 2013-01-03T18:18:30.623 に答える