2012-12-11 2 views
5

나는 Multiselected (checked) listview을 원합니다. 항목을 선택하면 녹색 확인 표시가 나타납니다. 이를 위해 CheckedTextViews을 사용합니다. ListView은 데이터베이스에서 데이터를 가져옵니다. 나는 SimpleCursorAdapter을 사용하고 있습니다. 버튼을 클릭하면 선택한 항목 (ID)이 다음 활동으로 전달됩니다.CheckedTextView가 확인되지 않았습니다.

내 문제는 CheckedTextView의 체크 표시가 나타나지 않는다는 것입니다. 그러나 ID는 다음 활동으로 전달됩니다. 내가 뭘 잘못하고 있니? 그것을 고치는 방법?

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(); 
    } 

답변

3
  1. CheckedTextView의 스타일을 제거하려고하면 스타일의 일부 값이 모양에 영향을 미친다 고 생각합니다.
  2. dataset_ctv_lesson.xml에서 RelativeLayout을 제거하면 클릭 한 항목의 확인 상태를 변경할 필요가 없습니다. ListView는 자체적으로 검사 상태를 유지 관리 할 수 ​​있습니다. ListView.setChoiceMode (ListView.CHOICE_MODE_MULTIPLE)를 사용하여 다중 선택 모드를 활성화하고 ListView.getCheckedItemPositions()을 사용하여 확인 된 행 위치를 가져옵니다.
+1

RelativeLayout을 제거했으며 현재 작동합니다. 고마워. – kaschey

+0

@ user1891764 이유를 이해 하시겠습니까? – faylon

+0

SimpleCursorAdapter에는 레이아웃 파일과 커서 열을 표시해야하는보기가 필요합니다. 레이아웃 파일에는 이러한보기 만 포함되어야합니다. 그게 맞습니까? – kaschey