void CTableView::reloadData() { #if USING_LUA CCAssert( (m_nDataSourceAdapterScriptHandler != 0) || (m_pDataSourceAdapterListener && m_pDataSourceAdapterHandler), "reloadData"); #else CCAssert(m_pDataSourceAdapterListener && m_pDataSourceAdapterHandler, "reloadData"); #endif CCAssert((int)m_tCellsSize.width != 0 && (int)m_tCellsSize.height != 0, "reloadData"); CCAssert(m_eDirection != eScrollViewDirectionBoth, "reloadData"); vector<CTableViewCell*>::iterator itr = m_vCellsUsed.begin(); vector<CTableViewCell*>::iterator end = m_vCellsUsed.end(); for(; itr != end; ++itr ) { CTableViewCell* pCell = (*itr); m_vCellsFreed.pushBack(pCell); m_pContainer->removeChild(pCell, true); pCell->reset(); } m_vCellsUsed.clear(); m_sIndices.clear(); m_vPositions.clear(); this->updatePositions(); this->setContentOffsetToTop(); this->onScrolling(); relocateContainer(); }
void CTableView::onScrolling() { if( m_uCellsCount == 0 ) return; unsigned uBeginIdx = 0, uEndIdx = 0; uBeginIdx = cellBeginIndexFromOffset( getContentOffset() ); uEndIdx = cellEndIndexFromOffset( getContentOffset() ); #if 0 CCLOG("cell begin %u end %u", uBeginIdx, uEndIdx); #endif while( !m_vCellsUsed.empty() ) { CTableViewCell* pCell = m_vCellsUsed.front(); unsigned int uIdx = pCell->getIdx(); if( uIdx < uBeginIdx ) { m_sIndices.erase(uIdx); m_vCellsUsed.erase(m_vCellsUsed.begin()); m_vCellsFreed.pushBack(pCell); pCell->reset(); m_pContainer->removeChild(pCell, true); } else { break; } } while( !m_vCellsUsed.empty() ) { CTableViewCell* pCell = m_vCellsUsed.back(); unsigned int uIdx = pCell->getIdx(); if( uIdx > uEndIdx && uIdx < m_uCellsCount ) { m_sIndices.erase(uIdx); m_vCellsUsed.popBack(); m_vCellsFreed.pushBack(pCell); pCell->reset(); m_pContainer->removeChild(pCell, true); } else { break; } } for( unsigned int idx = uBeginIdx; idx <= uEndIdx && idx < m_uCellsCount; ++idx ) { if( m_sIndices.find(idx) != m_sIndices.end() ) { continue; } updateCellAtIndex(idx); } }