@Override
public View getView(final int position, View convertView, ViewGroup parent) {
ListViewItem item = items.get(position);
View vi=convertView;
if(position == 0) {
vi = inflater.inflate(R.layout.setting_twolinetext_checkbox, null);
TextView tvRowTitle = (TextView) vi.findViewById(R.id.tvRowTitle);
TextView tvRowDesc = (TextView) vi.findViewById(R.id.tvRowDesc);
CheckBox cbCheckBox = (CheckBox) vi.findViewById(R.id.cbRowCheckBox);
tvRowTitle.setText(item.Title);
tvRowDesc.setText(item.Description);
return vi;
} else {
TwoLineListItem twoLineListItem = (TwoLineListItem) vi; <----- here is the error
TextView text1 = twoLineListItem.getText1();
TextView text2 = twoLineListItem.getText2();
text1.setText(item.Title);
text2.setText(item.Description);
return vi;
}
}
07-10 13:55:37.082: E/AndroidRuntime(10520): java.lang.ClassCastException: android.widget.LinearLayout cannot be cast to android.widget.TwoLineListItem
07-10 13:55:37.082: E/AndroidRuntime(10520): at com.example.util.CustomSettingsListViewAdapter.getView(CustomSettingsListViewAdapter.java:69)
有这个问题的其他人只是清理他们的项目并且它有效...也许我的问题是不同的。关于它为什么会给我这个问题的任何想法?
答案 0 :(得分:0)
据说进入的视图是LinearLayout类型。但是你希望它在这一点上是一个TwoLineListItem。由于TwoLineListItem不是LinearLayout,它会抱怨。也许你只需要找出为什么在这个位置你得到一个线性布局。也许你打算跳过第1位。
答案 1 :(得分:0)
这看起来像是来自适配器的代码片段。在适配器管理的列表中的项目可以具有不同视图类型的情况下,您应该覆盖getViewTypeCount()和getItemViewType(int position)
您的代码看起来有点像:
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
ListViewItem item = items.get(position);
int itemViewType = getViewType(position);
View vi=convertView;
if(itemViewType == 0) {
// Viewtype 0 is a linear layout?
if(! (vi instanceof LinearLayout) ) {
// Cant reuse existing view, inflate a new one..
vi = inflater.inflate(R.layout.setting_twolinetext_checkbox, null);
}
TextView tvRowTitle = (TextView) vi.findViewById(R.id.tvRowTitle);
TextView tvRowDesc = (TextView) vi.findViewById(R.id.tvRowDesc);
CheckBox cbCheckBox = (CheckBox) vi.findViewById(R.id.cbRowCheckBox);
tvRowTitle.setText(item.Title);
tvRowDesc.setText(item.Description);
} else if(itemViewType == 1) {
// TwoLineListItem
if(!vi instanceof TwoLineListItem) {
// Can't reuse layout, inflate a new one..
vi = inflater.inflate(R.layout.twolinelistitem, null);
}
TwoLineListItem twoLineListItem = (TwoLineListItem) vi;
TextView text1 = twoLineListItem.getText1();
TextView text2 = twoLineListItem.getText2();
text1.setText(item.Title);
text2.setText(item.Description);
}
return vi;
}
需要注意的重要一点是,实际上从ListAdapter的“回收”bin中检索convertView,以便在滚动列表时尝试减少分配/ GC的数量。您应该在尝试使用它之前检查convertView中的视图类型,如果它不是您需要的那个,则创建一个新的布局。
getItemViewType(position)应该返回列表中位置的视图类型编号。在你的情况下,直接在你的getView中做起来可能更简单,但是通过“正确”进行,你可以稍后决定是否想要混合视图......例如:
现在:
@Override
int getItemViewType(int position) {
if(position == 0) {
return 0;
} else {
return 1;
}
}
未来:
@Override
int getItemViewType(int position) {
SpecialData item = (SpecialData) getItem(position);
if(item.isTwoLineItem()) {
return 1;
} else {
return 0;
}
}