Android ExpandableListView getChildView无法触发

Android ExpandableListView getChildView无法触发

问题描述:

我制作了一个ExpandableListView,下面有很多教程和一些来自SO的错误问题。 父列表由两个TextView和一个带标准布局的ImageButton组成。子列表由单个TextView组成。 数据源来自活动的SQLite数据库并生成到ArrayList。Android ExpandableListView getChildView无法触发

问题:

不知父组列表中正常工作,甚至按钮工作正常,但是当我试图扩大,它不会扩大。因此,我尝试放置一些Toast消息,但在打开该活动后,但看起来像getChildView()方法根本不触发,因为Toast消息根本不显示。

的ExpandableListAdapter类是这样

public class InventoryListExpandableListAdapter extends BaseExpandableListAdapter { 

    private Context context; 
    private ArrayList<Inventory> data; 
    private HashMap<String, ArrayList<String>> list_data; 

    public InventoryListExpandableListAdapter(Context context, ArrayList<Inventory> data, HashMap<String, ArrayList<String>> list_data) { 
     this.context = context; 
     this.data = data; 
     this.list_data = list_data; 
    } 

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

    @Override 
    public int getChildrenCount(int groupPosition) {return list_data.get(data.get(groupPosition)).size();} 

    @Override 
    public Inventory getGroup(int groupPosition) {return data.get(groupPosition);} 

    @Override 
    public Object getChild(int groupPosition, int childPosition) {return list_data.get(data.get(groupPosition).getCode()).get(childPosition);} 

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

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

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

    @Override 
    public View getGroupView(final int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) { 
     if (convertView == null) { 
      final Inventory inventory = getGroup(groupPosition); 

      convertView = View.inflate(context, R.layout.listview_layout_two_row_delete, null); 
      ImageButton btnDelete = (ImageButton)convertView.findViewById(R.id.btnDelete); 
      TextView text1 = (TextView)convertView.findViewById(R.id.text1); 
      TextView text2 = (TextView)convertView.findViewById(R.id.text2); 

      text1.setText(inventory.getCode()); 
      text2.setText(inventory.getItem()); 

      btnDelete.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View view) { 
        Toast.makeText(context, "DELETED", Toast.LENGTH_SHORT).show(); 
       } 
      }); 
     } 
     return convertView; 
    } 

    @Override 
    public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) { 
     final String childText = (String)getChild(groupPosition, childPosition); 
     LayoutInflater infalInflater = (LayoutInflater) this.context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

     if (convertView == null) { 
      convertView = infalInflater.inflate(R.layout.listview_layout_single_text, null); 
     } 
     Toast.makeText(context, "Make Child number "+String.valueOf(childPosition), Toast.LENGTH_SHORT).show(); 

     TextView text1 = (TextView)convertView.findViewById(R.id.text1); 
     text1.setText(childText); 
     return convertView; 
    } 

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

} 

我很感激你给予任何帮助。谢谢。

+1

如果因为'getChildrenCount'将返回0 – Blackbelt

+0

我检查了它,它不叫,它可能和大小不是0 – poring91

变化hasStableIds方法

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

**请改变你的getGroupView方法:: **

@Override 
public View getGroupView(final int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) { 
     if (convertView == null) { 
      final Inventory inventory = getGroup(groupPosition); 

      convertView = View.inflate(context, R.layout.listview_layout_two_row_delete, null); 
      } 
      ImageButton btnDelete = (ImageButton)convertView.findViewById(R.id.btnDelete); 
      TextView text1 = (TextView)convertView.findViewById(R.id.text1); 
      TextView text2 = (TextView)convertView.findViewById(R.id.text2); 

      text1.setText(inventory.getCode()); 
      text2.setText(inventory.getItem()); 

      btnDelete.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View view) { 
        Toast.makeText(context, "DELETED", Toast.LENGTH_SHORT).show(); 
       } 
      }); 

     return convertView; 
    } 
+0

它仍然无法正常工作。该名单仍然没有扩大 – poring91

我花了几个小时试图找到同样的问题,才意识到这是什么死在我身边简单:

  1. 你有一个ImageButton在th e拦截触摸以扩大视图的GroupView。使用此解决它:

机器人:可聚焦= “假” 机器人:focusableInTouchMode = “假”

  1. 由于组视图没有展开,有没有理由浪费CPU周期来获取不会显示的视图。
  2. 与孩子有关的适配器中的所有方法都不会被调用。
  3. 尝试调用expandableListView.expandGroup(0 ... n)的手动展开它,看看它是否叫适配器

开始=>

我发现了一个不同的办法有getChildView孩子相关的方法()当它不是在ExpandedListAdapter类中自动调用时调用它。这是一个快捷方式,似乎解决了这个问题。我有一个扩展列表视图,父组项是一个复选框列表。点击复选框显示子项。这是我编码getGroupView()函数的方式。

@Override 
public View getGroupView(final int groupPosition, final boolean isExpanded, View convertView, final ViewGroup viewGroup) 
{ 
    if (convertView == null) 
    { 
     LayoutInflater inflater = (LayoutInflater) m_context 
       .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     convertView = inflater.inflate(R.layout.expandable_list_milk_type,null); 
    } 
    final CheckBox cbMilkType = (CheckBox) convertView.findViewById(R.id.cb_milk_type); 
    cbMilkType.setText(m_listMilktype.get(groupPosition)); 

    cbMilkType.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      ExpandableListView expandableListView = (ExpandableListView)viewGroup; 
      cbMilkType.toggle(); 
      if (!isExpanded) { 
       expandableListView.expandGroup(groupPosition); 
      } 
      else { 
       expandableListView.collapseGroup(groupPosition); 
      } 
     } 
    }); 
    return convertView; 
}