J'ai une ListActivity avec un adaptateur de tableau déclaré comme arrayAdapter = new ArrayAdapter<String> (this, android.R.layout.simple_list_item_checked);
Cela montre un groupe de lignes avec des coches à l'extrême droite. Pouvez-vous me dire comment obtenir une référence à ces coches ou comment les cocher/décocher?Comment activer les coches dans l'activité de la liste?
Répondre
Le plus proche que je peux faire est de changer la coche après une cellule est cliqué en utilisant:
@Override
protected void onListItemClick(ListView l, View v, int position, long id)
{
CheckedTextView textView = (CheckedTextView)l.getChildAt(position);
text.setChecked(!textView.isChecked());
super.onListItemClick (l, v, position, id);
}
Je voudrais encore pouvoir définir les coches sans que l'utilisateur de toucher les cellules.
CheckedTextView lui-même gère la case à cocher. Il est passé en tant que second argument (View v) dans le gestionnaire onListItemClick. Ainsi, vous pouvez simplifier votre code comme suit:
@Override
protected void onListItemClick(ListView l, View v, int position, long id)
{
CheckedTextView textView = (CheckedTextView)v;
textView.setChecked(!textView.isChecked());
}
J'ai eu un problème similaire et essayé les solutions fournies ici mais j'avais encore beaucoup de problèmes. Je voulais juste avoir une liste avec des "cas de test" sélectionnables et deux boutons "sélectionner tous les tests" et "exécuter les tests sélectionnés" (donc je ne voulais pas avoir juste une ListActivity). Comme mentionné par « JDC » getChildAt (et GetChildCount) se référer à la actuellement affichée articles mais ma liste n'a pas affiché à l'écran et donc je ne pouvais pas l'utiliser pour sélectionner tous éléments de liste. En outre si j'ai utilisé setChecked du CheckedTextView J'ai eu le problème que la sélection a disparu dès que j'ai fait défiler la liste. Ma solution est le code ci-dessous qui résout ces problèmes en utilisant getCount et setItemChecked du ListView (voir aussi les commentaires dans le code source). En outre, il montre comment récupérer les éléments cochés.
package com.example.test;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.util.SparseBooleanArray;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.CheckedTextView;
import android.widget.ListView;
public class TestActivity extends Activity {
static final String[] names = new String[] { "Test 1", "Test 2", "Test 3", "Test 4", "Test 5", "Test 6", "Test 7", "Test 8", "Test 9", "Test 10"};
ListView list;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// Create an ArrayAdapter, that will actually make the Strings above
// appear in the ListView
list = (ListView)findViewById(R.id.listOfTests);
list.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_multiple_choice, names));
}
// This does not work.
// 1st: it checks only the displayed items
// 2nd: as soon as you scroll the list the selections are undone
//
// public void onRunAllTestsClick (View view) {
// int count = list.getChildCount();
// for (int i = 0; i < count; i++)
// ((CheckedTextView)list.getChildAt(i)).setChecked(true);
// }
// This is the solution
// 1st: getCount deliveres the count of all list items (even if they are not displayed)
// 2nd: calling setItemChecked on the ListView ensures that the ListView "knows" that the item is checked and does not destroy it if you scroll the list
public void onRunAllTestsClick (View view) {
int count = list.getCount();
for (int i = 0; i < count; i++)
list.setItemChecked(i, true);
}
public void onRunSelectedTestsClick (View view) {
SparseBooleanArray resultArray = list.getCheckedItemPositions();
int size = resultArray.size();
for (int i = 0; i < size; i++)
if (resultArray.valueAt(i))
Log.i("CodecTestActivity", list.getAdapter().getItem(resultArray.keyAt(i)).toString());
}
}
Voici également la mise en page appropriée (main.xml):
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<LinearLayout android:layout_height="wrap_content" android:layout_width="match_parent" android:id="@+id/linearLayout1">
<Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:onClick="onRunSelectedTestsClick" android:id="@+id/RunSelectedTestsClick" android:text="@string/runselectedtests"></Button>
<Button android:text="@string/runalltests" android:layout_width="wrap_content" android:layout_height="wrap_content" android:onClick="onRunAllTestsClick" android:id="@+id/RunAllTests"></Button>
</LinearLayout>
<ListView android:layout_height="wrap_content" android:layout_width="match_parent" android:id="@+id/listOfTests" android:choiceMode="multipleChoice"></ListView>
</LinearLayout>
Notez qu'il est probablement plus logique d'utiliser 'l.setItemChecked (! Position l.isItemChecked (position)); 'si vos vues de liste étendent' Checkable'! (Ce qu'ils font pour android.R.layout.simple_list_item_checked.) Si vous ne vérifiez que le CheckedTextView, il ne mettra pas à jour les données sous-jacentes, par ex. isItemChecked() ne changera pas. – Maarten