2014-07-18 24 views
162

Passando nullo per studio di radice mi dà questo avvertimento:evitare di passare nulla come la radice vista (necessità di risolvere i parametri di layout sul elemento principale del layout di gonfiata)

evitare di passare nulla come la radice vista (necessità di risolvere parametri di layout sull'elemento radice del layout gonfiato)

Sta mostrando un valore nullo in getGroupView. Per favore aiuto.

public class ExpandableListAdapter extends BaseExpandableListAdapter { 

    private Context _context; 
    private List<String> _listDataHeader; // header titles 
    // child data in format of header title, child title 
    private HashMap<String, List<String>> _listDataChild; 

    public ExpandableListAdapter(Context context, List<String> listDataHeader, 
           HashMap<String, List<String>> listChildData) { 
     super(); 
     this._context = context; 
     this._listDataHeader = listDataHeader; 
     this._listDataChild = listChildData; 
    } 

    @Override 
    public Object getChild(int groupPosition, int childPosititon) { 
     return this._listDataChild.get(this._listDataHeader.get(groupPosition)) 
       .get(childPosititon); 
    } 

    @Override 
    public long getChildId(int groupPosition, int childPosition) { 
     return childPosition; 
    } 

    @Override 
    public View getChildView(int groupPosition, final int childPosition, 
          boolean isLastChild, View convertView, ViewGroup parent) { 

     final String childText = (String) getChild(groupPosition, childPosition); 

     if (convertView == null) { 
      LayoutInflater infalInflater = (LayoutInflater) this._context 
        .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      convertView = infalInflater.inflate(R.layout.list_item, null); 


     } 

     TextView txtListChild = (TextView) convertView 
       .findViewById(R.id.lblListItem); 

     txtListChild.setText(childText); 
     return convertView; 
    } 

    @Override 
    public int getChildrenCount(int groupPosition) { 
     return this._listDataChild.get(this._listDataHeader.get(groupPosition)) 
       .size(); 
    } 

    @Override 
    public Object getGroup(int groupPosition) { 
     return this._listDataHeader.get(groupPosition); 
    } 

    @Override 
    public int getGroupCount() { 
     return this._listDataHeader.size(); 
    } 

    @Override 
    public long getGroupId(int groupPosition) { 
     return groupPosition; 
    } 

    @Override 
    public View getGroupView(int groupPosition, boolean isExpanded, 
          View convertView, ViewGroup parent) { 
     String headerTitle = (String) getGroup(groupPosition); 
     if (convertView == null) { 
      LayoutInflater infalInflater = (LayoutInflater) this._context 
        .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      convertView = infalInflater.inflate(R.layout.list_group, null); 
     } 

     TextView lblListHeader = (TextView) convertView 
       .findViewById(R.id.lblListHeader); 
     lblListHeader.setTypeface(null, Typeface.BOLD); 
     lblListHeader.setText(headerTitle); 

     return convertView; 
    } 

    @Override 
    public boolean hasStableIds() { 
     return false; 
    } 

    @Override 
    public boolean isChildSelectable(int groupPosition, int childPosition) { 
     return true; 
    } 

} 

risposta

297

Invece di fare

convertView = infalInflater.inflate(R.layout.list_item, null); 

fare

convertView = infalInflater.inflate(R.layout.list_item, parent, false); 

Sarà gonfiarlo con il genitore dato, ma non collegarlo al genitore.

+12

@Coeffect ma cosa dovrei usare quando si gonfia da dentro l'attività? Cosa dovrei usare al posto dei genitori? –

+3

@AlexanderKuznetsov Dipende da cosa stai cercando di fare, suppongo. Se stai cercando di impostare il contenuto per l'attività, dovresti usare 'setContentView (layoutId)'. Se stai provando ad aggiungere una nuova vista a un ViewGroup esistente, probabilmente dovresti semplicemente passare il genitore e lasciare che l'inflator alleghi la nuova vista. – Coeffect

+2

@Coeffect cosa succede se non hai il genitore? Ad esempio, in TabHost.TabContentFactory – Lucas

3

Un bel informazioni che ho trovato durante la ricerca di un modo per risolvere this.According a Dave Smith,

inflazione layout è il termine usato nel contesto di Android per indicare quando una risorsa di layout XML è analizzato e convertito in una gerarchia di oggetti View.

Il ViewGroup stato chiesto qui come parte dei parametri del metodo gonfiare viene utilizzato per ereditare più alto livello styling.While passaggio nullo può sembrare innocuo, in realtà può causare seri problemi per la vostra applicazione in seguito. Maggiori informazioni su questo here.

20

Quando non si dispone di uno parent (ad esempio, per la creazione di viste per AlertDialog), non si ha altro modo che passare null. Quindi, fare questo per evitare di avvertimento:

final ViewGroup nullParent = null; 
convertView = layoutInflater.inflate(R.layout.list_item, nullParent); 
+28

Sarebbe meglio fare una repressione piuttosto che ingannare la lanugine. – StarWind0

+1

Non sono sicuro che questa risposta sia corretta. Sto usando con successo 'ViewGroup root = (ViewGroup) myActivity.findViewById (R.id.my_main_content);' dove 'my_main_content' è l'id del contenitore più esterno nel file di layout della mia attività. –

+0

Per sopprimere Lint per questo, aggiungere '@SuppressLint (" InflateParams ")' sopra il metodo. –

9

Qui ya go, per qualche ragione, utilizzando View.inflate invece di gonfiare da un layoutinflater fa l'errore di lanugine scomparire. Ho pensato di postare questo qui dal momento che questo thread è in cima la ricerca di Google ...

view = View.inflate(context,R.layout.custom_layout,null);