我正在try 减少具有很多行的ColumnView小部件的加载时间.引用自 gtk list widget documentation:
虽然短列表为模型中的每个项目实例化小部件不是问题,但一旦列表增长到数千或数百万个元素,这就变得不太可行了.正因为如此,视图仅创建有限数量的列表标题项,并通过将它们绑定到新项来回收它们.总体而言,视图试图使列表标题保持可用only for the items that can actually be seen on screen.
然而,在我的代码示例中,虽然回收(绑定、解除绑定)工作正常;但设置了205个项;而只有几个项可见:
use gtk::*;
use gtk::prelude::*;
use gtk::gio::ListStore;
use gtk::glib::BoxedAnyObject;
fn main() {
let application = Application::builder().application_id("column.view.test").build();
application.connect_activate(|application| {
let list_store = ListStore::new(BoxedAnyObject::static_type());
for i in 0..10000 {
list_store.append(&BoxedAnyObject::new(i));
}
let column_view = ColumnView::builder().model(&NoSelection::new(Some(list_store))).build();
let scrolled_window = ScrolledWindow::builder().child(&column_view).build();
let item_factory = SignalListItemFactory::new();
item_factory.connect_setup(|_, item| {
let list_item = item.downcast_ref::<ListItem>().unwrap();
list_item.set_child(Some(&Label::new(None)));
println!("setup");
});
item_factory.connect_bind(|_, item| {
let list_item = item.downcast_ref::<ListItem>().unwrap();
list_item.child().and_downcast::<Label>().unwrap().set_label("a");
println!("bind");
});
item_factory.connect_unbind(|_, _| { println!("unbind"); });
item_factory.connect_teardown(|_, _| { println!("teardown"); });
column_view.append_column(&ColumnViewColumn::builder().factory(&item_factory).build());
ApplicationWindow::builder().application(application).child(&scrolled_window).build().present();
});
application.run();
}
如何只设置可见(或更多)的项目或硬编码量的项目,以减少小部件的加载时间?