Comment puis-je changer la couleur d'arrière-plan pour une ligne spécifique correctement dans un ListView? (Android)

J'ai passé quelques jours à essayer de résoudre un problème que j'ai avec les ListViews sur Android. Je tiens à mettre en œuvre une seule zone de liste à sélection à l'aide d'une ListView. Donc, je voudrais avoir une seule ligne avec une lumière prédéfini couleur d'arrière-plan et le reste avec une autre couleurs présélectionnées. Le problème que j'ai c'est que quand je clique sur une ligne spécifique est une autre ligne qui est mis en évidence et non pas le seul, j'ai appuyé sur. J'ai ajouté plusieurs messages de Journal de ce qui se passe, mais tout semble bien fonctionner. Voici mon code:

public class TryListViewActivity extends Activity {
protected static final int NO_SELECTED_COLOR = 0xFF191919;
protected static final int SELECTED_COLOR = 0xFF3366CC;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ListView listView = new ListView(this);
ArrayList<String> list = new ArrayList<String>();
list.add("Option 1");
list.add("Option 2");
list.add("Option 3");
list.add("Option 4");
list.add("Option 5");
list.add("Option 6");
list.add("Option 7");
list.add("Option 8");
list.add("Option 9");
list.add("Option 10");
list.add("Option 11");
list.add("Option 12");
list.add("Option 13");
list.add("Option 14");
list.add("Option 15");
ArrayAdapter<String> listAdapter = new ArrayAdapter<String>(
this,
R.layout.list_box_entry,
list
);
listView.setAdapter(listAdapter);
listView.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
//Set the listener
listView.setOnItemClickListener(
new AdapterView.OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
Log.i(
"Log",
"[SingleSelectionListBox] Item clicked: position="
+ position + ";id=" + id
);
//First, set all rows to be unselected
int counter  = parent.getCount();
Log.i(
"Log",
"[SingleSelectionListBox] "
+ counter + " items found inside the parent"
);
int children = parent.getChildCount();
Log.i(
"Log",
"[SingleSelectionListBox] "
+ children + " views found inside the parent"
);
for(int i=0;i<children;i++) {
Log.i(
"Log",
"[SingleSelectionListBox] Child "
+ i + " has message "
+ ((TextView)parent.getChildAt(i)).getText()
);
}
//Too inefficient but for now is OK
for(int i=0;i<children;i++)
parent.getChildAt(i)
.setBackgroundColor(NO_SELECTED_COLOR);
Log.i("Log",
"[SingleSelectionListBox] First visible position: "
+ parent.getFirstVisiblePosition()
);
//Set the background color
TextView textView = (TextView)(parent.getChildAt(
position-parent.getFirstVisiblePosition()));
textView.setBackgroundColor(SELECTED_COLOR);
Log.i(
"Log",
"[SingleSelectionListBox] Text inside the "
+ " View changing the color " + textView.getText()
);
}
}
);
setContentView(listView);
}
}

À l'intérieur de la ressources (res/layout), j'ai inséré un fichier appelé list_text_entry.xml avec le contenu suivant

<TextView xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent"
android:layout_height="fill_parent" android:gravity="center"
android:textColor="#FFFFFF" android:padding="10dp" android:textSize="16sp">
</TextView>

Par exemple, Si je clique sur l'Option "11" entrée lorsque la liste a été précédemment fait défiler vers le bas jusqu'à ce que la première ligne que je vois est "Option 4", "Option 7" de ligne sélectionné apparaît comme étant le seul à être porteur d'une couleur bleu en arrière-plan. Quelqu'un peut m'expliquer ce qui se passe ici pour moi? Je poste ci-dessous les messages que j'ai reçu de jeter le Journal.

[SingleSelectionListBox] Item clicked: position=10;id=10
[SingleSelectionListBox] 15 items found inside the parent
[SingleSelectionListBox] 11 views found inside the parent
[SingleSelectionListBox] Child 0 has message Option 4
[SingleSelectionListBox] Child 1 has message Option 5
[SingleSelectionListBox] Child 2 has message Option 6
[SingleSelectionListBox] Child 3 has message Option 7
[SingleSelectionListBox] Child 4 has message Option 8
[SingleSelectionListBox] Child 5 has message Option 9
[SingleSelectionListBox] Child 6 has message Option 10
[SingleSelectionListBox] Child 7 has message Option 11
[SingleSelectionListBox] Child 8 has message Option 12
[SingleSelectionListBox] Child 9 has message Option 13
[SingleSelectionListBox] Child 10 has message Option 14
[SingleSelectionListBox] First visible position: 3
[SingleSelectionListBox] Text inside the View changing the color Option 11

Que je peux deviner tous les enfants à l'intérieur de la ViewGroup ordonnés de haut en bas et même quand je fais cela dans le code:

TextView textView = (TextView)(parent.getChildAt(
position-parent.getFirstVisiblePosition()
));
textView.setBackgroundColor(SELECTED_COLOR);

Apparaît le message Option 11 mais c'est vraiment le option 7 sélectionné. Est-ce un bug d'Android?

La prochaine fois, merci d'utiliser quatre espaces de code de balisage au lieu d'utiliser des balises HTML. Voir le Markdown Édition Aider pour plus de détails.

OriginalL'auteur Charlie | 2011-01-08