2013-09-26 13 views
0

Я пытаюсь установить проверенное состояние моего флажка в ListView, вот код:Почему мой пользовательский флажок в ListView не может быть проверен

mShalatAdapter = new ArrayAdapter<String>(getActivity(),R.layout.pengaturan_list_item, R.id.label_shalat, waktuShalat); 

mListShalat = (ListView) v.findViewById(R.id.pengaturan_checkbox); 
mListShalat.setAdapter(mShalatAdapter); 

CheckBox cb; 
TextView txv; 
for (int i = 0; i < mListShalat.getCount(); i++) { 
    View vListSortOrder = mListShalat.getAdapter().getView(i, null, null); 
    txv = (TextView) vListSortOrder.findViewById(R.id.label_shalat); 
    cb = (CheckBox) vListSortOrder.findViewById(R.id.status_shalat); 

    String labelShalat = txv.getText().toString(); 
    Toast.makeText(getActivity(), labelShalat, Toast.LENGTH_SHORT).show(); 
    if (cb.isChecked() == false) { 
     cb.setChecked(true); 
    } 
} 

И это мое pengaturan_list_item.xml расположения:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:gravity="center_vertical|center_horizontal" 
    android:orientation="horizontal" 
    android:paddingBottom="5dp" 
    android:paddingTop="5dp" > 

    <TextView 
     android:id="@+id/label_shalat" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:layout_weight="1" 
     android:paddingLeft="10dp" 
     android:text="Label Ibadah" 
     android:textColor="@android:color/white" 
     android:textSize="20dp" /> 

    <CheckBox 
     android:id="@+id/status_shalat" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:button="@drawable/ibadah_checkbox_list" 
     android:visibility="visible" /> 

</LinearLayout> 

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

мой ibadah_checkbox_list.xml:

<?xml version="1.0" encoding="utf-8"?> 
<selector xmlns:android="http://schemas.android.com/apk/res/android" > 
    <item android:state_checked="true" 
     android:drawable="@drawable/checkbox_ibadah_checked" /> 
    <item android:state_checked="false" 
     android:drawable="@drawable/checkbox_ibadah_unchecked" /> 
</selector> 
+0

пожалуйста, напишите idadah_checkbox_list Drawable XML (я предполагаю, что это XML) –

+0

@GilMoshayof нормально, проверьте – andrefadila

ответ

0

Это может быть стоит изменять способ ваш адаптер работает.

Вместо того, чтобы создавать кластер ArrayAdapter, попробуйте наследовать его, а затем раздуйте представления из list_item.xml внутри метода getView().

После этого вы можете извлечь флажок из представления, как вы делаете в цикле &, чтобы установить его значение в соответствии с тем, что вам нужно. Это стандартный способ делать такие вещи.

Мое предположение, почему то, что вы делаете, не работает, так это то, что ArrayAdapter создает представления, когда ему нужно их отображать, а не в этом цикле, который вы используете, поэтому пока он генерирует и дает вам представление в то время как вы запрашиваете их, эти представления необязательно будут отображаться.

Вот как я бы это сделать:

public class MyArrayAdapter extends ArrayAdapter<String> 
    { 
     public MyArrayAdapter(Context context, int textViewResourceId, List<String> objects) 
     { 
      super(context, textViewResourceId, objects); 
     } 

     public View getView(int position, View convertView, ViewGroup parent) 
     { 
      View v = convertView; 

      if(v == null) 
      { 
       LayoutInflater vi = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
       v = vi.inflate(R.layout.pengaturan_list_item, null); 
      } 

      TextView tv = (TextView)v.findViewById(R.id.label_shalat); 
      CheckBox cb = (CheckBox)v.findViewById(R.id.status_shalat); 

      tv.setText(getItem(position)); 

      if (!cb.isChecked()) 
       cb.setChecked(true); 

      return v; 
     } 
    } 

Затем установите адаптер, как это (objectList вашего список строк для меток):

mShalatAdapter = new MyArrayAdapter(this, R.layout.pengaturan_list_item, objectList); 
mListShalat = (ListView) v.findViewById(R.id.pengaturan_checkbox); 
mListShalat.setAdapter(mShalatAdapter); 

Надеется, что это помогает :)

+0

спасибо Gil, это это последнее, что я хочу сделать – andrefadila

0

Я думаю, проблема в том, что в вашем макете. Ваш TextView имеет номер layout_width из match_parent и в нем он охватывает CheckBox и заполняет всю ширину. Поэтому вам нужно правильно разделить макет.

Пробуйте макет ниже и скажите мне эффект.

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:gravity="center_vertical|center_horizontal" 
    android:orientation="horizontal" 
    android:paddingBottom="5dp" 
    android:weightSum="2" 
    android:paddingTop="5dp" > 

    <TextView 
     android:id="@+id/label_shalat" 
     android:layout_width="0dp" 
     android:layout_height="wrap_content" 
     android:layout_weight="1" 
     android:paddingLeft="10dp" 
     android:text="Label Ibadah" 
     android:textColor="@android:color/white" 
     android:background="@android:color/black" 
     android:textSize="20dp" /> 

    <CheckBox 
     android:id="@+id/status_shalat" 
     android:layout_width="0dp" 
     android:layout_height="wrap_content" 
     android:layout_weight="1" 
     android:button="@drawable/ibadah_checkbox_list" 
     android:visibility="visible" /> 
</LinearLayout> 
0

Добавить android:descendantFocusability="blocksDescendants" в вашем ListView.Hope он работает ....

Смежные вопросы