Страницы

Поиск по вопросам

Показаны сообщения с ярлыком checkbox. Показать все сообщения
Показаны сообщения с ярлыком checkbox. Показать все сообщения

суббота, 11 апреля 2020 г.

Передать массив чекбоксов в PHP-файл с помощью AJAX

#php #javascript #ajax #checkbox

                    
Форма

JS function send() { var name = $('#name').val() var surname = $('#surname').val() var id_usl = $('#id_usl').val() var srok = $('#srok').val() $.ajax({ type: "POST", url: "SendData.php", data: "name="+name+"&surname="+surname+"&id_usl="+id_usl+"&srok="+srok, success: function(html) { $("#result").empty(); $("#result").append(html); } }); } Как отправить в SendData.php массив value выделенных чекбоксов и как прочитать его в php-файле?


Ответы

Ответ 1



Воспользуйтесь методом .serialize() Например: function send() { var name = $('#name').val() var surname = $('#surname').val() var id_usl = $('#id_usl').val() var srok = $('#srok').val() $.ajax({ type: "POST", url: "SendData.php", data: {inputs: $('form').serialize()}, success: function(html) { $("#result").empty(); $("#result").append(html); } }); } Как прочесть данные? Для начала выполите: parse_str($_POST['inputs'], $inputs); Затем: print_r($inputs);

Динамическое добавление checkbox android

#java #android #checkbox

                    
Почему-то добавленный checkbox с помощью этого кода: 

    RelativeLayout test = (RelativeLayout)findViewById(R.id.testRelative);
    CheckBox checkbox = new CheckBox(this);
    checkbox.setText("completed");
    RelativeLayout.LayoutParams RL = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT,
RelativeLayout.LayoutParams.WRAP_CONTENT);
    test.addView(checkbox, RL);


Имеет иной стиль вывода, чем тот, что добавлен в xml файл этого же активити:




Отличаются они только фоном. Первый имеет черный фон (тот CheckBox, что задан динамически),
второй имеет стандартный синий цвет (CheckBox с XML файла). 
Мне необходимо, чтобы они были в одном стиле, какие поправки нужно внести, чтобы
это реализовать? 
    


Ответы

Ответ 1



Можно сделать так. Сначала создать layout файл "chbTemplate" с чекбоксом: потом inflate этот layout в ваш CheckBox: CheckBox myChb = (CheckBox)getLayoutInflater().inflate(R.layout.chbTemplate, null); Надеюсь, что это поможет.

воскресенье, 15 марта 2020 г.

WPF Interactions CallMethodAction для DataTemplate в ListCheckBox ругается на входные параметры метода во ViewModel

#c_sharp #wpf #checkbox


Пытаюсь воспользоваться механизмом поведения, однако не могу правильно прописать
аргументы в методе во ViewModel. Использую ListBox состоящий из item включающих в себя
CheckBox, собственно перепробовал разные комбинации входных параметров метода, но никак
не могу получить объект Item из ListBox при снятии галочки у CheckBox.

XAML


            
                
                    
                               
                            
                                
                                    
                                
                            
                        
                        
                        
                            
                        
                        
                    
                
            
        


C#

public void PropertyUnchecked()
{
    MessageBox.Show("Unchecked");
}


в итоге получаю ошибку:


  Thrown: "Could not find method named 'PropertyChecked' on object of
  type 'CheckedListItem 1' that matches the expected
  signature."(System.ArgumentException)   Exception Message = "Could not
  find method named 'PropertyChecked' on object of type
  'CheckedListItem`1' that matches the expected signature.", Exception
  Type = "System.ArgumentException", Exception WinRT Data = null


Исходя из сообщения, я посчитал, что метод в коде ViewModel не имеет нужных входных
параметров (CheckedListItem именно такие итемы хранятся в ListBox), начал
экспериментировать:

[1]    

public void PropertyUnchecked(CheckedListItemtr, object sender, RoutedEventArgs e)
{
    MessageBox.Show("Unchecked");
}


[2] 

public void PropertyUnchecked(object sender, RoutedEventArgs e)
{
    MessageBox.Show("Unchecked");
}


[3] 

public void PropertyUnchecked(object sender)
{
    MessageBox.Show("Unchecked");
}


Также поэкспериментировал с разметкой:


    
        
            
        
    



С такой разметкой заработал пустой C# метод, а также [2] и [3], однако ничего кроме
CheckBox и его свойств как элемента (в sender) мне не пришло, но нужен именно Item
в котором сидит объект типа CheckedListItem .
Нашел как реализовать нечто подобное командами с параметрами, но мне нужен именно
вызов метода, и обойтись без команд.
    


Ответы

Ответ 1



Я получил ответ на свой вопрос, звучит он так: This is probably what you're looking for: public void PropertyUnchecked(object sender, RoutedEventArgs e) { var item = ((ContentPresenter)((CheckBox)e.Source).TemplatedParent).Content as CheckedListItem; } Собственно сам вопрос и ответы доступны по ссылке: Вопрос и ответ

среда, 4 марта 2020 г.

Как на jquery поставить checked всем checkbox что бы флажок ставился по одному и желательно рандомно

#javascript #jquery #checkbox


Есть кучка чекбоксов, у каждого есть свой id. Хочу чтобы при загрузке документа загорелись
те, которые я хочу. Но что бы не одновременно загорелись, а через допустим 200 миллисекунд,
и в рандомном порядке.

Не могу додуматься как это сделать. Сколько не пробовал, либо загораются все сразу,
либо вообще не загораются.



 $('#sass').prop('checked',true); 


Вот так писал. Как задать им очередь не знаю
    


Ответы

Ответ 1



Выбираем все желаемые элементы. Превращаем набор в массив. Перемешиваем используя алгоритм Фишера-Йетса. Для каждого элемента массива создаём задержку для изменения чекбокса. function shuffle(a) { for (var m=a.length; m; ) { var i = Math.random() * m-- | 0; var t = a[i]; a[i] = a[m]; a[m] = t; } return a; } $(function () { var DELAY = 500; var els = shuffle($("#a,#c,#g,#i,#j,#k,#l,#o,#p,#s,#u,#v,#x").toArray()); for (var q=0; q

Ответ 2



Для последовательного выбора чекбоксов используйте setTimeout(), предварительно поместив необходимые id в массив и "перемешав" его. Важно, чтобы перечисление id чекбоксов было без пробелов и отделялось запятой, например, 'html,sass,jquery': function check(checkboxes) { var arr = checkboxes.split(','); // разбиваем строку на массив shuffle(arr); // перемешиваем массив arr.forEach(function(id, index) { // перебираем получившийся массив setTimeout(function() { // задаем задержку $('#' + id).prop('checked', true); // отмечаем чекбокс }, index * 1000); // задержка равная индексу значения, умноженному на 1000 миллисекунд (0*200, 1*200 и т.д.) }); } function shuffle(a) { // функция перемешивания массива for (let i = a.length; i; i--) { let j = Math.floor(Math.random() * i); [a[i - 1], a[j]] = [a[j], a[i - 1]]; } } check('html,sass,jquery'); html
css
javascript
sass
gulp
css3
jquery
bootstrap
Функция перемешивания массива позаимствована из ответа на enSO.

Ответ 3



Ну вот как-то так получилось : $(document).on('ready', function() { var cbs = $('#5, #6, #7, #8, #9, #10'); var newCbs = []; for (var i = 0; i < cbs.length; i++) { newCbs.push({ cb: cbs[i], num: Math.floor(Math.random() * 100) + 1 }); } newCbs = newCbs.sort(compare); xz(newCbs); }); function compare(a, b) { if (a.num > b.num) return -1; if (a.num < b.num) return 1; return 0; } function xz(arr) { if (arr.length == 0) return; var current = arr[0].cb; arr.shift(); setTimeout(function() { $(current).prop('checked', true); xz(arr); }, Math.floor(Math.random() * 2000) + 1); }; .that { height: 14px; width: 14px; }

понедельник, 24 февраля 2020 г.

Увеличение картинки при нажатии

#html #css #html5 #css3 #checkbox


Необходимо, чтобы при нажатии на картинку(уменьшенную версию) на экране по центру
появлялась её увеличенная версия. Проблема в том, что если картинок много и открывается
картинка внизу, то по закрытии картинки происходит переход вверх страницы. Как можно
это реализовать без перехода. Мне посоветовали использовать checkbox, но я не особо
понимаю, как через них делать.



.pictures {
  -webkit-column-count: 4;
  -moz-column-count: 4;
  column-count: 4;
  -webkit-column-gap: 1em;
  -moz-column-gap: 1em;
  column-gap: 1em;
  margin-bottom: -1em;
}
a {
  display: inline-block;
}
img {
  display: block;
  width: 100%;
  margin-bottom: 1em;
}
.full {
  display: none;
  position: fixed;
  left: 0;
  top: 0;
  right: 0;
  bottom: 0;
  padding: 8%;
  background: #CCC center no-repeat;
  background: rgba(0, 0, 0, 0.5) center no-repeat;
  background-size: contain;
  background-origin: content-box;
}
.full:target {
  display: block;
}


Ответы

Ответ 1



Если для вас принципиально использование CSS и структура разметки будет как в вашем примере, то вместо псевдокласса :target на самом показывающемся блоке можно использовать псевдокласс :focus на ссылке, по которой происходит клик, и делать видимой следующую за ней ссылку, будет выглядеть так: a:focus + .full { display: block; } Это устранит скроллирование вверх. Пример на JSFiddle P.S. Но лучше, по-моему, для полноценных модальных окон использовать JS

Ответ 2



Вы можете воспользоваться готовыми решениями, например, библиотекой highslide.js. Она имеет MIT-лицензию и написана на javascript без использования Jquery. Просто подключается: где /graphics/ - путь до графических компонентов, поставляемых в дистрибутиве. Используется таким образом: Демо Инструкция на русском языке.

Android. View элементы меняют дефолтный стиль в зависимости от типа Activity. Как установить единый стиль?

#java #android #view #checkbox


Заметил что при создании различных типов Activity при создании приложения, к ним
прикручиваются разные стили для чекбоксов и спиннеров, при создании Активити типа диалог
там и вовсе свой стиль у элементов. Где эти стили прописываются в коде и как их на
всех типах активити одинаковыми сделать?
    


Ответы

Ответ 1



Стили указываются в манифесте при объявлении активити с помощью атрибута android:theme В данном манифесте они указаны в теге application и в каждом теге activity. В атрибутах указаны ссылки на ресурс styles Если в теге activity не указан атрибут android:theme, то берётся родительское значение этого атрибута (т.е. значение android:theme тега application) Сами описания стилей хранятся в ресурсах (/res/values/styles.xml например)

Ответ 2



Возможно, определите свой стиль. Пример: Источник Привязку чекбокса нужно сделать к Nullable полю типа bool?.

Ответ 3



мне как то понадобился CheckBox с тремя состояниями для вставки в дерево в итоге сложный переключатель и возможность использовать доп пояснение, кликабельное

вторник, 24 декабря 2019 г.

SimpleCursorAdapter + ListView: Чекбоксы теряются при скроллинге

#android #listview #checkbox


Чекбоксы при уходе за экран, теряют свои положения при возвращении. Вот тут - SimpleCursorAdapter
- фильтр для курсора
есть весь код (мой вопрос). Как реализовать метод для сохранения булевых значений?
Неужели вместо курсора в адаптер мне нужно отправлять массив булевых значений? А как
взятие данных через курсор в методе bindView()? Ведь курсор я уберу, а он нужен.

Mетод для получения данных с БД

private void getProductList()
{
    String filter = "list=" + intValue;
    final Cursor cursor = mSqLiteDatabase.query("products", new String[] {DatabaseProductHelper.PRODUCT_ID,
        DatabaseProductHelper.PRODUCT_NAME, DatabaseProductHelper.PRODUCT_COUNT,
DatabaseProductHelper.PRODUCT_LIST, DatabaseProductHelper.PRODUCT_TYPE, DatabaseProductHelper.PRODUCT_COMPLETE}, 
        null, null,  null, null, null) ;  
    final Cursor cursorc = mSqLiteDatabase.query("products", new String[] {DatabaseProductHelper.PRODUCT_ID,
                                                    DatabaseProductHelper.PRODUCT_NAME,
DatabaseProductHelper.PRODUCT_COUNT, DatabaseProductHelper.PRODUCT_LIST, DatabaseProductHelper.PRODUCT_TYPE,
DatabaseProductHelper.PRODUCT_COMPLETE}, 
                                                filter, null,  null, null, null) ;
    final ArrayList arrTblNames = new ArrayList();

    if (cursor.moveToFirst()) {
        while ( !cursor.isAfterLast() ) {
            if(cursor.getInt(cursor.getColumnIndex("list"))==intValue)
            {
            arrTblNames.add(cursor.getString(cursor.getColumnIndex("name")));
            }
            cursor.moveToNext();
            }

        String[] from = {DatabaseProductHelper.PRODUCT_NAME, DatabaseProductHelper.PRODUCT_COUNT,
DatabaseProductHelper.PRODUCT_TYPE, DatabaseProductHelper.PRODUCT_COMPLETE};
        int[] to = {R.id.ColMemberID, R.id.ColName, R.id.count_tv, R.id.chb_products};
        adapter = new InteractiveArrayAdapter(ListBuilder.this,
        R.layout.row,
        cursorc,
        from,
        to
        );
        //lv_products.setAdapter(adapter);

    }



    if(!arrTblNames.isEmpty()){
        empty_bd_layout.setAlpha(0);
        lv_products.setAdapter(adapter);
    }
    else{
empty_bd_layout.setAlpha(255);
}
}


И сам адаптер

public class InteractiveArrayAdapter extends SimpleCursorAdapter
{
    private int layout;
    private boolean checked[];
    public InteractiveArrayAdapter(Context _context, int _layout, Cursor _cursor,
String[] _from, int[] _to) {
        super(_context, _layout, _cursor, _from, _to);
        layout = _layout;
        int counts = _cursor.getCount();
        checked = new boolean[counts];

                for (int i = 0; i < counts; i++){

                    int checkMarker = _cursor.getInt(_cursor.getColumnIndex("complete"));
                    checked[i] = checkMarker == 1;
            }


    }

    @Override
    public void bindView(View view, Context _context, Cursor _cursor) {




        String prod_name = _cursor.getString(_cursor.getColumnIndex(DatabaseProductHelper.PRODUCT_NAME));
        String prod_count = _cursor.getString(_cursor.getColumnIndex(DatabaseProductHelper.PRODUCT_COUNT));
        String prod_type = _cursor.getString(_cursor.getColumnIndex(DatabaseProductHelper.PRODUCT_TYPE));
    //  int prod_complete = _cursor.getInt(_cursor.getColumnIndex(DatabaseProductHelper.PRODUCT_COMPLETE));
        TextView name_prod_tv = (TextView)view.findViewById(R.id.ColMemberID);
        TextView count_prod_tv = (TextView)view.findViewById(R.id.ColName);
        TextView type_prod_tv = (TextView)view.findViewById(R.id.count_tv);
        CheckBox chb = (CheckBox)view.findViewById(R.id.chb_products);

        chb.setFocusable(false);

        chb.setClickable(false);

        name_prod_tv.setText(prod_name);

        count_prod_tv.setText(prod_count);

        type_prod_tv.setText(prod_type);

        chb.setChecked(checked[_cursor.getPosition()]);

        }
    @Override
    public View newView(Context _context, Cursor _cursor, ViewGroup _parent)
    {
        LayoutInflater inflater = (LayoutInflater)_context.getSystemService(_context.LAYOUT_INFLATER_SERVICE);
        View view = inflater.inflate(layout, _parent, false);
        return view;
    }
    public void setChecked(int position){
        // инвертируем значение при обработке клика этим методом
        checked[position]=!checked[position];
    }
}


LogCat
FATAL EXCEPTION: main
05-09 07:18:29.529 1468 1468 E     AndroidRuntime                               Process:
ru.diskrim.listbuy, PID: 1468
05-09 07:18:29.529 1468 1468 E     AndroidRuntime                               java.lang.RuntimeException:
Unable to start activity ComponentInfo{ru.diskrim.listbuy/ru.diskrim.listbuy.ListBuilder}:
android.database.CursorIndexOutOfBoundsException: Index -1 requested, with a size of 4
05-09 07:18:29.529 1468 1468 E     AndroidRuntime                               at
android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2325)
05-09 07:18:29.529 1468 1468 E     AndroidRuntime                               at
android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2387)
05-09 07:18:29.529 1468 1468 E     AndroidRuntime                               at
android.app.ActivityThread.access$800(ActivityThread.java:151)
05-09 07:18:29.529 1468 1468 E     AndroidRuntime                               at
android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303)
05-09 07:18:29.529 1468 1468 E     AndroidRuntime                               at
android.os.Handler.dispatchMessage(Handler.java:102)
05-09 07:18:29.529 1468 1468 E     AndroidRuntime                               at
android.os.Looper.loop(Looper.java:135)
05-09 07:18:29.529 1468 1468 E     AndroidRuntime                               at
android.app.ActivityThread.main(ActivityThread.java:5254)
05-09 07:18:29.529 1468 1468 E     AndroidRuntime                               at
java.lang.reflect.Method.invoke(Native Method)
05-09 07:18:29.529 1468 1468 E     AndroidRuntime                               at
java.lang.reflect.Method.invoke(Method.java:372)
05-09 07:18:29.529 1468 1468 E     AndroidRuntime                               at
com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:902)
05-09 07:18:29.529 1468 1468 E     AndroidRuntime                               at
com.android.internal.os.ZygoteInit.main(ZygoteInit.java:697)
05-09 07:18:29.529 1468 1468 E     AndroidRuntime                               at
de.robv.android.xposed.XposedBridge.main(XposedBridge.java:117)
05-09 07:18:29.529 1468 1468 E     AndroidRuntime                               Caused
by: android.database.CursorIndexOutOfBoundsException: Index -1 requested, with a size of 4
05-09 07:18:29.529 1468 1468 E     AndroidRuntime                               at
android.database.AbstractCursor.checkPosition(AbstractCursor.java:426)
05-09 07:18:29.529 1468 1468 E     AndroidRuntime                               at
android.database.AbstractWindowedCursor.checkPosition(AbstractWindowedCursor.java:136)
05-09 07:18:29.529 1468 1468 E     AndroidRuntime                               at
android.database.AbstractWindowedCursor.getInt(AbstractWindowedCursor.java:68)
05-09 07:18:29.529 1468 1468 E     AndroidRuntime                               at
ru.diskrim.listbuy.ListBuilder$InteractiveArrayAdapter.(ListBuilder.java:245)
05-09 07:18:29.529 1468 1468 E     AndroidRuntime                               at
ru.diskrim.listbuy.ListBuilder.getProductList(ListBuilder.java:209)
05-09 07:18:29.529 1468 1468 E     AndroidRuntime                               at
ru.diskrim.listbuy.ListBuilder.onCreate(ListBuilder.java:184)
05-09 07:18:29.529 1468 1468 E     AndroidRuntime                               at
android.app.Activity.performCreate(Activity.java:6033)
05-09 07:18:29.529 1468 1468 E     AndroidRuntime                               at
android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1106)
05-09 07:18:29.529 1468 1468 E     AndroidRuntime                               at
android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2278)
05-09 07:18:29.529 1468 1468 E     AndroidRuntime                               ...
11 more
    


Ответы

Ответ 1



Решение мало чем отличается от этого ответа, с той разницей, что вам нужно обрабатывать клики из активити, а не слушателем в адаптере. Поскольку мы не можем изменять значения в курсоре, а только читать их оттуда, для запоминания текущего состояния чекбоксов требуется создать локальное хранилище. В адаптер вам нужно передавать данные, которые должны быть отображены в виджете, в вашем случае это курсор с выборкой из БД. Вспомогательный массив булевых значений никуда передавать не нужно, он создается внутри адаптера. Примерная реализация может выглядеть так: private void getProductList() { // Если требуется только имя, следует и запрашивать из БД только //колонку с именем, а не все в кучу // Если требуется только записи с каким то условием, то их и надо запрашивать, // а не все в подряд, а потом выбирать нужные каким то циклом // так же эти данные включены и в курсор для адаптера и нет нужды // получать то же самое дважды // final Cursor cursor = mSqLiteDatabase.query("products", new String[] {DatabaseProductHelper.PRODUCT_ID, DatabaseProductHelper.PRODUCT_NAME,"list = ?", new String[] {""+ intValue}, null, null, null) ; //то же самое, только нужные в адаптере колонки final Cursor cursorc = mSqLiteDatabase.query("products", new String[] {DatabaseProductHelper.PRODUCT_ID,DatabaseProductHelper.PRODUCT_NAME, DatabaseProductHelper.PRODUCT_COUNT, DatabaseProductHelper.PRODUCT_TYPE, DatabaseProductHelper.PRODUCT_COMPLETE}, "list = ?", new String[] {""+ intValue}, null, null, null); final ArrayList arrTblNames = new ArrayList(); // копирование данных из курсора в массив сильно упрощается, // так как у нас только нужные данные while ( cursorc.moveToNext() ) { arrTblNames.add(cursorc.getString(cursorc.getColumnIndex("name"))); } String[] from = {DatabaseProductHelper.PRODUCT_NAME, DatabaseProductHelper.PRODUCT_COUNT, DatabaseProductHelper.PRODUCT_TYPE, DatabaseProductHelper.PRODUCT_COMPLETE}; int[] to = {R.id.ColMemberID, R.id.ColName, R.id.count_tv, R.id.chb_products}; adapter = new InteractiveArrayAdapter(ListBuilder.this, R.layout.row, cursorc, from, to ); //lv_products.setAdapter(adapter); } // у виджетов есть свойство Visiblity, которое управляет видимостью на // экране, зачем тут использовать прозрачность ? // я бы поменял всю логику вообще, исходя из условия ниже, // зачем получаnь и формировать данные, если они могут не понадобится if(!arrTblNames.isEmpty()){ empty_bd_layout.setAlpha(0); lv_products.setAdapter(adapter); } else{ empty_bd_layout.setAlpha(255); } } адаптер: public class InteractiveArrayAdapter extends SimpleCursorAdapter { private int layout; private boolean checked[]; public InteractiveArrayAdapter(Context _context, int _layout, Cursor _cursor, String[] _from, int[] _to) { super(_context, _layout, _cursor, _from, _to); layout = _layout; // инициализируем вспомогательный массив начальными отметками чекбоксов из курсора checked = new boolean[_cursor.getCount()]; int i = 0; while ( _cursor.moveToNext() ) { int checkMarker = _cursor.getInt(_cursor.getColumnIndex(DatabaseProductHelper.PRODUCT_COMPLETE)); checked[i] = (checkMarker == 1) ? true: false; i = i + 1; } // нужно вернуть указатель курсора в первоначальное положение // перед первой записью, для корректной работы адаптера _cursor.moveToPosition(-1); } @Override public void bindView(View view, Context _context, Cursor _cursor) { String prod_name = _cursor.getString(_cursor.getColumnIndex(DatabaseProductHelper.PRODUCT_NAME)); String prod_count = _cursor.getString(_cursor.getColumnIndex(DatabaseProductHelper.PRODUCT_COUNT)); String prod_type = _cursor.getString(_cursor.getColumnIndex(DatabaseProductHelper.PRODUCT_TYPE)); // эта строка здесь теперь по видимому не нужна, поскольку значения отметок // из курсора мы уже извлекли //int prod_complete = _cursor.getInt(_cursor.getColumnIndex(DatabaseProductHelper.PRODUCT_COMPLETE)); TextView name_prod_tv = (TextView)view.findViewById(R.id.ColMemberID); TextView count_prod_tv = (TextView)view.findViewById(R.id.ColName); TextView type_prod_tv = (TextView)view.findViewById(R.id.count_tv); CheckBox chb = (CheckBox)view.findViewById(R.id.chb_products); chb.setFocusable(false); chb.setClickable(false); name_prod_tv.setText(prod_name); count_prod_tv.setText(prod_count); type_prod_tv.setText(prod_type); // устанавливаем чекбоксы по вспомогательному массиву, а не по курсору // получаем текущую позицию курсора (и соответственно адаптера) через его метод chb.setChecked(checked[_cursor.getPosition()]); } @Override public View newView(Context _context, Cursor _cursor, ViewGroup _parent) { LayoutInflater inflater = (LayoutInflater)_context.getSystemService(_context.LAYOUT_INFLATER_SERVICE); View view = inflater.inflate(layout, _parent, false); return view; } // метод для фиксации изменений отметок чекбоксов из активити public void setChecked(int position){ // инвертируем значение при обработке клика этим методом checked[position] = !checked[position]; } } запись изменений в БД по отметкам чекбоксов у вас, насколько я помню, осуществляется при обработке клика в слушателе списка, поэтому в адаптер это действие не включено, но оно должно обязательно присутствовать, иначе при выходе из списка отметки будут утеряны.

понедельник, 23 декабря 2019 г.

слушатель на checkbox из listview не работает

#java #android #listview #checkbox


Создал listView с собственной разметкой, привязал к SimplApdapter
А в разметке есть checkbox,и мне нужно поставить на него слушатель.Я испробовал все,
не получается.Как решить данную проблему?

ListView listView = (ListView) findViewById(R.id.listView);
list = new ArrayList


Ответы

Ответ 1



Вы не можете просто так повешать слушатели на вложенные в айтемы списка виджеты из активити. Для реализации слушателей такого рода, вам нужно либо создать кастомный адаптер на основе одного из стандартных и в нем при биндинге на айтем (метод getView() адаптера) прикреплять слушатель на вложенные View, либо использовать стандартные возможности системы - режим CHOICE_MODE_MULTIPLE для списка. Кроме того, у вас появится проблема сохранения чекнутости элементов при прокрутке. Подробности реализации вариантов списка с чекбоксами смотрите этот ответ

вторник, 10 декабря 2019 г.

RecyclerView CheckBox

#android #checkbox #adapter #recyclerview


Знаю, что эта тема много раз поднималась для ListView, но ни как не могу разобраться
с ней на примере RecyclerView.

Есть RecyclerView, в котором повторяются CardView. RecyclerView заполняется адаптером.
Когда отмечаю несколько чек-боксов, при скроллинге вниз, некоторые чек-боксы сами становятся
отмеченными. Понял, что нужно описать этот момент в адаптере, но не нашел, где объясняется
как правильно и почему. Подскажите пожалуйста. Вот код адаптера:

public class AddFilterAdapter  extends RecyclerView.Adapter {

    private ArrayList mDataset;

    public static class ViewHolder extends RecyclerView.ViewHolder {
        public TextView mTextView;
        public CheckBox mCheckBox;

        public ViewHolder(View v) {
            super(v);
            mTextView = (TextView) v.findViewById(R.id.tv_filter_card);
            mCheckBox = (CheckBox) v.findViewById(R.id.mcheckBox);

        }
    }

    public AddFilterAdapter(ArrayList dataset) {
        mDataset = dataset;
    }

    @Override
    public AddFilterAdapter.ViewHolder onCreateViewHolder(ViewGroup parent,
                                                         int viewType) {
        View v = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.add_filter_card, parent, false);

        ViewHolder vh = new ViewHolder(v);
        return vh;
    }

    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {

        holder.mTextView.setText(mDataset.get(position));
    }

    @Override
    public int getItemCount() {
        return mDataset.size();
    }
}

    


Ответы

Ответ 1



Дело в том, что айтемы переиспользуются и для корректной работы нужно принудительно сохранять изменения в чекбоксах в отдельное хранилище, а при выводе востанавливать значения из него. Kласс RecyclerView не реализует никаких готовых методов для работы с чекбоксами, поэтому все нужно писать самому. Возможный вариант - завести отдельный массив булевых переменных и сохранять в него текущие состояния чекбоксов. На чекбоксы повешать слушатели, чтобы контролировать изменения состояний. При выводе в адаптере восстанавливать сохраненное ранее состояние. public class AddFilterAdapter extends RecyclerView.Adapter { private ArrayList mDataset; boolean[] checked; public static class ViewHolder extends RecyclerView.ViewHolder { public TextView mTextView; public CheckBox mCheckBox; public ViewHolder(View v) { super(v); mTextView = (TextView) v.findViewById(R.id.tv_filter_card); mCheckBox = (CheckBox) v.findViewById(R.id.mcheckBox); } } public AddFilterAdapter(ArrayList dataset) { mDataset = dataset; checked = new boolean[mDataset.size()]; } @Override public AddFilterAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View v = LayoutInflater.from(parent.getContext()) .inflate(R.layout.add_filter_card, parent, false); ViewHolder vh = new ViewHolder(v); return vh; } @Override public void onBindViewHolder(ViewHolder holder, final int position) { holder.mTextView.setText(mDataset.get(position)); holder.mCheckBox.setChecked(checked[position]); holder.mCheckBox.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { checked[position] = !checked[position]; } }); } public boolean[] getChecked(){ return checked; @Override public int getItemCount() { return mDataset.size(); } } метод getChecked() вернет полученные значения из адаптера "наружу", например в активити, где эти данные можно обработать: // код в активити для получения чекнутых значений. boolean[] checked = filterAdapter.getChecked(); Так же вы можете не заводить отдельный массив, а создать дополнительное поле в своей модели данных и писать сохранение состояния туда, так же оттуда и восстанавливать текущее состояние для вывода. Соответственно и возвращать через геттер коллекцию самих моделей. Это может быть полезно, когда требуется связать данные самой модели и их признак чекнутости.

вторник, 9 июля 2019 г.

Как связать чек бокс со строкой напротив которой он находится

Доброго времени суток! Есть таблица и есть проблема, не могу сообразить как связать чек бокс со строкой напротив которой он находится.Как сделать так чтобы при клике на чек бокс выбиралась эта строка а при нажатии на редактировать, выводилась бы для редактирования
Есть код таблицы:
# Фио клиента Дата Время where ('id', $res['dentist_id']); ?> 1


Ответ

Я бы посоветовал сделать следующее:
Для начала дайте атрибуты value с id записи и класс к примеру checkbox для удобства, но это не обязательно, в своем коде для примера я буду использовать его как селектор. Тегу тоже можете дать класс selected для визуального показа что блок выделен, но это не обязательно. Кнопке Редактировать дайте класс edit-btn или любой другой, но тогда измените JS. И самое главное это JavaScript:
$(function () { //Эта функция отвечает за то, что при клике на чек давать tr class selected или убирать $('table').on('click', '.checkbox', function() { $(this).closest('tr').toggleClass('selected'); });
//Когда вы выбрали чек и нажмете редактировать то будет редирект на странице редактирования $(document).on('click', '.edit-btn', function() { var $checkbox = $('table').find('.checkbox:checked:first'); if ($checkbox.length) { var id = $checkbox.val(); alert('Сейчас будет редирект на редактирование записи с ID:' + id); window.location.replace('/update/' + id); } else { alert('Не выбрана колонка для редактирования'); } }); });
Но есть один недочет, скрипт перед первую колонку где установлен чекбок, если выбирать будете несколько то тут надо или убирать с остальных и оставлять только на одном, или выдавать предупреждение, хотя это не очень, или оставьте как есть.

воскресенье, 30 июня 2019 г.

Динамическое добавление checkbox android

Почему-то добавленный checkbox с помощью этого кода:
RelativeLayout test = (RelativeLayout)findViewById(R.id.testRelative); CheckBox checkbox = new CheckBox(this); checkbox.setText("completed"); RelativeLayout.LayoutParams RL = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT); test.addView(checkbox, RL);
Имеет иной стиль вывода, чем тот, что добавлен в xml файл этого же активити:

Отличаются они только фоном. Первый имеет черный фон (тот CheckBox, что задан динамически), второй имеет стандартный синий цвет (CheckBox с XML файла). Мне необходимо, чтобы они были в одном стиле, какие поправки нужно внести, чтобы это реализовать?


Ответ

Можно сделать так. Сначала создать layout файл "chbTemplate" с чекбоксом:

потом inflate этот layout в ваш CheckBox:
CheckBox myChb = (CheckBox)getLayoutInflater().inflate(R.layout.chbTemplate, null);
Надеюсь, что это поможет.

среда, 5 июня 2019 г.

WPF Interactions CallMethodAction для DataTemplate в ListCheckBox ругается на входные параметры метода во ViewModel

Пытаюсь воспользоваться механизмом поведения, однако не могу правильно прописать аргументы в методе во ViewModel. Использую ListBox состоящий из item включающих в себя CheckBox, собственно перепробовал разные комбинации входных параметров метода, но никак не могу получить объект Item из ListBox при снятии галочки у CheckBox
XAML

C#
public void PropertyUnchecked() { MessageBox.Show("Unchecked"); }
в итоге получаю ошибку:
Thrown: "Could not find method named 'PropertyChecked' on object of type 'CheckedListItem 1' that matches the expected signature."(System.ArgumentException) Exception Message = "Could not find method named 'PropertyChecked' on object of type 'CheckedListItem`1' that matches the expected signature.", Exception Type = "System.ArgumentException", Exception WinRT Data = null
Исходя из сообщения, я посчитал, что метод в коде ViewModel не имеет нужных входных параметров (CheckedListItem именно такие итемы хранятся в ListBox), начал экспериментировать:
[1]
public void PropertyUnchecked(CheckedListItemtr, object sender, RoutedEventArgs e) { MessageBox.Show("Unchecked"); }
[2]
public void PropertyUnchecked(object sender, RoutedEventArgs e) { MessageBox.Show("Unchecked"); }
[3]
public void PropertyUnchecked(object sender) { MessageBox.Show("Unchecked"); }
Также поэкспериментировал с разметкой:

С такой разметкой заработал пустой C# метод, а также [2] и [3], однако ничего кроме CheckBox и его свойств как элемента (в sender) мне не пришло, но нужен именно Item в котором сидит объект типа CheckedListItem . Нашел как реализовать нечто подобное командами с параметрами, но мне нужен именно вызов метода, и обойтись без команд.


Ответ

Я получил ответ на свой вопрос, звучит он так: This is probably what you're looking for:
public void PropertyUnchecked(object sender, RoutedEventArgs e) { var item = ((ContentPresenter)((CheckBox)e.Source).TemplatedParent).Content as CheckedListItem; }
Собственно сам вопрос и ответы доступны по ссылке: Вопрос и ответ

вторник, 21 мая 2019 г.

Как на jquery поставить checked всем checkbox что бы флажок ставился по одному и желательно рандомно

Есть кучка чекбоксов, у каждого есть свой id. Хочу чтобы при загрузке документа загорелись те, которые я хочу. Но что бы не одновременно загорелись, а через допустим 200 миллисекунд, и в рандомном порядке.
Не могу додуматься как это сделать. Сколько не пробовал, либо загораются все сразу, либо вообще не загораются.

$('#sass').prop('checked',true);
Вот так писал. Как задать им очередь не знаю


Ответ

Выбираем все желаемые элементы. Превращаем набор в массив. Перемешиваем используя алгоритм Фишера-Йетса Для каждого элемента массива создаём задержку для изменения чекбокса.
function shuffle(a) { for (var m=a.length; m; ) { var i = Math.random() * m-- | 0; var t = a[i]; a[i] = a[m]; a[m] = t; } return a; } $(function () { var DELAY = 500; var els = shuffle($("#a,#c,#g,#i,#j,#k,#l,#o,#p,#s,#u,#v,#x").toArray()); for (var q=0; q

четверг, 2 мая 2019 г.

Увеличение картинки при нажатии

Необходимо, чтобы при нажатии на картинку(уменьшенную версию) на экране по центру появлялась её увеличенная версия. Проблема в том, что если картинок много и открывается картинка внизу, то по закрытии картинки происходит переход вверх страницы. Как можно это реализовать без перехода. Мне посоветовали использовать checkbox, но я не особо понимаю, как через них делать.
.pictures { -webkit-column-count: 4; -moz-column-count: 4; column-count: 4; -webkit-column-gap: 1em; -moz-column-gap: 1em; column-gap: 1em; margin-bottom: -1em; } a { display: inline-block; } img { display: block; width: 100%; margin-bottom: 1em; } .full { display: none; position: fixed; left: 0; top: 0; right: 0; bottom: 0; padding: 8%; background: #CCC center no-repeat; background: rgba(0, 0, 0, 0.5) center no-repeat; background-size: contain; background-origin: content-box; } .full:target { display: block; }



Ответ

Если для вас принципиально использование CSS и структура разметки будет как в вашем примере, то вместо псевдокласса :target на самом показывающемся блоке можно использовать псевдокласс :focus на ссылке, по которой происходит клик, и делать видимой следующую за ней ссылку, будет выглядеть так:
a:focus + .full { display: block; }
Это устранит скроллирование вверх. Пример на JSFiddle
P.S. Но лучше, по-моему, для полноценных модальных окон использовать JS

суббота, 27 апреля 2019 г.

Android. View элементы меняют дефолтный стиль в зависимости от типа Activity. Как установить единый стиль?

Заметил что при создании различных типов Activity при создании приложения, к ним прикручиваются разные стили для чекбоксов и спиннеров, при создании Активити типа диалог там и вовсе свой стиль у элементов. Где эти стили прописываются в коде и как их на всех типах активити одинаковыми сделать?


Ответ

Стили указываются в манифесте при объявлении активити с помощью атрибута android:theme
В данном манифесте они указаны в теге application и в каждом теге activity
В атрибутах указаны ссылки на ресурс styles
Если в теге activity не указан атрибут android:theme, то берётся родительское значение этого атрибута (т.е. значение android:theme тега application)


Сами описания стилей хранятся в ресурсах (/res/values/styles.xml например)