2017-03-09 48 views
3

我試圖做出一些邏輯,但我無法達到實際結果。
我正在使用r ecyclerview(GridLayoutManager)
我有網格單元喜歡3 * 3,5 * 5,7 * 7 ...等..如何獲取gridview(或RecyclerGridview)的選定項目的所有最近位置

bewlow是3 * 3格的圖像現在

enter image description here

我的情況是什麼,我需要的位置是所有最近的單元格

如圖圖像I在下面描述的一些情況下,例如:

殼體1:

選定細胞-1
預期結果-2,5,4

案例2 :(如圖)

選定細胞-5
預期結果-1,2,3,4,6,7,8,9

殼體3:

選定細胞-6
預計結果-3,5,9

那麼,我該如何動態地實現所有cell cell 3 * 3,5 * 5,7 * 7 ....等等

+0

你試過了什麼?它應該很容易......讓選定的單元格呈現爲(r,c),然後您必須從(r-1,c-1)到(r + 1,c + 1)自己和不存在的......(r-行,c-列) – Selvin

+0

但是先生,這是數組列表是1D假設它的大小9然後網格使3 * 3然後我怎麼能理解哪個不是行,哪些是列,並且它的變量5 * 5,7 * 7等等。@Selvin –

回答

1

我可以給你一個簡單的方法來實現這一點。不完美,但容易。

public void getNeareast(int m, int choosedId) { 

    if (m <= 2) {//too simple ,you can just return the right result; 

     return; 
    } 

    int[] choose = new int[]{-m - 1, -m, -m + 1, -1, 0, +1, m - 1, m, m + 1}; 
    int x = choosedId/m; 
    int y = choosedId % m; 
    if (x == 0 || (y == 0 && x == 1)) {//no top data 
     choose[0] = 0; 
     choose[1] = 0; 
     choose[2] = 0; 
    } 

    if ((x == m - 1 && y != 0) || x == m) {// no bottom data 
     choose[6] = 0; 
     choose[7] = 0; 
     choose[8] = 0; 
    } 

    if (y == 1) { // no left data 
     choose[0] = 0; 
     choose[3] = 0; 
     choose[6] = 0; 
    } 

    if (y == 0) {// no right data 
     choose[2] = 0; 
     choose[5] = 0; 
     choose[8] = 0; 
    } 

    List<Integer> result = new ArrayList<>(); 
    for (int i = 0; i < 9; i++) {//get choosed data 
     if (choose[i] != 0) { 
      result.add(choosedId + choose[i]); 
     } 
    } 
    for (int i : result) {//print result; 
     Log.d("biu", "biu->" + i); 
    } 

} 
+0

getNeareast()中的m是什麼? –

+0

m = 3然後它的工作正常... 但是,請你給我簡要說明。它的工作.. –

+0

好的,主要想法是,當m> 3時,你選擇的每件物品都應該有8件物品。 (m = 3) 如果您選擇5,則應該有8個項目。這是正常情況。如果您選擇1,那麼也應該有8個項目。周圍的項目,但1是在邊界上,1%3 = 1意味着選擇的項目是第一列,所以沒有左邊的項目,1/3 = 0.333333,整數部分爲零,所以有沒有任何物品在上面,所以你只需從8個物品中切下左邊和上面的物品,你就會得到正確的結果。其他情況就像這樣。 – ohdroid

相關問題