天道酬勤,学无止境

How do I add/remove items to a ListView in virtual mode?

If I'm using a ListView in virtual mode then, as I understand it, the list view only keeps track of a small number of items in the list. As the user scrolls it dynamically retrieves items it needs to show from the virtual list.

But what if an item is added or removed from the master list? If an item is added/removed outside of the range of indexes being shown by the list view then I would assume the list view would show the added/missing items when the user scrolls to that index. Is this correct? But what if an item is added/removed from the range of indexes the user is currently viewing? How do I trigger the list view to refresh the items it is currently viewing to show the new/missing items?

FYI: I'm using an ObjectListView if that makes any difference.

评论

A virtual list knows nothing about your list of items. It doesn't keep track of them, not even a small set. It only ever asks "what do you want to show at the n'th row?"

If your master list changes, all you need to do is redraw the list. Invalidate() will do that for you. The listview will then ask you again what it should show at every row visible in the control.

If you are using ObjectListView, have you considered using the FastObjectListView which gives you the speed benefits of a virtual list and the ease of use of a normal ObjectListView?

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • How do I populate a ListView in virtual mode asynchronously?
    I'd like to display records from our database in a listview - but retrieves can take a long time. I can use RetrieveVirtualItem to tell me when a new ListViewItem is needed, add a dummy item, and start a retrieve; but what do I do with the record when the database returns it? I can't update the ListView's Items collection while the ListView is in VirtualMode. Is there a way to tell the ListView to reload an item? Or can I just keep a reference to the ListViewItem and populate that? If neither of those would work, how else could I populate a ListView in virtual mode asynchronously?
  • 获取ListView可见项(Get ListView Visible items)
    问题 我有一个ListView ,其中可能包含很多项目,因此它已virtualized并回收了项目。 它不使用排序。 我需要刷新一些值显示,但是当项目太多时,更新所有内容太慢了,因此我只想刷新可见的项目。 如何获得所有当前显示项目的列表? 我试图查看ListView或ScrollViewer ,但是我仍然不知道如何实现这一点。 解决方案不能遍历所有项目以测试它们是否可见,因为这太慢了。 我不确定代码或xaml是否有用,它只是将ItemSource绑定到Array的Virtualized / Recycling ListView 。 编辑:答案: 感谢akjoshi,我找到了方法: 获取ListView的ScrollViewer (使用FindDescendant方法,您可以使用VisualTreeHelper自己做)。 读取其ScrollViewer.VerticalOffset :它是显示的第一项的编号读取其ScrollViewer.ViewportHeight :它是显示的项目数。 Rq: CanContentScroll必须为true。 回答1 看看MSDN上的这个问题,它展示了一种找出可见的ListView项的技术- 如何在ListView中找到实际可见的行(ListViewItem(s))? 这是该帖子中的相关代码- listView.ItemsSource = from
  • How to speed adding items to a ListView?
    i'm adding a few thousand (e.g. 53,709) items to a WinForms ListView. Attempt 1: 13,870 ms foreach (Object o in list) { ListViewItem item = new ListViewItem(); RefreshListViewItem(item, o); listView.Items.Add(item); } This runs very badly. The obvious first fix is to call BeginUpdate/EndUpdate. Attempt 2: 3,106 ms listView.BeginUpdate(); foreach (Object o in list) { ListViewItem item = new ListViewItem(); RefreshListViewItem(item, o); listView.Items.Add(item); } listView.EndUpdate(); This is better, but still an order of magnitude too slow. Let's separate creation of ListViewItems from adding
  • WPF ListView与项目的水平排列?(WPF ListView with horizontal arrangement of items?)
    问题 我想以类似于列表模式下WinForms ListView的方式在ListView中布置项目。 也就是说,在ListView中不仅在垂直方向而且在水平方向上布置项目的位置。 我不介意这些项目的布局是这样的: 1 4 7 2 5 8 3 6 9 或像这样: 1 2 3 4 5 6 7 8 9 只要垂直和水平显示它们,以最大程度地利用可用空间。 我能找到的最接近的是这个问题: 如何使WPF ListView项目像水平滚动条一样水平重复? 仅将项目水平放置。 回答1 听起来您正在寻找的是WrapPannel,它将水平放置项目直到没有更多空间,然后移至下一行,如下所示: (MSDN) 替代文字http://i.msdn.microsoft.com/Cc295081.b1c415fb-9a32-4a18-aa0b-308fca994ac9(zh-cn,Expression.10).png 您还可以使用UniformGrid,它可以将项目按一定数量的行或列进行布局。 我们使用ListView,ListBox或任何形式的ItemsControl中的其他面板来使项目排列的方式是通过更改ItemsPanel属性。 通过设置ItemsPanel,可以从ItemsControls使用的默认StackPanel进行更改。 使用WrapPanel,我们还应该设置宽度,如下所示。 <ListView>
  • 使用ItemsSource时操作无效。 改为使用ItemsControl.ItemsSource访问和修改元素(Operation is not valid while ItemsSource is in use. Access and modify elements with ItemsControl.ItemsSource instead)
    问题 我是Binding和WPF的新手,最近我学习了如何使用Binding技术创建具有多列的listBox <ListView ItemsSource="{Binding Items}" Margin="306,70,22,17" MouseDoubleClick="listBoxSS_MouseDoubleClick" Name="listBoxSS" > <ListView.View> <GridView> <GridView.Columns> <GridViewColumn Header="first_name " Width="100" DisplayMemberBinding="{Binding Path=First_name}" /> <GridViewColumn Header="last_name" Width="100" DisplayMemberBinding="{Binding Path=Last_name}" /> <GridViewColumn Header="phone_number" Width="100" DisplayMemberBinding="{Binding Path=Phones[0]}" /> <GridViewColumn Header="notes" Width="100" DisplayMemberBinding="{Binding
  • How to implement navigation drawer with fragments master detail
    i have get the sample navigation drawer from this site : http://www.androidhive.info/2013/11/android-sliding-menu-using-navigation-drawer/ and the master detail from here : http://wptrafficanalyzer.in/blog/itemclick-handler-for-listfragment-in-android/ the error LogCat oncreateview(inflac....) the view can not be created me i have try that //the main activiry as Activity: package in.wptrafficanalyzer.listfragmentitemclick; import in.wptrafficanalyzer.listfragmentitemclick.adapter.NavDrawerListAdapter; import in.wptrafficanalyzer.listfragmentitemclick.model.NavDrawerItem; import java.util
  • How do I get the start index and number of visible items in a ListView?
    I have a listview working in virtual mode, in the LargeIcons view. Retrieves are expensive, so I want to ask for the data for all the visible items. How do I get the start index and total number of the visible items? Update: I am aware of the CacheVirtualItems event. The third-party database we're using takes ~3s to retrieve a single record, but ~4s to retrieve a thousand records, so I have to do them in large blocks. I need to make sure the visible records are among those we retrieve, so I need to know the start index and total number of the visible items. If that's not feasible, I'll have to
  • Virtual Listview for ASP.net?
    Is there a virtual listview for ASP.net? Most tables (and grids, listview, data tables, data grids, grid views, list grids) i find for asp.net expect the user to page through data. i want a listview that contains, for example, 10,000 items; and i don't want 10 pages. The problem of a long list was solved in 1994 using a listview in "virtual" mode. The control need only be given the number of items to show. The control information about those items as required (i.e. as the user scrolls them into view, or tries to sort on a column). Has anyone created a virtual listview (presumably using
  • 如何在PreferenceFragment中管理分隔符?(How to manage dividers in a PreferenceFragment?)
    问题 我开始在PreferenceFragment处理首PreferenceFragment 。 这是我所拥有的: 我试图: 摆脱项目之间的分隔线。 我想这可以从样式中定义,但是我不知道怎么做。 我尝试在运行时通过调用findViewById(android.R.id.list)获取首选项ListView ,因为我在某处阅读,但是它返回null。 在标头顶部设置新的全角分隔线,如此处所示。 例如,在这种情况下,我希望在“ Statistiche”上方的全宽度分隔符,但在列表顶部的“ Generali”上方不想要。 我想到的唯一方法是将分隔线设置为伪首选项,例如: <Preference android:layout="@layout/divider" //here I set width and a divider resource /> <PreferenceCategory ... /> 这里的主要问题是我的PreferenceFragment (或它所在的ActionBarActivity )具有一些左/右填充,这使我添加到preferences.xml中的任何分隔符都无法覆盖整个宽度。 所以我的问题是: 如何摆脱您可以在图像中看到的默认项目分隔符? 如何在标题上方设置全角分隔符,或者如何摆脱内部片段/活动填充? 当然,我的活动布局没有任何(明确的)填充。 回答1
  • 如何在片段之间传递数据(How to pass data between fragments)
    问题 我试图在程序中的两个片段之间传递数据。 它只是存储在列表中的简单字符串。 该列表在片段A中公开,当用户单击列表项时,我需要它显示在片段B中。内容提供者似乎仅支持ID,因此将无法使用。 有什么建议? 回答1 您为什么不使用Bundle。 从您的第一个片段开始,下面是如何设置它: Fragment fragment = new Fragment(); Bundle bundle = new Bundle(); bundle.putInt(key, value); fragment.setArguments(bundle); 然后在第二个片段中,使用以下方法检索数据: Bundle bundle = this.getArguments(); int myInt = bundle.getInt(key, defaultValue); Bundle为许多数据类型提供了放置方法。 请参阅http://developer.android.com/reference/android/os/Bundle.html 回答2 如果使用Roboguice,则可以使用Roboguice中的EventManager传递数据,而无需使用Activity作为界面。 这是非常干净的IMO。 如果您不使用Roboguice,也可以将Otto用作事件总线:http://square.github.com/otto
  • Extended selection mode, virtualization and IsSelected binding
    It seems in extended selection mode IsSelected binding is buggy. Looks like only last item from selection which become out of scope is handled properly. Demonstration: Items 0, 1, 2 and 98, 97, 96 are selected with Control. When selecting 94 (without Control!) selection counter should be 1, but you see 3 instead. Scrolling up reveals what only one (last) item of selection out of scope was unselected. Below is mcve: xaml: <ListBox ItemsSource="{Binding Items}" SelectionMode="Extended" SelectionChanged="ListBox_SelectionChanged"> <ListBox.ItemTemplate> <DataTemplate> <TextBlock Text="{Binding
  • 在WinForms中将按钮添加到Listview中(Adding button into a Listview in WinForms)
    问题 有没有一种方法可以将按钮控件添加到WinForms应用程序中ListView内部的单元格中? 回答1 这是可以重用的类ListViewExtender的代码。 它不是ListView的派生类,基本上,您只是声明特定列显示为按钮而不是文本。 按钮的文本是子项的文本。 它允许没有问题的大型列表视图,不使用p / invoke,并且还可以与水平滚动条一起使用(此处提出的一些答案的代码在很多项目中没有或相当慢)。 注意,它要求扩展ListView的FullRowSelect设置为true ,视图类型设置为Details 。 这是使用它的示例代码: namespace WindowsFormsApplication1 { public partial class Form1 : Form { public Form1() { InitializeComponent(); // you need to add a listView named listView1 with the designer listView1.FullRowSelect = true; ListViewExtender extender = new ListViewExtender(listView1); // extend 2nd column ListViewButtonColumn buttonAction
  • How to add/remove item from listview in android when click button in item listview
    I'm a newbie android.I have some problem about my mini app. You can see figure below: http://i481.photobucket.com/albums/rr175/viethungit/android.png Firstly,row 1(layout 1) appear listview when click button add in row 1, row 2(layout 2) appear, and continue...click button add in row 1 ,layout 2 appear in listview.... I try search from Mr.Google but i don't find... Anybody could help me! This is layout, and activity I don't know how to implement add_item.xml <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http:/
  • 将WPF Listview滚动到特定行(Scroll WPF Listview to specific line)
    问题 WPF,类似Browser的应用。 我得到了一个包含ListView的页面。 调用PageFunction之后,我向ListView添加了一行,并希望将新行滚动到视图中: ListViewItem item = ItemContainerGenerator.ContainerFromIndex(index) as ListViewItem; if (item != null) ScrollIntoView(item); 这行得通。 只要能看到新行,该行就会获得应有的关注。 问题是,当该行不可见时,事情就不起作用了。 如果该行不可见,则不会为该行生成ListViewItem,因此ItemContainerGenerator.ContainerFromIndex返回null。 但是,如果没有该项,如何将线滚动到视图中? 有什么方法可以滚动到最后一行(或任何地方)而不需要ListViewItem? 回答1 我认为这里的问题是,如果该行不可见,则尚未创建ListViewItem。 WPF创建按需显示。 因此,在这种情况下,您可能会获得该商品的null ,对吗? (根据您的评论,您可以) 我在MSDN论坛上找到了一个链接,该链接建议直接访问Scrollviewer以进行滚动。 在我看来,这里提供的解决方案非常像黑客,但是您可以自己决定。 这是上面链接中的代码片段:
  • 单击项目列表视图中的按钮时如何在android中的列表视图中添加/删除项目(How to add/remove item from listview in android when click button in item listview)
    问题 我是新手android.mini应用程序有一些问题。 您可以看到下图:http://i481.photobucket.com/albums/rr175/viethungit/android.png 首先,当在行1中添加单击按钮时,行1(布局1)出现在列表视图中,然后在行2(布局2)中出现单击按钮,然后继续...单击行1中的按钮添加,在列表视图中出现布局2...。我尝试搜索来自Google先生,但我找不到...任何人都可以帮助我! 这是布局,我不知道如何执行活动 add_item.xml <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="fill_parent" android:layout_height="wrap_content" android:background="#EEEEEE" android:orientation="horizontal" android:padding="5dip"> <!-- Image Item--> <ImageButton
  • 如何在标准WPF ListView中启用UI虚拟化(How to enable UI virtualization in Standard WPF ListView)
    问题 我正在使用.NET 4.5 / VS2012,并且我有一个ListView看起来像这样 <ListView VirtualizingPanel.IsContainerVirtualizable="True" VirtualizingPanel.IsVirtualizing="True" VirtualizingPanel.IsVirtualizingWhenGrouping="True" Grid.Row="1" Name="eventLogList" Margin="5,0,5,0" BorderBrush="Black" BorderThickness="2" ItemsSource="{Binding EventLogs}" SelectedItem="{Binding SelectedEventLog}" local:ListViewSorter.CustomListViewSorter="EventLogViewer.UI.EventLogItemComparer" SelectionMode="Single"> <ListView.GroupStyle> <GroupStyle HidesIfEmpty="False"> <GroupStyle.ContainerStyle> <Style TargetType="GroupItem"> <Setter
  • Windows 10 ScrollIntoView()不会滚动到列表视图中间的项目(Windows 10 ScrollIntoView() is not scrolling to the items in the middle of a listview)
    问题 我有一个包含20个项目的Listview。 我想以编程方式滚动Listview。 ListView?.ScrollIntoView(ListView.Items[0]) 将列表视图滚动到第一项。 ListView?.ScrollIntoView(ListView.Items.Count - 1) 将列表视图滚动到页面底部。 但是,我无法使用相同的功能将列表视图滚动到中间的项目。 Eg: ListView?.ScrollIntoView(ListView.Items[5]) 应该滚动并带我到列表的第5项。 但相反,它却将我带到了列表的第一项。 如果可以通过某种解决方法来实现此行为,那会很好吗? 回答1 我认为您正在寻找的是一种将元素实际滚动到ListView顶部的方法。 在本文中,我创建了一个扩展方法,该方法可滚动到ScrollViewer的特定元素。 在您的情况下,想法是相同的。 您首先需要在ListView找到ScrollViewer实例,然后是要滚动到的实际项,即ListViewItem 。 这是获取ScrollViewer的扩展方法。 public static ScrollViewer GetScrollViewer(this DependencyObject element) { if (element is ScrollViewer) { return
  • 将ListView choiceMode从singleChoice更改为multipleChoiceModal(Change ListView choiceMode from singleChoice to multipleChoiceModal)
    问题 我有一个ListView,通常是singleChoice choiceMode 。 当用户长按一个项目时,我想进入一种动作模式,该模式允许选择多个项目,以便他们可以对任何选定的项目执行操作。 我能够配置ListView ,使其处于singleChoice模式,并且用户能够选择列表项以在其旁边显示详细信息片段,并使列表项本身处于激活状态。 我还能够配置ListView ,使其处于multipleChoiceModal choiceMode并在项目上长按可启动操作模式并允许多个选择,但现在ListView在正常模式下将不允许单个选择(无操作)模式)。 我如何才能拥有处于singleChoice模式的ListView,然后在长按某个项目时将其转换为multipleChoiceModal模式? 这是我能想到的最接近的: 将ListView设置为singleChoice模式设置ListView的OnItemLongClickListener并在该侦听器中: 将ListView的OnItemLongClickListener设置为null 将ListView的choiceMode设置为multipleChoiceModal 在长按的项目上调用view.performClick() 。 这种方法有两个问题。 直到我第二次长按一个项目时,动作模式才开始。 当我调用getListView()
  • Android基础面试常常吊死在这几个问题上,1个、2个、3个、4个、5个、6个、7个、8个、9个、10个......
    Android面试常常吊死的问题 文章目录 Android面试常常吊死的问题1、面试官:Context它是什么,有什么用?2、面试官:什么是Armv7?3、面试官:为什么字节码不能在Android中运行?4、面试官:Gradle中的BuildType是什么?你一般用它来干什么?5、面试官:简述一下Android的构建过程!6、面试官:说一下Activity的生命周期!7、面试官:既然提到了Activity生命周期,说一下 OnCreate() 和 OnStart() 的区别!8、面试官:为什么要在Activity类的onCreate() 中执行setContentView()?9、面试官:说一下Android的几种启动模式吧!他们分别是干什么的?10、面试官:当旋转屏幕时,Activity如何响应?11、面试官:你是如何做到旋转屏幕时防止数据重新加载和重置的?12、面试官:说一下AsyncTasks和线程他们的区别!13、面试官:AsyncTask和Activity的生命周期两者有什么关系?这会导致什么问题?如何避免这些问题?14、面试官:Serializable和Parcelable之间有什么区别?15、面试官:什么是(ANR)错误,如何防止它在应用程序中发生?16、面试官:SharedPreferences中的commit() 和apply() 有什么区别?17、面试官
  • 如何清除ListView选择?(How do I clear ListView selection?)
    问题 TL; DR:您从(a)我的列表视图中选择一个选项。 然后,您改变主意并在(b)我的编辑文本中输入内容。 如何清除列表视图选择,仅显示编辑文本? (反之亦然) 我有一个带有选项列表视图的应用程序以及一个用于创建自己的选项的edittext。 我需要用户选择或创建一个选项,但不能同时选择两者。 这是我的布局图: 每当用户从列表视图中选择一个选项时,我都会通过将其设置为绿色来将其设置为“选定”,如下所示: <?xml version="1.0" encoding="utf-8" ?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_selected="true" android:drawable="@color/colorPrimary"/> <item android:state_selected="false" android:drawable="@color/windowBackground" /> </selector> (这被设置为我的列表视图的背景) 问题:如果用户决定键入自己的选项,因为他们只能有一个选项,我想取消选择listview选项。