2012-12-11 6 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

関連する問題