Changer la couleur de fond des éléments ListView sur Android
Comment puis-je changer la couleur de fond de ListView
articles sur une base par article. Lorsque j'utilise android:backgroundColor
dans la disposition de l'article ListView
, je peux y arriver, mais le sélecteur de liste n'est plus visible. Je peux rendre le sélecteur à nouveau visible en réglant drawSelectorOnTop
sur true, mais ensuite le sélecteur superpose tout l'article.
des idées pour changer les couleurs de fond et garder le sélecteur?
PS je préfère ne pas modifier le sélecteur de lui-même.
EDIT: les auteurs de L'application GMail ont réussi à réaliser exactement cela donc c'est certainement possible.
17 réponses
vous devez créer un dessin d'état différent pour chaque couleur que vous voulez utiliser.
par exemple: list_selector_read.xml
et list_selector_unread.xml
.
Tout ce que vous devez faire est de tout mettre à transparent, sauf l'article android:state_window_focused="false"
.
ensuite, lorsque vous dressez votre liste, vous appelez setBackgroundResource(R.drawable.list_selector_unread/read)
pour chaque ligne.
vous ne définissez pas de listSelector sur ListView. Pour maintenir la sélecteur par défaut pour votre saveur particulière D'Android.
il s'agit d'une modification basée sur le code ci-dessus, un code le plus simple:
private static int save = -1;
public void onListItemClick(ListView parent, View v, int position, long id) {
parent.getChildAt(position).setBackgroundColor(Color.BLUE);
if (save != -1 && save != position){
parent.getChildAt(save).setBackgroundColor(Color.BLACK);
}
save = position;
}
j'espère que vous le trouverez utile
salutations!
Ok, je l'ai fait fonctionner comme ça:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="false" android:drawable="@color/BackgroundColor" />
<item android:drawable="@color/transparent" />
</selector>
YMMV!
personne ne semblait fournir d'exemples de faire cela uniquement en utilisant un adaptateur, donc j'ai pensé que je voudrais poster mon code snippet pour afficher des ListViews où l'élément "curSelected" a un arrière-plan différent:
final ListView lv = (ListView)findViewById(R.id.lv);
lv.setAdapter(new BaseAdapter()
{
public View getView(int position, View convertView, ViewGroup parent)
{
if (convertView == null)
{
convertView = new TextView(ListHighlightTestActivity.this);
convertView.setPadding(10, 10, 10, 10);
((TextView)convertView).setTextColor(Color.WHITE);
}
convertView.setBackgroundColor((position == curSelected) ?
Color.argb(0x80, 0x20, 0xa0, 0x40) : Color.argb(0, 0, 0, 0));
((TextView)convertView).setText((String)getItem(position));
return convertView;
}
public long getItemId(int position)
{
return position;
}
public Object getItem(int position)
{
return "item " + position;
}
public int getCount()
{
return 20;
}
});
cela a toujours été une approche utile pour moi lorsque l'apparence des éléments de la liste doit changer dynamiquement.
mAgendaListView.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
//view.setBackgroundColor(Color.RED);
for(int i=0; i<parent.getChildCount(); i++)
{
if(i == position)
{
parent.getChildAt(i).setBackgroundColor(Color.BLUE);
}
else
{
parent.getChildAt(i).setBackgroundColor(Color.BLACK);
}
}
du code source de Android 2.2 Email App:
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_window_focused="false" android:state_selected="true"
android:drawable="@android:color/transparent" />
<item android:state_selected="true"
android:drawable="@android:color/transparent" />
<item android:state_pressed="true" android:state_selected="false"
android:drawable="@android:color/transparent" />
<item android:state_selected="false"
android:drawable="@color/message_item_read" />
</selector>
rien de plus à dire...
la façon la plus simple est celle-ci. À l'intérieur de votre ListArrayAdapter faites juste ceci
if(your condition here) rowView.setBackgroundColor(Color.parseColor("#20FFFFFF"));
ne pas trop compliquer
code Simple pour changer tout dans la disposition de l'article (listview personnalisé étend baseadapter):
lv.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
long arg3) {
RelativeLayout layout=(RelativeLayout) arg1.findViewById(R.id.rel_cell_left);
layout.setBackgroundColor(Color.YELLOW);
}
});
vouliez-vous changer la couleur de fond des listitems personnalisés lorsque vous cliquez dessus?
si oui:
il vous suffit d'ajouter le code suivant à votre mise en page listview en xml.
android: drawSelectorOnTop= " true" android: listSelector= "@android:drawable/list_selector_background "
le sélecteur de liste utilise ici sélecteur par défaut qui dispose d'un gris foncé couleur. Vous pouvez faire votre propre dessinable et l'assigner au sélecteur de liste comme ci-dessus.
J'espère que c'est ce que vous vouliez.
suivre la voie très lentement dans la course
mAgendaListView.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
//view.setBackgroundColor(Color.RED);
for(int i=0; i<parent.getChildCount(); i++)
{
if(i == position)
{
parent.getChildAt(i).setBackgroundColor(Color.BLUE);
}
else
{
parent.getChildAt(i).setBackgroundColor(Color.BLACK);
}
}
remplacé par le texte suivant
int pos = 0;
int save = -1;
@Override
public void onItemClick(AdapterView<?> parent, View view, int position,
long id) {
//Always set the item clicked blue background
view.setBackgroundColor(Color.BLUE);
if (pos == 0) {
if (save != -1) {
parent.getChildAt(save).setBackgroundColor(Color.BLACK);
}
save = position;
pos++;
Log.d("Pos = 0", "Running");
} else {
parent.getChildAt(save).setBackgroundColor(Color.BLACK);
save = position;
pos = 0;
Log.d("Pos # 0", "Running");
}
regardez List14 exemple . Dans getView()
vous pouvez appeler convertView.setBackgroundDrawable()
pour chaque entrée. Vous pouvez avoir un comptoir de membre de classe pour décider avec quel fond l'appeler pour obtenir des fonds alternatifs, par exemple.
Dans la vue liste, vous pouvez l'ajouter android: listselector=nom de couleur que vous voulez.
ce travail très bien dans mon application.
le meilleur tutoriel sur ce peut être trouvé ici .
sections clés:
- appelez sûrement
view.setSelected(true)
dansonItemClick
, sinon vous ne pouvez pas voir l'article sélectionné background - préservez l'ordre des États dans votre sélecteur sinon vous verrez un comportement imprévisible dans les couleurs de fond (
state_selected
suivi destate_pressed
)
en changeant le code de Francisco Cabezas, j'ai eu le suivant:
private int selectedRow = -1;
...
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
parent.getChildAt(position).setBackgroundResource(R.color.orange);
if (selectedRow != -1 && selectedRow != position) {
parent.getChildAt(selectedRow).setBackgroundResource(R.color.black);
}
selectedRow = position;
si le setBackgroundColor
est ajouté pour l'événement onItemClick, il ne fonctionnera pas à moins que vous ne le mettiez après l'événement click.
essayez d'ajouter le code de débogage dans la méthode getView
de l'adaptateur, vous verrez que getView sera appelé de nouveau chaque fois que vous cliquez sur l'écran. Ainsi, après avoir réglé la couleur de fond, le système redessinera l'écran avec le réglage original. Je ne sais pas pourquoi il gaspille des ressources pour reconstruire l'écran chaque fois qu'il est cliqué, il y a déjà une autre façon que nous pouvons aviser le système de redessiner l'écran lorsque nécessaire.
peut-être que vous pouvez ajouter un drapeau de contrôle pour déterminer la couleur de fond pour une ligne individuelle, puis modifier la méthode getView pour définir la couleur en fonction de ce drapeau de contrôle. Ainsi, la couleur de fond sera changée quand il redessine l'écran.
je cherche aussi une solution officielle.
j'ai essayé toutes les réponses ci-dessus .. aucun n'a fonctionné pour moi .. c'est ce qui a finalement fonctionné et qui est utilisé dans mon application .. il fournira des couleurs d'éléments de liste en lecture/non lus tout en maintenant les styles listselector pour les deux états :
<ListView
android:id="@+id/list"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:listSelector="@drawable/selectable_item_background_general"
android:drawSelectorOnTop="true"
android:fadingEdge="none"
android:scrollbarStyle="outsideOverlay"
android:choiceMode="singleChoice" />
selectable_item_background_ General.xml:
<selector xmlns:android="http://schemas.android.com/apk/res/android" android:exitFadeDuration="@android:integer/config_mediumAnimTime">
<item android:state_pressed="false" android:state_focused="true" android:drawable="@drawable/bg_item_selected_drawable" />
<item android:state_pressed="true" android:drawable="@drawable/bg_item_selected_drawable" />
<item android:drawable="@android:color/transparent" />
</selector>
bg_item_selected_drawable.xml:
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="#12000000" />
</shape>
notification_list_itemlayout.xml:
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/rowItemContainer"
android:layout_width="fill_parent"
android:layout_height="wrap_content">
<RelativeLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:padding="8dp"
android:paddingLeft="16dp"
android:paddingStart="16dp"
android:paddingRight="16dp"
android:paddingEnd="16dp">
<ImageView
android:id="@+id/imgViewIcon"
android:layout_width="60dp"
android:layout_height="60dp"
android:src="@drawable/cura_logo_symbol_small"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_marginRight="8dp"
android:layout_marginEnd="8dp" />
<TextView
android:id="@+id/tvNotificationText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignTop="@+id/imgViewIcon"
android:layout_toRightOf="@+id/imgViewIcon"
android:layout_toEndOf="@+id/imgViewIcon"
android:textSize="@dimen/subtitle"
android:textStyle="normal" />
<TextView
android:id="@+id/tvNotificationTime"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginTop="1dip"
android:layout_below="@+id/tvNotificationText"
android:layout_toRightOf="@+id/imgViewIcon"
android:layout_toEndOf="@+id/imgViewIcon"
android:textSize="@dimen/subtitle" />
</RelativeLayout>
</RelativeLayout>
enfin, dans votre adaptateur:
if (!Model.Read)
rowItemContainer.SetBackgroundColor (Android.Graphics.Color.ParseColor ("#FFFDD0")); // unread color
else
rowItemContainer.SetBackgroundColor (Android.Graphics.Color.White); // read color
vous pouvez le faire.
final List<String> fruits_list = new ArrayList<String>(Arrays.asList(fruits));
// Create an ArrayAdapter from List
final ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>
(this, android.R.layout.simple_list_item_1, fruits_list){
@Override
public View getView(int position, View convertView, ViewGroup parent){
// Get the current item from ListView
View view = super.getView(position,convertView,parent);
if(position %2 == 1)
{
// Set a background color for ListView regular row/item
view.setBackgroundColor(Color.parseColor("#FFB6B546"));
}
else
{
// Set the background color for alternate row/item
view.setBackgroundColor(Color.parseColor("#FFCCCB4C"));
}
return view;
}
};
// DataBind ListView with items from ArrayAdapter
lv.setAdapter(arrayAdapter);
}
}