2010-04-16 2 views
5

Итак, я написал ExpandableListView и подклассифицированный BaseExpandableListAdapter ... Все работает отлично, за исключением того, что я не могу заставить дочерние представления делать фокус при нажатии. Если я использую трекбол, все будет хорошо. Но если я попытаюсь нажать на ребенка, я не получаю никакой обратной связи.Детальные элементы ExpandableListView не получают фокус при касании

Я пробовал установить андроид: focusable, android: focusableInTouchMode и android: clickable (и я также попытался установить это с помощью кода), но я не могу заставить ничего работать. Есть идеи?

Вот мой код адаптера:

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; 
    } 
} 

Заранее спасибо!

+0

У меня возникают аналогичные проблемы, пытаясь управлять фокусом программно в ExpandedListView. Почему ваше исправление «wrap_content» ускользает от меня. – Mark

+0

Технически это должно было быть добавлено как комментарий, а не как ответ ... – Justin

+0

Я не уверен, почему он работает, но он работает для меня – Justin

ответ

3

Хорошо, я, наконец, понял!

Фактически это имело отношение к моему XML-файлу, а не к моему адаптеру (я отобразил адаптер, чтобы показать, что я вызывал setFocusableInTouchMode, когда был создан дочерний вид).

В учебнике я использовал (не помню, какой это был) у меня установить высоту дочернему:

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

Как только я изменил его просто wrap_content все начали работать нормально.

 Смежные вопросы

  • Нет связанных вопросов^_^