2010-04-16 9 views
5

Ok, quindi ho scritto un ExpandableListView e una sottoclasse BaseExpandableListAdapter ... Tutto funziona bene, tranne che non riesco a mettere a fuoco le viste secondarie quando si fa clic. Se utilizzo la trackball, tutto funziona correttamente. Ma se provo a cliccare su un bambino non ottengo alcun feedback di sorta.EspandibileListView gli elementi figlio non vengono messi a fuoco quando vengono toccati

Ho provato a impostare android: focalizzabile, android: focusableInTouchMode e android: cliccabile (e ho anche provato a impostarlo tramite codice) ma non riesco a far funzionare nulla. Qualche idea?

Ecco il mio codice Adapter:

public class ExpandableAppAdapter extends BaseExpandableListAdapter 
{ 
    private PackageManager m_pkgMgr; 
    private Context m_context; 
    private List<ApplicationInfo> m_groups; 
    private List<List<ComponentName>> m_children; 

    public ExpandableAppAdapter(Context context, List<ApplicationInfo> groups, List<List<ComponentName>> children) 
    { 
     m_context = context; 
     m_pkgMgr = m_context.getPackageManager(); 
     m_groups = groups; 
     m_children = children; 
    } 

    @Override 
    public Object getChild(int groupPos, int childPos) 
    { 
     return m_children.get(groupPos).get(childPos); 
    } 

    @Override 
    public long getChildId(int groupPos, int childPos) 
    { 
     return childPos; 
    } 

    @Override 
    public int getChildrenCount(int groupPos) 
    { 
     return m_children.get(groupPos).size(); 
    } 

    @Override 
    public View getChildView(int groupPos, int childPos, boolean isLastChild, View convertView, ViewGroup parent) 
    { 
     if (convertView == null) 
     { 
      LayoutInflater inflater = LayoutInflater.from(m_context); 
      convertView = inflater.inflate(R.layout.expandable_app_child_row, null); 
     } 

     ComponentName child = (ComponentName)getChild(groupPos, childPos); 
     TextView txtView = (TextView)convertView.findViewById(R.id.item_app_pkg_name_id); 
     if (txtView != null) 
      txtView.setText(child.getPackageName()); 

     txtView = (TextView)convertView.findViewById(R.id.item_app_class_name_id); 
     if (txtView != null) 
      txtView.setText(child.getClassName()); 

     convertView.setFocusableInTouchMode(true); 
     return convertView; 
    } 

    @Override 
    public Object getGroup(int groupPos) 
    { 
     return m_groups.get(groupPos); 
    } 

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

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

    @Override 
    public View getGroupView(int groupPos, boolean isExpanded, View convertView, ViewGroup parent) 
    { 
     if (convertView == null) 
     { 
      LayoutInflater inflater = LayoutInflater.from(m_context); 
      convertView = inflater.inflate(R.layout.expandable_app_group_row, null); 
     } 

     ApplicationInfo group = (ApplicationInfo)getGroup(groupPos); 
     ImageView imgView = (ImageView)convertView.findViewById(R.id.item_selection_icon_id); 
     if (imgView != null) 
     { 
      Drawable img = m_pkgMgr.getApplicationIcon(group); 
      imgView.setImageDrawable(img); 
      imgView.setMaxWidth(20); 
      imgView.setMaxHeight(20); 
     } 

     TextView txtView = (TextView)convertView.findViewById(R.id.item_app_name_id); 
     if (txtView != null) 
      txtView.setText(m_pkgMgr.getApplicationLabel(group)); 

     return convertView; 
    } 
    @Override 
    public boolean hasStableIds() 
    { 
     return false; 
    } 
    @Override 
    public boolean isChildSelectable(int groupPos, int childPos) 
    { 
     return true; 
    } 
} 

Grazie in anticipo!

+0

Sto riscontrando problemi simili cercando di gestire il focus in modo programmatico in ExpandedListView. Perché la tua correzione 'wrap_content' funziona mi sfugge. – Mark

+0

Tecnicamente questo dovrebbe essere stato aggiunto come commento e non come risposta ... – Justin

+0

Non so perché funzioni, ma funziona per me – Justin

risposta

3

Ok, finalmente ho capito!

In realtà aveva a che fare con il mio file XML piuttosto che con il mio adattatore (ho visualizzato l'adattatore per mostrare che stavo chiamando setFocusableInTouchMode quando è stata creata la vista figlio).

Il tutorial stavo usando (non ricordo quale fosse) mi aveva impostare l'altezza bambino:

android:layout_height="?android:attr/listPreferredItemHeight" 

Appena ho cambiato in wrap_content proprio tutto ha iniziato a lavorare bene.

Problemi correlati