2010-09-04 2 views
1

J'ai un listview avec un BaseAdapter personnalisé. Chaque ligne de la liste a un TextView et un CheckBox. Le problème est que lorsque je clique (ou touche) sur n'importe quelle ligne, le premier plan textview devient gris, au lieu du comportement par défaut (background -> green, textview foreground -> white).Afficher la couleur de sélection par défaut pour la liste personnalisée

Voici le code:

row.xml:

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
       style="@style/layout"> 


    <TextView android:id="@+id/main_lv_item_textView" 
       style="@style/textViewBig" 
       android:layout_alignParentLeft="true"/> 


    <CheckBox android:id="@+id/main_lv_item_checkBox" 
       style="@style/checkBox" 
       android:layout_width="wrap_content" 
       android:layout_alignParentRight="true"/> 

</RelativeLayout> 

adaptateur personnalisé:

public class CustomAdapter extends BaseAdapter { 
     private List<Profile> profiles; 
     private LayoutInflater inflater; 
     private TextView tvName; 
     private CheckBox cbEnabled; 

     public CustomAdapter(List<Profile> profiles) { 
      this.profiles = profiles; 
      inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     } 

     public int getCount() { 
      return profiles.size(); 
     } 

     public Object getItem(int position) { 
      return profiles.get(position); 
     } 

     public long getItemId(int position) { 
      return position; 
     } 

     public View getView(final int position, View convertView, ViewGroup parent) { 
      View row = inflater.inflate(R.layout.main_lv_item, null); 

      final Profile profile = profiles.get(position); 
      tvName = (TextView) row.findViewById(R.id.main_lv_item_textView); 
      registerForContextMenu(tvName); 
      cbEnabled = (CheckBox) row.findViewById(R.id.main_lv_item_checkBox); 
      tvName.setText(profile.getName()); 
      if (profile.isEnabled()) { 
       cbEnabled.setChecked(true); 
      } 

      tvName.setOnClickListener(new OnClickListener() { 
       public void onClick(View v) { 
        Bundle bundle = new Bundle(); 
        bundle.putString(PROFILE_NAME_KEY, profile.getName()); 
        Intent intent = new Intent(context, GuiProfile.class); 
        intent.putExtras(bundle); 
        startActivity(intent); 
       } 
      }); 

      tvName.setOnLongClickListener(new OnLongClickListener() { 
       public boolean onLongClick(View v) { 
        selectedProfileName = ((TextView) v).getText().toString(); 
        return false; 
       } 
      }); 

      cbEnabled.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 
       public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
        if (!profile.isEnabled()) { 
         for (Profile profile : profiles) { 
          if (profile.isEnabled()) { 
           profile.setEnabled(false); 
           Database.getInstance().storeProfile(profile); 
          } 
         } 
        } 

        profile.setEnabled(isChecked); 
        Database.getInstance().storeProfile(profile); 
        updateListView(); 
       } 
      }); 

      return row; 
     } 
    } 

Toute aide serait appréciée.

Répondre

0

Vous ne publiez pas le code que vous utilisez pour définir la couleur, mais je suis tombé sur le même problème et la solution était de faire un

setBackgroundColor(0xFF000000); 

au lieu d'un

setBackgroundColor(R.color.black); 

qui semble être un bug dans Android puisque R.color.black n'est pas gris. Tout ce code d'installation est également appelé plusieurs fois et ne doit être fait qu'une seule fois. L'argument convertView sera nul la première fois - c'est quand vous gonflez. Après cela, utilisez simplement convertView.

1

En fait, ce qui se passe n'est pas un bug, mais un problème de frappe malencontreux dans Android. Lorsque vous définissez la couleur d'arrière-plan sur R.color.black, vous le définissez sur un ID plutôt que sur une couleur réelle. Puisque les couleurs ne sont que des ints, et que les ids ne sont que des ints, ils ne connaissaient pas la différence et l'interprétaient comme une couleur. La façon réelle de le faire est de le mettre à une couleur obtenue à partir de la classe des ressources comme ceci:

int black = activity.getResources().getColor(android.R.color.black); 
view.setBackgroundColor(black); 

qui est utile espoir.

Questions connexes