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

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

4

2 回答 2

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

需要注意的重要一点是,convertView 实际上是从 ListAdapter 的“回收”箱中检索到的,以尝试在滚动列表时减少分配/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;
    }
 }
于 2013-07-10T20:29:30.397 回答
0

据说进来的视图是LinearLayout类型的。但此时您希望它是 TwoLineListItem。由于 TwoLineListItem 不是 LinearLayout 它抱怨。也许你只需要弄清楚为什么在这个位置你会得到一个线性布局。也许您也打算跳过位置 1。

于 2013-07-10T19:07:15.130 回答