I want a Multiselected (checked) listview
. When I select an item then the green check mark must appear. For this I use CheckedTextViews
.
The ListView
gets the data from the database. I'm using a SimpleCursorAdapter
for that.
When you click on the button then the selected entries(IDs) will be passed to the next activity.
My problem is that the check marks of the CheckedTextView
does not appear. But the IDs will be passed to the next activity.
What am I doing wrong? How to fix it?
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();
}
- Try to remove the style of your CheckedTextView, i think some values in your style affect the appearance.
- Remove the RelativeLayout in dataset_ctv_lesson.xml, and you do not need to change the check state on item clicked. ListView could maintain the check state by itself. Use ListView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE) to enable multi-select mode, and use ListView.getCheckedItemPositions() to get the checked row positions.
来源:https://stackoverflow.com/questions/13817177/checkedtextview-not-checked