布尔变量在 getView() 中不可用

boolean variable unavailable in getView()

我从来没有完全理解 getView() 方法。这是一个案例:

这里我有 isNoticeRead 你可以看到这是假的。但是这条线被执行了!而当执行 if 语句中的行时,isNoticeRead 找不到任何地方!如果我什至将光标放在它上面,什么也不会发生(没有工具提示)。它发生在 ListView 的第一个 item 中。你能告诉我我错过了什么吗?

我满Adapter

public class NoticesListViewAdapter extends BaseAdapter{

    Context context;
    ArrayList<NoticeModel> items;
    String[] readNotices;

    public NoticesListViewAdapter(Context context, ArrayList<NoticeModel> items) {
        this.context                                    = context;
        this.items                                      = items;
        readNotices                                     = SharedPrefUtils.getMarkedNotices(context).split(SharedPrefUtils.SEPARATOR_READ_NOTICE);
    }

    @Override
    public int getCount() {
        return items.size();
    }

    @Override
    public Object getItem(int position) {
        return items.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        Holder holder;
        if(convertView == null){
            convertView                                 = LayoutInflater.from(context).inflate(R.layout.list_item_notices, null);
            holder                                      = new Holder();
            holder.noticeID                             = (TextView) convertView.findViewById(R.id.noticeID);
            holder.tvNotice                             = (TextView) convertView.findViewById(R.id.tvNotice);
            holder.tvDateTime                           = (TextView) convertView.findViewById(R.id.tvDateTime);
            holder.tvNoticeRead                         = (TextView) convertView.findViewById(R.id.tvNoticeRead);
            convertView.setTag(holder);
        }else{
            holder                                      = (Holder) convertView.getTag();
        }
        try {
            String str = items.get(position).getId() + "";
            holder.noticeID.setText(str);
            holder.tvNotice.setText(items.get(position).getText());
            holder.tvDateTime.setText(DateTimeUtils.changeDateTimeFormat(items.get(position).getDateTime(), DateTimeUtils.FORMAT8, DateTimeUtils.FORMAT3));

            final boolean isNoticeRead = items.get(position).isRead();
            if (isNoticeRead) {
                holder.tvNoticeRead.setVisibility(View.VISIBLE);
            }

        //        for(String s : readNotices) {
        //            if (s.equals(str)) {
        //                holder.tvNoticeRead.setVisibility(View.VISIBLE);
        ////                break;
        //            }
        //        }
        }catch (Exception e){e.printStackTrace();}

        return convertView;
    }

    class Holder{
        TextView tvNotice, tvDateTime, noticeID, tvNoticeRead;
    }
}

列表正在重复使用您持有人的观点。因此,您可能有一个用 VISIBLE 初始化的实例,但是当视图被重用和填充时,您不会重置它的状态 - 所以它仍然可见。

if (isNoticeRead) {
    holder.tvNoticeRead.setVisibility(View.VISIBLE);
} else {
    holder.tvNoticeRead.setVisibility(View.INVISIBLE);
}

当您将变量设置为 final 时,这意味着无法在执行期间分配值,因为您将其设置为 final 移除 final 或将 isNoticeRead 定义为字段。 那么它可能适合你..