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

时间:2016-05-02 08:13:07

标签: android baseadapter

我完全不了解isNoticeRead方法。这是一个案例:

enter image description here

我知道isNoticeRead这是假的。但这条线被执行了!当if语句中的行正在执行时,在任何地方都找不到item!如果我把光标放在它上面,没有任何反应(没有工具提示)。它发生在ListView的第一个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; } }

{{1}}

2 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:0)

当你做变量final时,它意味着在执行期间无法赋值,因为你最后删除final或者将isNoticeRead定义为field。 那么它可能对你有用..