Форум программистов, компьютерный форум CyberForum.ru

Программирование Android

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 5.00
Critically
10 / 10 / 0
Регистрация: 14.03.2011
Сообщений: 337
#1

ListView getcheckeditempositions перестал работать - Android

04.02.2013, 14:38. Просмотров 1085. Ответов 11
Метки нет (Все метки)

my_list.xml
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
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
 
    <CheckBox
        android:id="@+id/checkbox"
        android:layout_width="wrap_content"
        android:layout_height="fill_parent"
        android:layout_alignParentRight="true"
        android:focusable="false" />
 
    <TextView
        android:id="@+id/text_name"
        android:textSize="20sp"
        android:textStyle="bold"
        android:layout_toLeftOf="@id/checkbox"
        android:layout_alignParentLeft="true"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:textColor="@color/White" />
</RelativeLayout>
SendSms.java
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
 ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
            R.layout.my_list, R.id.text_name, catsarray);
        // присваиваем адаптер списку
        lvMain.setAdapter(adapter); 
        lvMain.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
    }
       
    public void Send(View v){
        lvMain.post(new Runnable(){
        @Override
        public void run() {
            SparseBooleanArray sbArray = lvMain.getCheckedItemPositions();
               checked.clear();
            str="<?xml version=\"1.0\" encoding=\"UTF-8\" ?>" + "<data>"+"<session>"+sessionid+"</session>"+"<groups>";                     
            
            for (int i = 0; i < sbArray.size(); i++) {
              int key = sbArray.keyAt(i);
            if (sbArray.get(key))   //Если элемент выбран
              {   
                  checked.add(dogsarray.get(key));
              }
             }
            
            if (checked.isEmpty()){
                proverka=false;
                  mHandler.post(new Runnable(){
                        public void run() {             
                            ContextThemeWrapper cwx = new ContextThemeWrapper(SendSms.this, R.style.AlertDialogCustom);
                            AlertDialog.Builder ad = new AlertDialog.Builder(cwx);
                            ad.setTitle("Ошибка");
                            ad.setMessage("Выберите хотя бы одну группу!");
                            ad.setPositiveButton("OK", new DialogInterface.OnClickListener() {  
                               public void onClick(DialogInterface dialog, int id) {  
                                 dialog.dismiss();
                            }  
                            });  
                            ad.show();
                        }
                           
                       });
            }
            else {
               proverka=true;
            }
            
            for(int z=0; z<checked.size(); z++){
                 str=str + "<group>"+checked.get(z)+"</group>";                     
                }
            if (proverka==true) {
            Bundle b=new Bundle();
            b.putString("xml", str);
            intent.putExtras(b);        
            startActivity(intent);
            }
           }
        });        
    }   
}
После создания кастомного лейаута для listview без использования checkedtextview... перестал работать выбор айтемов из списка... GetChekedItemPositions вообще не работает как я понял... Так как мой массив checked получается пустой... Может кто подсказать решение проблемы ?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
V0v1k
1158 / 982 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
04.02.2013, 15:14     ListView getcheckeditempositions перестал работать #2
CheckedTextView - Checkable
RelativeLayout - не Checkable
Critically
10 / 10 / 0
Регистрация: 14.03.2011
Сообщений: 337
04.02.2013, 15:36  [ТС]     ListView getcheckeditempositions перестал работать #3
Как тогда проблему решить ?

Добавлено через 6 минут
Я сейчас в интернете сижу читаю, люди свои адаптеры какие то создают... и прочее... А можно как то без этого обойтись ? Как то мой код поменять ?
V0v1k
1158 / 982 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
04.02.2013, 16:02     ListView getcheckeditempositions перестал работать #4
вместо RelativeLayout юзать класс который реализует Checkable.
public class MyRelativeLayout extends RelativeLayout implements Checkable {
...
}
Critically
10 / 10 / 0
Регистрация: 14.03.2011
Сообщений: 337
04.02.2013, 16:52  [ТС]     ListView getcheckeditempositions перестал работать #5
Ну вот нашел в интернете такое:
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
package com.example.itmagic;
 
import android.content.Context;
import android.util.AttributeSet;
import android.widget.Checkable;
import android.widget.RelativeLayout;
 
/**
 * A special variation of RelativeLayout that can be used as a checkable object.
 * This allows it to be used as the top-level view of a list view item, which
 * also supports checking.  Otherwise, it works identically to a RelativeLayout.
 */
public class CheckableRelativeLayout extends RelativeLayout implements Checkable {
    private boolean mChecked;
 
    private static final int[] CHECKED_STATE_SET = {
        android.R.attr.state_checked
    };
 
    public CheckableRelativeLayout(Context context, AttributeSet attrs) {
        super(context, attrs);
    }
 
    @Override
    protected int[] onCreateDrawableState(int extraSpace) {
        final int[] drawableState = super.onCreateDrawableState(extraSpace + 1);
        if (isChecked()) {
            mergeDrawableStates(drawableState, CHECKED_STATE_SET);
        }
        return drawableState;
    }
 
    public void toggle() {
        setChecked(!mChecked);
    }
    
    public boolean isChecked() {
        return mChecked;
    }
 
    public void setChecked(boolean checked) {
        if (mChecked != checked) {
            mChecked = checked;
            refreshDrawableState();
        }
    }
}
Подключил его:
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
<?xml version="1.0" encoding="utf-8"?>
<com.example.itmagic.CheckableRelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
 
    <CheckBox
        android:id="@+id/checkbox"
        android:layout_width="wrap_content"
        android:layout_height="fill_parent"
        android:layout_alignParentRight="true"
        android:focusable="false" />
 
    <TextView
        android:id="@+id/text_name"
        android:textSize="20sp"
        android:textStyle="bold"
        android:layout_toLeftOf="@id/checkbox"
        android:layout_alignParentLeft="true"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:textColor="@color/White" />
</com.example.itmagic.CheckableRelativeLayout>
Теперь возник вопрос... Я когда нажимаю на слова в listview то тогда у меня срабатывает программа, а вот когда я тыкаю на чекбоксы она не работает...
V0v1k
1158 / 982 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
04.02.2013, 17:16     ListView getcheckeditempositions перестал работать #6
ну правильно, чекается чекбокс а не ваш айтем, а лист проверяет айтем.
сделайте чтобы чекбокс не ловил ивенты, ловите клик по айтему и сами чекайте чекбоксы. на мой взгляд это самый лучший вариант.
Critically
10 / 10 / 0
Регистрация: 14.03.2011
Сообщений: 337
04.02.2013, 17:29  [ТС]     ListView getcheckeditempositions перестал работать #7
Вас не затруднит кодом помоч ? Я просто сам такое никогда не напишу, да и не совсем понимаю про что идет реч...
V0v1k
1158 / 982 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
04.02.2013, 18:46     ListView getcheckeditempositions перестал работать #8
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
.....
checkBox.setOnTouchListener(new OnTouchListener() {
            
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                return false;
            }
        });
..... 
public void setChecked(boolean checked) {
        if (mChecked != checked) {
            mChecked = checked;
            checkBox.setChecked(checked);
            refreshDrawableState();
        }
    }
.....
примерно так...
Critically
10 / 10 / 0
Регистрация: 14.03.2011
Сообщений: 337
04.02.2013, 20:11  [ТС]     ListView getcheckeditempositions перестал работать #9
Это нужно в классе "CheckableRelativeLayout" прописать так ?

Добавлено через 21 минуту
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
package com.example.itmagic;
 
import android.content.Context;
import android.util.AttributeSet;
import android.widget.Checkable;
import android.widget.RelativeLayout;
 
/**
 * A special variation of RelativeLayout that can be used as a checkable object.
 * This allows it to be used as the top-level view of a list view item, which
 * also supports checking.  Otherwise, it works identically to a RelativeLayout.
 */
public class CheckableRelativeLayout extends RelativeLayout implements Checkable {
    private boolean mChecked;
    CheckBox box; <-------------------------------------------- Вписал
    private static final int[] CHECKED_STATE_SET = {
        android.R.attr.state_checked
    };
 
    public CheckableRelativeLayout(Context context, AttributeSet attrs) {
        super(context, attrs);
    }
 
    @Override
    protected int[] onCreateDrawableState(int extraSpace) {
        final int[] drawableState = super.onCreateDrawableState(extraSpace + 1);
        if (isChecked()) {
            mergeDrawableStates(drawableState, CHECKED_STATE_SET);
        }
        return drawableState;
    }
 
    public void toggle() {
        setChecked(!mChecked);
    }
    
    public boolean isChecked() {
        return mChecked;
    }
 
    public void setChecked(boolean checked) {
        if (mChecked != checked) {
            mChecked = checked;
            box.setChecked(checked); <-------------- Вписал
            refreshDrawableState();
        }
    }
}
А куда прикрутить SetonTouchlistener ума не приложу... все уже перетыкал... постоянно ошибки всякие...

Добавлено через 24 минуты
Вообщем смотрите что получилось сделать...
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public void setChecked(boolean checked) {
        box=(CheckBox)findViewById(R.id.checkbox); <------ Чекбокс с моего xml-листвью
        
        box.setOnTouchListener(new OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                // TODO Auto-generated method stub
                return false;
            }
        });
       
        if (mChecked != checked) {
            mChecked = checked;
            box.setChecked(checked); <-------- Когда кликаем на айтеме, отмечается его чекбокс....
            refreshDrawableState();
        }
1) А как можно сделать, что бы по чекбоксу вообще отдельно кликать нельзя было ? тоесть если даже кликнешь он не выделится ?
2) или же как сделать так что бы при клике по чекбоксу он отмечался но и так же отмечался айтем напротив которого он стоит ?
V0v1k
1158 / 982 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
04.02.2013, 21:17     ListView getcheckeditempositions перестал работать #10
Цитата Сообщение от Critically Посмотреть сообщение
или же как сделать так что бы при клике по чекбоксу он отмечался но и так же отмечался айтем напротив которого он стоит ?
так, как я написал.
Critically
10 / 10 / 0
Регистрация: 14.03.2011
Сообщений: 337
04.02.2013, 21:45  [ТС]     ListView getcheckeditempositions перестал работать #11
Все работает... Надо было лишь прописать в xml-ке для чекбокса:
Java
1
2
android:clickable="False"; 
android:focusable="False";
Но все равно я не понял одного, зачем надо было делать прослушку для чекбокса ?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.02.2013, 22:38     ListView getcheckeditempositions перестал работать
Еще ссылки по теме:

Глючит ListView Android
Альтернатива ListView Android
Android Android studio перестал видеть телефон
Android IntelliJ IDEA перестал запускать Debug
Перестал открываться сайт в webView Android

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

Или воспользуйтесь поиском по форуму:
V0v1k
1158 / 982 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
04.02.2013, 22:38     ListView getcheckeditempositions перестал работать #12
вы правы, так проще)
Yandex
Объявления
04.02.2013, 22:38     ListView getcheckeditempositions перестал работать
Ответ Создать тему
Опции темы

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