2016-05-02 6 views
0

Я никогда не понимаю метод getView() полностью. Вот случай:Логическая переменная недоступна в getView()

enter image description here

Здесь я isNoticeRead, который является ложным вы можете увидеть. Но линия выполняется! И когда строка в операторе if выполняется, isNoticeRead нигде не встречается! Если я даже наложу на него курсор, ничего не произойдет (нет подсказки). И это происходит для первого itemListView. Не могли бы вы рассказать мне, что мне не хватает?

Мой полный 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; 
    } 
} 

ответ

3

Взгляды вашего держателя в настоящее время повторного использования в Перечне. Таким образом, у вас может быть экземпляр, который инициализируется VISIBLE, но когда представление повторно используется и заполняется, вы не сбрасываете его состояние, поэтому оно все еще видимо.

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

это правильно. попробуйте этот @CoolBrain. –

0

когда вы сделаете окончательной переменным, то это означает, что не может приписанное значение во время выполнения, так как вы сделаете это окончательным удалить окончательным или определить isNoticeRead в поле. , тогда это может быть хорошо работает для вас.

Смежные вопросы