2014-03-19 44 views
0

这里是我的getView()方法:自定义的ListView重演

public View getView(final int pos, View convertView, ViewGroup parent) { 
     final ViewHolder holder; 
     int rowType = getItemViewType(pos); 

     if (convertView == null) { 

      switch (rowType) { 


      case 1: 

       convertView = mInflater.inflate(
         R.layout.single_class_select_row_header, parent, false); 
       holder = new ViewHolder(); 

       holder.label = (TextView) convertView 
         .findViewById(R.id.tvSingleClassSelectHeader); 
       convertView.setTag(holder); 
       break; 
      case 2: 

       final int newPos = getRealPosition(pos); 
       convertView = mInflater.inflate(
         R.layout.single_class_select_row, parent, false); 
       holder = new ViewHolder(); 

       holder.checkBox = (CheckBox) convertView 
         .findViewById(R.id.chkSession); 
       holder.mainLayout = (LinearLayout) convertView 
         .findViewById(R.id.llSingleClassLayout); 

       holder.phase = (TextView) convertView.findViewById(R.id.phase); 
       holder.class_info = (TextView) convertView 
         .findViewById(R.id.class_info); 
       holder.phase.setText(getListObject(pos).phase); 
       holder.class_info.setText(getListObject(pos).info); 
       convertView.setTag(holder); 

       holder.checkBox.setOnClickListener(new OnClickListener() { 

        @Override 
        public void onClick(View v) { 
          // edit out 
         } 
        } 
       }); 

       holder.mainLayout.setOnClickListener(new OnClickListener() { 

        @Override 
        public void onClick(View v) { 
              // edit out 
             } 
        } 
       }); 

       holder.phase.setOnClickListener(new OnClickListener() { 

        @Override 
        public void onClick(View v) { 
                // edit out 
         } 
        } 
       }); 


       break; 
      } 

     } else { 
      holder = (ViewHolder) convertView.getTag(); 
     } 



     return convertView; 
    } 

任何人都可以看到,为什么?我看过其他的例子,但是因为我因为列表中间的标题而忽略了getItemViewType(),所以没有任何例子符合我的情况,因为我以不同的方式做事。

看来,我应该把setOnClickListner的的if-block下方,但我有问题,我holder变量,而它的其他情况下需要的是final未初始化。

+1

你需要设置''if'块的外部**'来测试'convertView',否则只有在该视图为空时才会设置数据(并继续仅将该数据作为视图被回收)。 – Luksprog

+0

@Luksprog就是这样。我只是为了让所有'持有者'变量都开心而改变事情。我现在就明白了。你想回收UI视图,而不是数据! (如果你愿意,你可以标记为答案) – KickingLettuce

回答

2

您需要设置外if块,你测试convertView为是null的数据(文本或什么其它的信息块,你有)。否则,只有在convertViewnull时才会设置数据,并且由于此视图将被回收,因此最终将获得与之前设置相同的信息。