CheckedTextView未选中

时间:2012-12-11 09:25:23

标签: android listview simplecursoradapter checkedtextview

我想要Multiselected (checked) listview。当我选择一个项目时,必须出现绿色复选标记。为此我使用CheckedTextViewsListView从数据库中获取数据。我正在使用SimpleCursorAdapter。 单击按钮后,所选条目(ID)将传递给下一个活动。

我的问题是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();
    }

1 个答案:

答案 0 :(得分:3)

  1. 尝试删除CheckedTextView的样式,我认为您的样式中的某些值会影响外观。
  2. 删除dataset_ctv_lesson.xml中的RelativeLayout,您无需更改单击项目的检查状态。 ListView可以自己维护检查状态。使用ListView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE)启用多选模式,并使用ListView.getCheckedItemPositions()获取选中的行位置。