数据量大时,ListView更新更快的方法

转载 2004年11月03日 13:53:00
 采用常规方法处理ListView,在数据量大时无论是还是用了BeginUpdata和EndUpdata()还是处理WM_EraseBkgnd信息都不会得到理想的效果,那答案是什么呢?
嗯,采用所谓Virtual ListView。
说起来很神秘,其实点通了很简单。
在于把ListView->OwnerData设为true,然后直接设置
ListView->Items->Count为数据总数,实际的数据可以保在任意其它速度较快且可直接索引的容器里(如STL中的 vector),然后关键是在OnData事件中写入代码通过Item->Index从容器中(如vector)取出数据,然后用
Item->Caption = ???;
Item->SubItems->Add(???);
Item->SubItems->Add(???);
来动态的写入数据到ListView用于UI显示,如此Virtual ListView即完成.
一个完整的简单例子如下:
/*Unit1.h*/
//---------------------------------------------------------------------------

#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <forms.hpp>
#include <ComCtrls.hpp>
#include <vector>
using namespace std;
//---------------------------------------------------------------------------
struct ListViewData
{
AnsiString Caption;
AnsiString SubItems1;
AnsiString SubItems2;
AnsiString SubItems3;
};
class Tform1 : public Tform
{
__published:// IDE-managed Components
TListView *ListView1;
void __fastcall ListView1Data(TObject *Sender, TListItem *Item);
private:// User declarations
vector<ListViewData*> m_lvDataVector;
public:// User declarations
__fastcall Tform1(TComponent* Owner);
__fastcall ~Tform1();
};
//---------------------------------------------------------------------------
extern PACKAGE Tform1 *form1;
//---------------------------------------------------------------------------
#endif

/*unit1.cpp*/
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
Tform1 *form1;
//---------------------------------------------------------------------------
__fastcall Tform1::Tform1(TComponent* Owner)
: Tform(Owner)
{
ListView1->OwnerData = true;
const int iListViewCount = 5000;
ListView1->Items->Count = iListViewCount;
for(int i = 0; i < iListViewCount; ++i) {
ListViewData *plvData = new ListViewData;
plvData->Caption = "Caption" + AnsiString(i);
plvData->SubItems1 = "SubItems1" + AnsiString(i);
plvData->SubItems2 = "SubItems2" + AnsiString(i);
plvData->SubItems3 = "SubItems3" + AnsiString(i);
m_lvDataVector.push_back(plvData);
}
}

__fastcall Tform1::~Tform1()
{
int iCount = ListView1->Items->Count;
for(int i = 0; i < iCount; ++i) {
ListViewData *plvData = m_lvDataVector[i];
delete plvData;
}
}
//---------------------------------------------------------------------------

void __fastcall Tform1::ListView1Data(TObject *Sender, TListItem *Item)
{
ListViewData *plvData = m_lvDataVector[Item->Index];
Item->Caption = plvData->Caption;
Item->SubItems->Add(plvData->SubItems1);
Item->SubItems->Add(plvData->SubItems2);
Item->SubItems->Add(plvData->SubItems3);
}
//---------------------------------------------------------------------------


btw,cker指点:
我现在觉得tlistview 和 tTreeView比较烂。
最近正在熟悉一个号称最好的Tree和list控件,非常的棒。开放源码,
www.delphi-gems.com的virtual trees
同样是使用所谓的Virtual技术....,这个控件是我接触BCB和Delphi以来见过的最好的控件。

android中的ListView数据量大时如何提高效率。。。。

 http://blog.csdn.net/oldmtn/article/details/8804715
  • brucexu1978
  • brucexu1978
  • 2016年05月09日 12:01
  • 316

Android listview 列表更新数据+重写adapter

①在布局文件中添加listview控件(lishishujv.xml):
  • zhengyikuangge
  • zhengyikuangge
  • 2015年12月10日 08:46
  • 1402

ListView中notifyDataSetChanged()刷新数据不更新原因分析

情景分析:在开发过程中,我们经常会使用notifyDataSetChanged()实时的让ListView进行刷新操作,但是有的时候却会发现ListView不再刷新了,有的时候却又可以自动刷新。原因分...
  • u011771755
  • u011771755
  • 2015年05月12日 23:02
  • 2423

ListView嵌套ListView优化

在做业务时候,一个ListView显示多种数据类型,我们想到的方法是ListView在嵌套一个ListView,对于子ListView 占父ListView的一行,就解决了问题,但是这样的逻辑是不...
  • tsdfk1455
  • tsdfk1455
  • 2014年05月07日 21:43
  • 1822

Android开发中ListView数据更新显示的解决方法

在使用ListView时 经常会遇到更新listview中的数据 并显示出来 再此介绍两个方法来解决这个问题: 1、在对listView进行适配的时候 使用simpleAdapter()的方法适配  ...
  • kokodudu
  • kokodudu
  • 2013年07月23日 21:35
  • 24795

关于android的listview数据列表显示的下拉和刷新报错问题

最近在做安卓,listview的数据刷新和下拉这里出现问题。刷新那边比较好做,就是下拉的时候一直自动加载第二页数据,即一直加载第二页数据...
  • u010271452
  • u010271452
  • 2014年07月10日 13:26
  • 546

Android多线程中使用Handler更新ListView控件数据

在Android应用开发中,免不了涉及耗时的操作,比如网络数据更新等。如果直接在主线程中完成,不给出适当的提示信息,则长时间的等待会给用户一个错觉:程序死了!所以,针对耗时的操作,使用多线程操作结合P...
  • frdde
  • frdde
  • 2012年03月15日 22:46
  • 4536

ListView中的局部刷新

在列表中显示多个下载进度条是一个很常见的需求了, 这个需求主要涉及到以下两个技术点: 1.Handler异步更新UI 2.ListView进行局部更新今天来看一下这一功能最简单的实现——模仿多个...
  • ucxiii
  • ucxiii
  • 2016年08月31日 19:33
  • 1266

百度收录更快的方法

使百度收录更快的方法   做 seo没有一个人不关心百度收录的数量,因为百度的收录速度是百度权重的一个重要的参考标准,而且百度对内容的原创性有着非常严格的审核标准,所以一般被百度收录多的,也能代表这...
  • yunwang2014
  • yunwang2014
  • 2011年12月30日 13:38
  • 87

<转>ListView导出到Excel的方法

ListView导出到Excel的方法 public static void ExpToExcel(ListView listviewname)   {    if (listviewnam...
  • u010013272
  • u010013272
  • 2014年09月18日 10:50
  • 419
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:数据量大时,ListView更新更快的方法
举报原因:
原因补充:

(最多只允许输入30个字)