Форум программистов, компьютерный форум, киберфорум
Наши страницы
Программирование Android
Войти
Регистрация
Восстановить пароль
 
Paket236
2 / 2 / 0
Регистрация: 16.08.2013
Сообщений: 52
#1

Как реализовать выделение элементов таблицы

30.09.2016, 20:44. Просмотров 349. Ответов 11
Метки нет (Все метки)

Уважаемые знатоки, нужна ваша помощь
Имеется таблица, созданная с помощью GridLayout, элементами которой являются ImageView.
Кликните здесь для просмотра всего текста
Как реализовать выделение элементов таблицы

После реализации View.OnClickListener и регистрации слушателей для этих ImageView на них срабатывают нажатия. Но они за одно нажатие срабатывают только на одном элементе. А мне нужно за одно нажатие выделить несколько элементов (как в игре балда, когда надо выделить слово).

Как это можно реализовать?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.09.2016, 20:44
Ответы с готовыми решениями:

Как реализовать правильное отображение View элементов?
Здравствуйте! Хочу реализовать что-то похожее, но не пойму как добиться того,...

RecyclerView множественное выделение элементов
Решил сделать список RecyclerView и нужно сделать multiple select как в...

Как минусоват данные с таблицы 2 от таблицы 1
Я пока добился чего хотел. Данный момент у меня есть 2 таблицы в одной БД....

Как реализовать выделение линий
Как выделить жирными линиями части кругов и касательной , как на рисунке ?

Как реализовать выделение пункта меню, на странице которого нахожусь
Есть простейшее меню на html со списком и фоном. Мне для решения задачи...

11
OlegJV
103 / 103 / 28
Регистрация: 13.03.2016
Сообщений: 474
30.09.2016, 22:53 #2
Можно сделать свою вьюшку - гибрид ImageView и Toggle...
0
Paket236
2 / 2 / 0
Регистрация: 16.08.2013
Сообщений: 52
01.10.2016, 13:30  [ТС] #3
Цитата Сообщение от OlegJV Посмотреть сообщение
Можно сделать свою вьюшку - гибрид ImageView и Toggle...
А можно поподробнее? А то пока не очень понятно...
0
Pablito
2707 / 2154 / 731
Регистрация: 12.05.2014
Сообщений: 7,516
Завершенные тесты: 1
01.10.2016, 13:37 #4
Цитата Сообщение от Paket236 Посмотреть сообщение
А мне нужно за одно нажатие выделить несколько элементов
каких именно элементов? вот я ткнул в середину экрана допустим, что выделять? вверх, вниз, вверз и вниз
право-лево

Добавлено через 31 секунду
и где код и разметка
0
OlegJV
103 / 103 / 28
Регистрация: 13.03.2016
Сообщений: 474
01.10.2016, 13:40 #5
Сделать CustomImageView extends ImageView, добавить внутрь нее OnClickListener, переменную boolean и по onClick циклически менять ее значение. Добавить для этой переменной геттер и сеттер. Можно туда же приделать интерфейс, который будет выдавать состояние переменной, а по нему уже делать что хочешь - менять цвет, фон, картинку, надпись и т.д. в зависимости выделено - не выделено.
0
Paket236
2 / 2 / 0
Регистрация: 16.08.2013
Сообщений: 52
01.10.2016, 16:28  [ТС] #6
Цитата Сообщение от Паблито Посмотреть сообщение
и где код и разметка
Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
public class MainActivity extends Activity implements View.OnClickListener, View.OnTouchListener {
 
    private GridLayout gridLayout;
    private ImageView[][] imageView;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        imageView = new ImageView[12][11];
        gridLayout = (GridLayout) findViewById(R.id.gridLayout);
        gridLayout.setColumnCount(11);
 
        for(int i=0; (i<=11); i++) {
            for(int j=0; (j<=10); j++) {
                imageView[i][j] = new ImageView(this);
                gridLayout.addView(imageView[i][j]);
                imageView[i][j].setOnClickListener(this);
                imageView[i][j].setOnTouchListener(this);
                
                // Задаём отступы, размеры и фон клеток
                if(i==0 && j==0) {
                    GridLayout.LayoutParams layoutParamsRB = new GridLayout.LayoutParams();
                    layoutParamsRB.width = layoutParamsRB.height = 41;
                    layoutParamsRB.setMargins(0, 0, 2, 2);
                    imageView[i][j].setLayoutParams(layoutParamsRB);
                }
                if(i==0 && j!=0 && j<=9) {      // проходим по 0-ой строчке
                    MarginLayoutParams marginLayoutParams = new MarginLayoutParams(41, 41);
                    marginLayoutParams.setMargins(0, 0, 2, 0);
                    GridLayout.LayoutParams layoutParamsR = new GridLayout.LayoutParams(marginLayoutParams);
                    imageView[i][j].setLayoutParams(layoutParamsR);
                }
                if(i!=0 && j==0 && i<=10) {     // проходим по 0-ому столбцу
                    MarginLayoutParams marginLayoutParams = new MarginLayoutParams(41, 41);
                    marginLayoutParams.setMargins(0, 0, 0, 2);
                    GridLayout.LayoutParams layoutParamsB = new GridLayout.LayoutParams(marginLayoutParams);
                    imageView[i][j].setLayoutParams(layoutParamsB);
                }
                imageView[i][j].getLayoutParams().width = 41;
                imageView[i][j].getLayoutParams().height = 41;
                imageView[i][j].setBackgroundColor(0xFFFFFFFF);
            }
        }   
    }
 
    @Override
    public void onClick(View v) {
    }
 
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        // Определяем нажатый ImageView
        ImageView img = (ImageView) v;
        int stlb=0;
        int str=0;
        for(int i=0; (i<=11); i++) {
            for(int j=0; (j<=10); j++) {
                if(img == imageView[i][j]) {
                    str=i; stlb=j;
                    break;
                }
            }
        }
        
        imageView[str][stlb].setBackgroundColor(0xFFC1D8FF);
        
        if(event.getAction()==MotionEvent.ACTION_UP) {
            imageView[str][stlb].setBackgroundColor(0xFFFFFFFF);
        }
        return false;
    }
}


Кликните здесь для просмотра всего текста
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:gravity="center"
    android:background="#fff"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >          
    <GridLayout
        android:id="@+id/gridLayout"
        android:layout_gravity="center"
        android:background="#FF59BEEC"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" >
    </GridLayout>
</LinearLayout>


Цитата Сообщение от Паблито Посмотреть сообщение
вот я ткнул в середину экрана допустим, что выделять? вверх, вниз, вверз и вниз
право-лево
Как в игре "Балда", выделять соседние клетки, по горизонтали и вертикали. А какие именно выделять, зависит от содержимого клетки (допустим, иметь ещё один массив String[][] (в дополнение к ImageView[][]), в котором будут храниться буквы).
Цитата Сообщение от OlegJV Посмотреть сообщение
Сделать CustomImageView extends ImageView
Спасибо, попробую. Правда пока непонятно, как это сработает...

Добавлено через 53 минуты
OlegJV, а Вы можете показать на моём примере?
0
OlegJV
103 / 103 / 28
Регистрация: 13.03.2016
Сообщений: 474
01.10.2016, 16:35 #7
Paket236, что именно показать?
0
Paket236
2 / 2 / 0
Регистрация: 16.08.2013
Сообщений: 52
01.10.2016, 16:43  [ТС] #8
OlegJV, я не понял фразу "и по onClick циклически менять ее значение" и как это поможет выделению элементов таблицы.

Добавлено через 3 минуты
Я ещё раз уточню, что элементы должны выделяться за одно нажатие, а не за несколько.
0
OlegJV
103 / 103 / 28
Регистрация: 13.03.2016
Сообщений: 474
01.10.2016, 16:56 #9
Ты тыкаешь на свою CustomImageView. У нее срабатывает метод onClick. Внутри нее есть переменная, допустим boolean checked. Если она была false, то становится true и наоборот. Кроме этого делаешь внутри CustomImageView методы cetChecked и getChecked, меняющие значение checked. Так же по onClick срабатывает интерфейс и выдает в активити значение переменной checked. Активити (в зависимости от значения переменной) в цикле проверяет значения соседних клеток и выставляет им setChecked какой тебе нужно.

Добавлено через 1 минуту
Объяснять подробнее - это значит написать программу за тебя.
0
Paket236
2 / 2 / 0
Регистрация: 16.08.2013
Сообщений: 52
02.10.2016, 00:34  [ТС] #10
Цитата Сообщение от OlegJV Посмотреть сообщение
Активити (в зависимости от значения переменной) в цикле проверяет значения соседних клеток и выставляет им setChecked какой тебе нужно.
А как эти значения попадут в соседние клетки? Либо я тебя не понимаю, либо ты меня. Ещё раз поясню задачу. Я тыкнул пальцем в клетку, затем, не отпуская палец, провёл на соседнюю клетку. Что должно произойти? Обе клетки должны, например, изменить цвет. Что происходит? Меняет цвет только первоначально нажатая. А то, что я пальцем провёл в другую клетку - об этом никакой информации нет (хотя, есть координаты, которые можно получить с помощью event.getX(), но, по-моему, это плохое решение).
На другом форуме мне порекомендовали отказаться от лэйаутов и рисовать таблицу на Canvas (пока не очень представляю, как это реализовать).
0
OlegJV
103 / 103 / 28
Регистрация: 13.03.2016
Сообщений: 474
02.10.2016, 01:57 #11
Цитата Сообщение от Paket236 Посмотреть сообщение
на них срабатывают нажатия
Цитата Сообщение от Paket236 Посмотреть сообщение
не отпуская палец, провёл на соседнюю клетку
Цитата Сообщение от Paket236 Посмотреть сообщение
Либо я тебя не понимаю, либо ты меня
Ты сам себя-то понимаешь? То на нажатия надо реагировать, то на перемещения пальца... Определяйся уже.
0
Spelcrawler
531 / 501 / 113
Регистрация: 12.03.2014
Сообщений: 1,666
Завершенные тесты: 1
02.10.2016, 09:17 #12
Таблица ведь без скрола? Если да - можно сам GridLayout повесить OnTouch листенер и в ивенте MOVE брать координаты касания, а потом по ним искать картинку и вызывать у нее какой-нибудь метод, который ее перекрасит.
1
02.10.2016, 09:17
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.10.2016, 09:17

Как реализовать выделение пункта меню, на странице которого нахожусь
Добрый день дорогие пользователи. Из заголовка уже должно быть понятно что я...

Как реализовать заполнение таблицы
Здравствуйте Уважаемые программисты! Подскажите пожалуйста, как реализовать (с...

Как реализовать хранение таблицы
Добрый день! Есть данные в виде таблицы с строковыми и числовыми полями. Мне...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru