是否可以只在可扩展父项的一个子项中添加按钮?
喜欢下面的图片:
最佳答案
编辑:
好的,这就是您可以通过适配器完成此操作的方法:
static class ViewHolder {
TextView textView;
Button button1, button2;
}
@Override
public int getChildTypeCount() {
return 2;
}
@Override
public int getChildType(int groupPosition, int childPosition) {
if (childPosition == 0)
return 0;
else
return 1;
}
@Override
public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView == null) {
holder = new ViewHolder();
if (childPosition == 0) {
// 1st view specifics here
convertView = mInflater.inflate(R.layout.exp_list_child_2, parent, false);
holder.button1 = (Button) convertView.findViewById(R.id.button1);
holder.button2 = (Button) convertView.findViewById(R.id.button2);
holder.button1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(mContext, "Some action here", Toast.LENGTH_SHORT).show();
}
});
} else {
// Other views
convertView = mInflater.inflate(R.layout.exp_list_child, parent, false);
}
holder.textView = (TextView) convertView.findViewById(R.id.childItem);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
holder.textView.setText("Use your data here for other items");
return convertView;
}
这里有几点需要注意:
- 列表使用 convertView 重新使用 View ,但现在您有 2 种不同类型的 View (第一种 View 和其他 View )。这意味着 2 种不同类型的 convertView。
- 为了强制列表认为有两种类型的 View ,我们覆盖了
getChildTypeCount
和getChildType
- 我们重新使用默认的 ViewHolder 类并填充 2 个可选按钮 View 。这些设置仅供第一个 child 观看。
@FrankN.Stein 提供的解决方案也符合条件。我不确定哪一个在性能方面更好(你必须自己测试)。尽管如此,请记住,即使 GONE View 不可见并且不占用布局中的任何空间,它们仍然存在于 View 层次结构和内存中。
EDIT2:
当适配器重新使用 View 时,它必须知道要获取哪个 View 。因此它调用带有子位置的 getChildType
并询问:“这是什么类型”?
如果只有一种类型(默认情况下),则适配器无法区分它们,并且会在不应该使用的地方重新使用您的 1st-child-layout。
This answer有一张漂亮的图片,解释了如何重用 View 。
希望这有点清除它:-)编码愉快!
关于android - 带有自定义子项的可扩展 ListView ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24971876/