2

私はこれに頭を悩ませようとしてきましたが、うまくいきません。

一度に 1 つの要素のみを移動できる独自のテクノロジを使用しています。超迷惑。list.moveRow(before, after) と考えてください。

では、10 個のアイテムを含む todo リストを想像してみてください。1, 2, 3, 4, 5, 6, 7, 8, 9, 10

私がやりたいのは、そこにある複数のアイテムを並べ替えることです2, 6, 7, and 8

次に、位置にドラッグ アンド ドロップし4ます。

アイデアは、要素が順番に並んでいるということです: 1, 3, 2, 6, 7, 8, 4, 5, 9, 10.

これを行う簡単な方法はありますか?追加の変数を使用してオフセットを追跡しようとしましたが、要素が移動してインデックスがスローされたために発生しましたが、非常に面倒です。:(

4

3 に答える 3

0

それは本当に言語に依存します。

各アイテムの isSelected() を取得する簡単な方法があると仮定すると、最も単純で最も一般的な方法は、新しい配列をリストとして作成することです (つまり、最初のインデックスから最後のインデックスに追加します)。

  • 選択されていないアイテムを挿入位置まで順番に追加します
  • 選択したアイテムを追加
  • 残りの選択されていないアイテムを追加します

その後、古いアレイを置き換えます。

疑似コードで:

func(int[] items, bool[] isselected, int insertpos) {
   newitems = new int[items.length]
   i=0
   for (j=0; j<items.length; j++) {
      if j==insertpos {
          for (k=0; k<items.length; k++) {
              if isselected[k] {
                  newitems[i++] = items[k]
              }
          }
      } else if !isselected[j] {
          newitems[i++] = items[j]
      }
   }
   return newitems
}

高性能とその場での修正が必要な場合...それは別の問題です...

于 2012-06-28T19:43:39.270 に答える
0

座ってそれを書き留め、合理的な解決策を思いつきました。これはうまくいくようです:

// Reorder list
function reorder(items, index)
{        
    // When we move, we have to account for previously moved rows too
    //  Go from bottom-most selected row first to preserve order
    for (var i = items.length - 1, itemOffset = 0, indexOffset = 0; i >= 0; --i) 
    {
        // Move
        list.moveRow(items[i] + itemOffset, index + indexOffset);

        // Change offsets based on location
        //  If next row index is after target index, add to row offset
        if (i-1 >= 0 && items[i-1] >= index) {
            itemOffset++;
        } else {    // If next index is before target, subtract from target
            itemOffset= 0;
            indexOffset--;
        }
    }
}
于 2012-06-28T21:22:34.523 に答える