2012-12-11 10 views
5

Desidero un Multiselected (checked) listview. Quando seleziono un oggetto, deve apparire il segno di spunta verde. Per questo io uso CheckedTextViews. Il ListView riceve i dati dal database. Sto usando un SimpleCursorAdapter per quello. Quando si fa clic sul pulsante, le voci selezionate (ID) verranno passate all'attività successiva.CheckedTextView not checked

Il mio problema è che i segni di spunta di CheckedTextView non vengono visualizzati. Ma gli ID saranno passati alla prossima attività. Cosa sto sbagliando? Come sistemarlo?

selecttest.xml

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" > 

     <Spinner 
     android:id="@+id/spinner_select_language" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_alignParentTop="true" 
     android:layout_centerHorizontal="true" /> 

     <Button 
      style="@style/btn_Font" 
      android:id="@+id/selecttest_start" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:layout_below="@+id/spinner_test" 
      android:onClick="onClick" 
      android:text="@string/selecttest_start" /> 

     <ListView 
      android:id="@+id/lv_lesson" 
      android:layout_width="match_parent" 
      android:layout_height="200dp" 
      android:fadeScrollbars="false" 
      android:choiceMode="multipleChoice" 
      android:layout_alignParentLeft="true" 
      android:cacheColorHint="#00000000" 
      android:layout_below="@+id/selecttest_start" > 
     </ListView> 

</RelativeLayout> 

dataset_ctv_lesson.xml

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" > 

    <CheckedTextView 
     style="@style/tv_Font" 
     android:id="@+id/ctv_lesson" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_alignParentLeft="true" 
     android:layout_alignParentTop="true" 
     android:text="@string/none" 
     android:checkMark="@drawable/ctv_state_checker" 
     /> 

</RelativeLayout> 

ctv_state_checker.xml

<?xml version="1.0" encoding="utf-8"?> 
<selector xmlns:android="http://schemas.android.com/apk/res/android"> 

    <item android:state_checked="false" 
      android:drawable="@drawable/btn_check_buttonless_off" /> 
    <item android:state_checked="true" 
      android:drawable="@drawable/btn_check_buttonless_on" /> 

</selector> 

SelectTestActivity.java

public class SelectTestActivity 
extends Activity 
implements OnItemSelectedListener 
{ 
    Database db; 
    SimpleCursorAdapter adaptercursor, lv_adaptercursor; 
    ListView lv_lesson; 

    // Arraylist for checked item in the lesson view 
    ArrayList<String> checkedlessons = new ArrayList<String>(); 

    @Override 
    protected void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.selecttest); 

     // Create Database 
     db = new Database(this); 

     // Drop-Down-Menu to select a language 
     Spinner spinner_language = (Spinner) findViewById(R.id.spinner_select_language); 
     spinner_language.setOnItemSelectedListener(this); 

     Cursor cursor = db.createListViewCursor(); 

     String[] displaycolumn = new String[]{"language"}; 
     int[] displayview = new int[] {R.id.tv_language}; 

     adaptercursor = new SimpleCursorAdapter(this, R.layout.datasetlanguage, cursor, displaycolumn, displayview, 0); 
     spinner_language.setAdapter(adaptercursor); 

     // ListView to select a lesson 
     lv_lesson = (ListView) findViewById(R.id.lv_lesson); 

     cursor = db.createListViewLessonCursor(getSelectedItemIDFromSpinnerLanguage()); 

     displaycolumn = new String[]{"lesson"}; 
     int[] displayview2 = new int[] {R.id.ctv_lesson}; 

     lv_adaptercursor = new SimpleCursorAdapter(this, R.layout.dataset_ctv_lesson, cursor, displaycolumn, displayview2, 0); 
     lv_lesson.setAdapter(lv_adaptercursor); 

     lv_lesson.setOnItemClickListener(new ListView.OnItemClickListener() 
     { 
      @Override 
      public void onItemClick(AdapterView<?> parent, View view, int position, long id) 
      { 
       if (!checkedlessons.contains(Long.toString(id))) 
       { 
        checkedlessons.add(Long.toString(id)); 

        // checked textview 
        lv_lesson.setItemChecked(position, true); 
       } 
       else 
       { 
        checkedlessons.remove(Long.toString(id)); 

        // unchecked textview 
        lv_lesson.setItemChecked(position, false);  
       } 
      } 
     }); 

     // Close the database 
     db.close(); 
    } 

risposta

3
  1. Prova a rimuovere lo stile di CheckedTextView, penso che alcuni valori nel tuo stile influenzino l'aspetto.
  2. Rimuovere RelativeLayout in dataset_ctv_lesson.xml e non è necessario modificare lo stato di controllo sull'elemento su cui si fa clic. ListView potrebbe mantenere lo stato di controllo da solo. Utilizzare ListView.setChoiceMode (ListView.CHOICE_MODE_MULTIPLE) per abilitare la modalità di selezione multipla e utilizzare ListView.getCheckedItemPositions() per ottenere le posizioni di riga controllate.
+1

Ho rimosso RelativeLayout e ora funziona. Molte grazie. – kaschey

+0

@ user1891764 Capisci il motivo? – faylon

+0

SimpleCursorAdapter richiede un file di layout e visualizzazioni che dovrebbero visualizzare le colonne del cursore. Il file di layout dovrebbe contenere solo queste viste. È giusto? – kaschey

Problemi correlati