2014-03-19 133 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時纔會設置數據,並且由於此視圖將被回收,因此最終將獲得與之前設置相同的信息。