【问题标题】:Android: Expandable listview with different child layoutsAndroid:具有不同子布局的可扩展列表视图
【发布时间】:2018-04-28 11:07:34
【问题描述】:

我正在尝试创建一个可扩展的列表视图,其中每个列表的最后一项都包含一个 EditText,而其他项则包含 TextViews。到目前为止我提出的代码:

@Override
public View getChildView(int groupPosition, final int childPosition,
                         boolean isLastChild, View convertView, ViewGroup parent) {
    MainActivity.ViewHolder holder = null;
    final String childText = (String) getChild(groupPosition, childPosition);
    boolean bLastChild = childPosition == _listDataChild.get(groupPosition).size() - 1;

    if (convertView == null) {
        holder = new MainActivity.ViewHolder();
        LayoutInflater infalInflater = (LayoutInflater) this._context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        if(bLastChild) {
            convertView = infalInflater.inflate(R.layout.list_edit_item, null);
        }else {
            convertView = infalInflater.inflate(R.layout.list_item, null);
            holder.textView = (TextView) convertView.findViewById(R.id.text);
        }
        convertView.setTag(holder);
    } else {
        holder = (MainActivity.ViewHolder)convertView.getTag();
    }

    if(!bLastChild) {
        holder.textView.setText(childText);
    }

    return convertView;
}

现在我有以下问题:

如果我在第一次工作时扩展一个组。但是,当我再次折叠组并展开它时,应用程序崩溃并出现错误:

java.lang.NullPointerException: 尝试调用虚方法 'void android.widget.TextView.setText(java.lang.CharSequence)' 为空 对象引用

我猜这是因为 holder.textView.setText(childText); 在持有者使用 EditText 引用布局时被调用。但我不知道为什么会这样

这段代码的主要思想来自here

编辑

经过一些记录后,我发现,第二次扩展组时,getChildView 会为每个孩子调用一次,然后在 childPosition = 0 时再调用一次,但 convertView 与最后一个 childposition 的调用保持相同:

childPosition: 0; convertView: android.widget.LinearLayout{a049868 V.E...... ........ 0,157-1080,244} 儿童位置 1; convertView: android.widget.LinearLayout{6f19175 V.E...... ........ 0,247-1080,334} 儿童位置 2; convertView: android.widget.LinearLayout{4aac50a V.E...... ........ 0,337-1080,424} 儿童位置 3; convertView: android.widget.LinearLayout{47b217b V.E...... ........ 0,427-1080,514} 儿童位置 4; convertView: android.widget.LinearLayout{cc2eb98 V.E...... ........ 0,517-1080,604} 儿童位置 5; convertView: android.widget.LinearLayout{256cff1 V.E...... ........ 0,607-1080,694} 儿童位置 6; convertView: android.widget.LinearLayout{7b827d6 V.E...... ........ 0,697-1080,786} 孩子位置 0; convertView: android.widget.LinearLayout{7b827d6 V.E...... ........ 0,697-1080,786}

【问题讨论】:

  • 我猜是这样,否则我第一次扩展组时它不应该工作?!
  • 很好,您的childtext 为空删除holder.textView.setText(childText) 删除该行并在日志中打印并检查。
  • 我不认为 childtext 为空。我宁愿认为 holder.textView 是空的
  • 你匹配或找到TextView的id了吗?
  • 我意识到问题是convertView的回收,如here所述,但我不知道如何解决它

标签: java android android-edittext expandablelistview


【解决方案1】:

通过覆盖以下两个函数解决了问题:

@Override
public int getChildTypeCount(){
    return 2;
}

@Override
public int getChildType(final int groupPosition, final int childPosition){
    if (childPosition == _listDataChild.get(groupPosition).size() - 1){
        return 1;
    }else{
        return 0;
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-22
    • 1970-01-01
    相关资源
    最近更新 更多