2010-07-20 8 views
2

Ce code instancie-t-il un objet SectionedAdapter et remplace-t-il getHeaderView sur une ligne?question de syntaxe java

SectionedAdapter tagSectionedAdapter=new SectionedAdapter() { 
    protected View getHeaderView(String caption, int index, 
            View convertView, 
            ViewGroup parent) { 
     TextView result=(TextView)convertView; 

     if (convertView==null) { 
      result=(TextView)getLayoutInflater() 
      .inflate(R.layout.tag_listview_header, null); 
     } 

     result.setText(caption); 

     return(result); 
    } 
}; 

Répondre

2

Il déclare une classe et remplace une méthode.

Il est similaire à déclarer une classe comme ceci:

class MySectionedAdapter extends SectionedAdapter 
{ 
    @Override 
    protected View getHeaderView(...) 
    { 
     ... 
    } 
} 

Et instanciation puis cette classe:

SectionedAdapter tagSectionedAdapter = new MySectionedAdapter();

Il est une classe interne anonyme - pas de nom et une syntaxe légèrement différente. Il est utilisé lorsque vous n'avez besoin que d'une instance spécifique d'une classe dans certaines situations. Par exemple, les classes de comparaison sont souvent implémentées de cette manière et transmises dans des fonctions de tri.

La classe que vous implémentez peut en fait être une interface, pas une classe du tout, comme dans le cas de Runnable.

3

Oui, vous avez raison. C'est ce qu'on appelle un anonymous inner class. La classe est définie mais jamais donnée de nom. (SectionedAdapter est en fait le supertype de la classe anonyme.)