Comment puis-je changer la couleur de fond des articles ListView
pour chaque article? Lorsque j'utilise Android:backgroundColor
dans la disposition de l'article ListView
, je peux y parvenir, mais le sélecteur de liste n'est plus visible. Je peux rendre le sélecteur à nouveau visible en définissant drawSelectorOnTop
sur true, mais le sélecteur recouvre alors l'élément entier.
Des idées comment changer ces couleurs de fond et garder le sélecteur?
PS je préférerais ne pas changer le sélecteur lui-même.
EDIT: Les auteurs d’applications GMail ont réussi à réaliser exactement cela, c’est donc tout à fait possible.
Vous devez créer un état différent pouvant être dessiné pour chaque couleur que vous souhaitez utiliser.
Par exemple: list_selector_read.xml
et list_selector_unread.xml
.
Tout ce que vous avez à faire est de tout définir sur transparent, à l'exception de l'élément Android:state_window_focused="false"
.
Ensuite, lorsque vous dessinez votre liste, appelez setBackgroundResource(R.drawable.list_selector_unread/read)
pour chaque ligne.
Vous ne définissez pas du tout un listSelector sur ListView. Cela maintiendra le sélecteur par défaut pour votre saveur particulière d’Android.
Ceci est 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 tu trouves cela utile
salutations!
Ok, je dois le faire 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 de tels exemples uniquement à l'aide d'un adaptateur. J'ai donc pensé envoyer mon extrait de code pour afficher 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 liste doit changer de manière dynamique.
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);
}
}
le moyen le plus simple est le suivant. Dans votre ListArrayAdapter, faites simplement ceci
if(your condition here) rowView.setBackgroundColor(Color.parseColor("#20FFFFFF"));
ne pas trop compliquer
Depuis le code source de Application Android 2.2 Email:
<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 d'autre à dire...
Code simple pour tout changer dans la présentation de l'élément (la liste de diffusion personnalisée étend le gestionnaire de base)
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 d'arrière-plan des éléments de liste personnalisés lorsque vous cliquez dessus?
Si c'est le cas:
Vous venez d'ajouter le code suivant à votre présentation listview en xml.
Android: drawSelectorOnTop = "true" Android: listSelector = "@ Android: drawable/list_selector_background"
Le sélecteur de liste utilise ici le sélecteur par défaut qui a une couleur gris foncé . Vous pouvez créer votre propre dessin et l'assigner au sélecteur de liste comme ci-dessus.
J'espère que c'est ce que tu voulais.
Suivre le chemin 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 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");
}
Jetez un oeil à Exemple de la liste14 . Dans getView()
, vous pouvez appeler convertView.setBackgroundDrawable()
pour chaque entrée. Vous pouvez avoir un compteur de classe pour décider par.
Le meilleur tutoriel sur ceci peut être trouvé ici .
Sections clés:
view.setSelected(true)
dans onItemClick
, sinon vous ne pouvez pas voir l’arrière-plan de l’élément sélectionnéstate_selected
suivi de state_pressed
).Dans la liste, vous pouvez ajouter Android: listselector = nom de la couleur souhaitée.
cela fonctionne bien dans mon application.
En changeant le code de Francisco Cabezas, j'ai obtenu ce qui suit:
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;
J'ai essayé toutes les réponses ci-dessus .. aucune n'a fonctionné pour moi .. c'est ce qui a finalement fonctionné et est utilisé dans mon application .. il fournira les couleurs des éléments de liste lus/non lus tout en conservant les styles de sélecteur de liste 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
Tu peux 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);
}
}
Si la setBackgroundColor
est ajoutée pour l'événement onItemClick, cela ne fonctionnera que si vous pouvez le placer après l'événement click.
Essayez d’ajouter du code de débogage à la méthode getView
de l’adaptateur. Vous constaterez que getView sera appelé à nouveau chaque fois que vous cliquez sur l’écran. Ainsi, après avoir défini la couleur d'arrière-plan, le système redessinera l'écran avec les paramètres d'origine. Je ne sais pas pourquoi gaspiller des ressources pour reconstruire l'écran chaque fois que vous cliquez dessus, vous avez déjà un autre moyen de demander au système de redessiner l'écran si nécessaire.
Vous pouvez éventuellement ajouter un indicateur de contrôle pour déterminer la couleur d'arrière-plan de chaque ligne, puis modifier la méthode getView pour définir la couleur en fonction de cet indicateur de contrôle. Ainsi, la couleur d'arrière-plan sera modifiée lors du redessinage de l'écran.
Je cherche aussi une solution officielle à ce sujet.