LinearLayout无法强制转换为android.widget

时间:2013-07-10 19:00:10

标签: android listview casting

    @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)

有这个问题的其他人只是清理他们的项目并且它有效...也许我的问题是不同的。关于它为什么会给我这个问题的任何想法?

2 个答案:

答案 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;
    }
 }