Android:具有不同子布局的可扩展列表视图
Android: Expandable listview with different child layouts
我正在尝试创建一个可展开的列表视图,其中每个列表的最后一项包含一个 EditText,而其他项包含 TextView。到目前为止我提出的代码:
@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: Attempt to invoke virtual method 'void
android.widget.TextView.setText(java.lang.CharSequence)' on a null
object reference
我猜这是因为当持有者使用 EditText 引用布局时调用了 holder.textView.setText(childText);
。但是不知道为什么会这样
这段代码的主要思想来自here
编辑
经过一些日志记录后,我发现,第二次扩展组时,每个子对象都会调用一次 getChildView,然后在 childPosition = 0 时再调用一次,但 convertView 与上一个子位置的调用保持相同:
childPosition: 0; convertView: android.widget.LinearLayout{a049868 V.E...... ........ 0,157-1080,244}
childPosition 1; convertView: android.widget.LinearLayout{6f19175 V.E...... ........ 0,247-1080,334}
childPosition 2; convertView: android.widget.LinearLayout{4aac50a V.E...... ........ 0,337-1080,424}
childPosition 3; convertView: android.widget.LinearLayout{47b217b V.E...... ........ 0,427-1080,514}
childPosition 4; convertView: android.widget.LinearLayout{cc2eb98 V.E...... ........ 0,517-1080,604}
childPosition 5; convertView: android.widget.LinearLayout{256cff1 V.E...... ........ 0,607-1080,694}
childPosition 6; convertView: android.widget.LinearLayout{7b827d6 V.E...... ........ 0,697-1080,786}
childPosition 0; convertView: android.widget.LinearLayout{7b827d6 V.E...... ........ 0,697-1080,786}
通过重写以下两个函数解决了问题:
@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;
}
}
我正在尝试创建一个可展开的列表视图,其中每个列表的最后一项包含一个 EditText,而其他项包含 TextView。到目前为止我提出的代码:
@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: Attempt to invoke virtual method 'void android.widget.TextView.setText(java.lang.CharSequence)' on a null object reference
我猜这是因为当持有者使用 EditText 引用布局时调用了 holder.textView.setText(childText);
。但是不知道为什么会这样
这段代码的主要思想来自here
编辑
经过一些日志记录后,我发现,第二次扩展组时,每个子对象都会调用一次 getChildView,然后在 childPosition = 0 时再调用一次,但 convertView 与上一个子位置的调用保持相同:
childPosition: 0; convertView: android.widget.LinearLayout{a049868 V.E...... ........ 0,157-1080,244} childPosition 1; convertView: android.widget.LinearLayout{6f19175 V.E...... ........ 0,247-1080,334} childPosition 2; convertView: android.widget.LinearLayout{4aac50a V.E...... ........ 0,337-1080,424} childPosition 3; convertView: android.widget.LinearLayout{47b217b V.E...... ........ 0,427-1080,514} childPosition 4; convertView: android.widget.LinearLayout{cc2eb98 V.E...... ........ 0,517-1080,604} childPosition 5; convertView: android.widget.LinearLayout{256cff1 V.E...... ........ 0,607-1080,694} childPosition 6; convertView: android.widget.LinearLayout{7b827d6 V.E...... ........ 0,697-1080,786} childPosition 0; convertView: android.widget.LinearLayout{7b827d6 V.E...... ........ 0,697-1080,786}
通过重写以下两个函数解决了问题:
@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;
}
}