OSDN Git Service

RefreshTimelineでListViewの更新を現在表示中のリストに対してのみ行う
authorKimura Youichi <kim.upsilon@bucyou.net>
Tue, 28 Jun 2016 12:40:06 +0000 (21:40 +0900)
committerKimura Youichi <kim.upsilon@bucyou.net>
Fri, 1 Jul 2016 17:56:11 +0000 (02:56 +0900)
RefreshTimeline メソッドによって ListView の更新を行う対象を _curList
のみに変更した。これにより、現在表示されていないバックグラウンドの
ListView のスクロール位置・選択状態および VirtualListSize は、
そのタブに切り替わるまでは更新されない (TabModel の状態と一致しない)
状態になる。

OpenTween/Tween.cs

index 326012f..f97089e 100644 (file)
@@ -259,6 +259,10 @@ namespace OpenTween
         private PostClass _curPost;
         private bool _isColumnChanged = false;
 
+        // 各タブの発言一覧のスクロール位置・選択状態を保持するフィールド
+        private IDictionary<string, ListViewScroll> listViewScroll = new Dictionary<string, ListViewScroll>();
+        private IDictionary<string, ListViewSelection> listViewSelection = new Dictionary<string, ListViewSelection>();
+
         private const int MAX_WORKER_THREADS = 20;
         private SemaphoreSlim workerSemaphore = new SemaphoreSlim(MAX_WORKER_THREADS);
         private CancellationTokenSource workerCts = new CancellationTokenSource();
@@ -1402,11 +1406,13 @@ namespace OpenTween
 
         private void RefreshTimeline()
         {
+            var curTabModel = this._statuses.Tabs[this._curTab.Text];
+
             // 現在表示中のタブのスクロール位置を退避
-            var curListScroll = this.SaveListViewScroll(this._curList, this._statuses.Tabs[this._curTab.Text]);
+            var curListScroll = this.SaveListViewScroll(this._curList, curTabModel);
 
-            // タブのリスト上の選択位置などを退避
-            var listSelections = this.SaveListViewSelection();
+            // 現在表示中のタブのリスト上の選択位置などを退避
+            var curListSelection = this.SaveListViewSelection(this._curList, curTabModel);
 
             //更新確定
             PostClass[] notifyPosts;
@@ -1418,34 +1424,12 @@ namespace OpenTween
 
             if (MyCommon._endingFlag) return;
 
-            //リストに反映&選択状態復元
             try
             {
                 foreach (TabPage tab in ListTab.TabPages)
                 {
-                    DetailsListView lst = (DetailsListView)tab.Tag;
                     TabModel tabInfo = _statuses.Tabs[tab.Text];
-                    if (isDelete || lst.VirtualListSize != tabInfo.AllCount)
-                    {
-                        using (ControlTransaction.Update(lst))
-                        {
-                            if (lst.Equals(_curList))
-                            {
-                                this.PurgeListViewItemCache();
-                            }
-                            try
-                            {
-                                lst.VirtualListSize = tabInfo.AllCount; //リスト件数更新
-                            }
-                            catch (Exception)
-                            {
-                                //アイコン描画不具合あり?
-                            }
 
-                            // 選択位置などを復元
-                            this.RestoreListViewSelection(lst, tabInfo, listSelections[tabInfo.TabName]);
-                        }
-                    }
                     if (tabInfo.UnreadCount > 0)
                         if (this._cfgCommon.TabIconDisp)
                             if (tab.ImageIndex == -1) tab.ImageIndex = 0; //タブアイコン
@@ -1458,8 +1442,24 @@ namespace OpenTween
                 //throw;
             }
 
-            // スクロール位置を復元
-            this.RestoreListViewScroll(this._curList, this._statuses.Tabs[this._curTab.Text], curListScroll);
+            // リストに反映&選択状態復元
+            if (this._curList.VirtualListSize != curTabModel.AllCount || isDelete)
+            {
+                using (ControlTransaction.Update(this._curList))
+                {
+                    this.PurgeListViewItemCache();
+
+                    // リスト件数更新
+                    this._curList.VirtualListSize = curTabModel.AllCount;
+
+                    // 選択位置などを復元
+                    this.RestoreListViewSelection(this._curList, curTabModel, curListSelection);
+                }
+
+                // スクロール位置の復元は Begin/EndUpdate の外で行う
+                // 参照: https://github.com/opentween/OpenTween/commit/7dbf6491
+                this.RestoreListViewScroll(this._curList, curTabModel, curListScroll);
+            }
 
             //新着通知
             NotifyNewPosts(notifyPosts, soundFile, addCount, newMentionOrDm);
@@ -9822,10 +9822,35 @@ namespace OpenTween
         {
             SetListProperty();
 
+            if (this._curList != null)
+            {
+                var beforeSelectedList = this._curList;
+                var beforeSelectedTabModel = this._statuses.Tabs[this._curTab.Text];
+
+                // 発言一覧のスクロール位置・選択状態を退避
+                this.listViewScroll[beforeSelectedTabModel.TabName] = this.SaveListViewScroll(beforeSelectedList, beforeSelectedTabModel);
+                this.listViewSelection[beforeSelectedTabModel.TabName] = this.SaveListViewSelection(beforeSelectedList, beforeSelectedTabModel);
+            }
+
             this.PurgeListViewItemCache();
 
             _curTab = _tab;
             _curList = (DetailsListView)_tab.Tag;
+
+            var curTabModel = this._statuses.Tabs[this._curTab.Text];
+
+            this._curList.VirtualListSize = curTabModel.AllCount;
+
+            // 発言一覧のスクロール位置を復元
+            ListViewScroll scrollInfo;
+            if (this.listViewScroll.TryGetValue(curTabModel.TabName, out scrollInfo))
+                this.RestoreListViewScroll(this._curList, curTabModel, scrollInfo);
+
+            // 発言一覧の選択状態を復元
+            ListViewSelection selectionInfo;
+            if (this.listViewSelection.TryGetValue(curTabModel.TabName, out selectionInfo))
+                this.RestoreListViewSelection(this._curList, curTabModel, selectionInfo);
+
             if (_curList.SelectedIndices.Count > 0)
             {
                 _curItemIndex = _curList.SelectedIndices[0];