Android, как найти соседние элементы в макете сетки

Мне было интересно, как вы можете получить соседний элемент в макете сетки? В настоящее время работает над функцией, которая может определять соседние элементы по позиции. Я вычитаю позицию за вычетом столбцов, и очевидно, что это становится сложнее, когда я нахожусь по бокам и углам. Это может быть слишком много, но единственный вариант, о котором я могу думать сейчас, есть ли более простой способ? Я могу получить позиции из события касания, и матрица с позициями выглядит так.

1  2  3  4
5  6  7  8
9 10 11 12

Ответ снизу

boolean isedgeitem(int position) 
    { 
        int row = position % 11;
        int column = position / 11;
        int numberedges = 0;
        for (int rowOffset = -1; rowOffset <= 1; rowOffset++) 
        {
            final int actRow = row + rowOffset;
            for (int columnOffset = -1; columnOffset <= 1; columnOffset++) 
            {
                final int actColumn = column + columnOffset;
                if (actRow >= 0 && actRow < 11 && actColumn >= 0 && actColumn < 11) 
                {
                    numberedges++;
                }

            }
        }

        if (numberedges < 8)
        {
            return true;
        }
        else
        {
            return false;
        }
        }

person MAXGEN    schedule 18.03.2014    source источник


Ответы (1)


Попробуй это:

// x = number of columns
// s = index start
// a = index of a
// b = index of b

// if your index doesn't starts at 0
public static boolean isAdjacent(int x, int s, int a, int b) {
    int ax = (a - s) % x, ay = (a - s) / x, bx = (b - s) % x, by = (b - s) / x;
    return a != b && Math.abs(ax - bx) <= 1 && Math.abs(ay - by) <= 1;
}

// if your index starts at 0
public static boolean isAdjacent(int x, int a, int b) {
    int ax = a % x, ay = a / x, bx = b % x, by = b / x;
    return a != b && Math.abs(ax - bx) <= 1 && Math.abs(ay - by) <= 1;
}

Рассмотрим макет gridview:

введите описание изображения здесь

Две клетки являются соседними, если:

  • их индекс (0~47) отличается
  • номер столбца разницы ‹= 1
  • номер строки разницы ‹= 1

Пример:

isAdjacent(6, 18, 12) // true
isAdjacent(6, 18, 19) // true
isAdjacent(6, 18, 24) // true
isAdjacent(6, 18, 17) // false
isAdjacent(6, 18, 18) // false

Заметки:

  1. Если индекс первой ячейки не равен 0, используйте первый метод с аргументом s
  2. В этом методе диагонали считаются смежными:

Пример:

isAdjacent(6, 18, 13) // true
isAdjacent(6, 18, 25) // true
person alex    schedule 19.03.2014
comment
Можете ли вы объяснить это в деталях ?? - person MashukKhan; 24.10.2016
comment
Я вычисляю ax номер столбца a индекса, ay номер строки a индекса, bx номер столбца b индекса, by номер строки b индекса и возвращаю true, если a индекс != b индекс и если разница между столбцом и номер строки ‹= 1 (если индекс a соседствует с индексом b). - person alex; 24.10.2016
comment
Тем не менее, я не получил индексную часть. Например, индекс a и b - это что, индекс столбца?? Не могли бы вы объяснить это в матрице, заданной в вопросе ?? - person MashukKhan; 26.10.2016