2014-11-19 2 views
0
public View getView(int position, View convertView, ViewGroup parent) { 
     ViewHolder newsvh = null; 
     ViewHolder2 imagevh = null; 
     ViewHolder3 speekvh = null; 
     int type = getItem(position).getChanneltype(); 
     if (convertView == null) { 
      switch (type) { 
      case 1: 
       newsvh = new ViewHolder(); 

       convertView = LayoutInflater.from(getActivity()).inflate(
         R.layout.news_item, null); 
       newsvh.image = (ImageView) convertView 
         .findViewById(R.id.image); 
       newsvh.title = (TextView) convertView 
         .findViewById(R.id.title); 
       newsvh.writer = (TextView) convertView 
         .findViewById(R.id.writer); 
       newsvh.pubdate = (TextView) convertView 
         .findViewById(R.id.pubdate); 
       newsvh.click = (TextView) convertView 
         .findViewById(R.id.click); 
       convertView.setTag(newsvh); 
       break; 
      case 2: 
       imagevh = new ViewHolder2(); 

       convertView = LayoutInflater.from(getActivity()).inflate(
         R.layout.image_item, null); 
       imagevh.image = (AbScaleImageView) convertView 
         .findViewById(R.id.image); 
       imagevh.title = (TextView) convertView 
         .findViewById(R.id.title); 
       imagevh.writer = (TextView) convertView 
         .findViewById(R.id.writer); 
       imagevh.pubdate = (TextView) convertView 
         .findViewById(R.id.pubdate); 
       imagevh.click = (TextView) convertView 
         .findViewById(R.id.click); 
       convertView.setTag(imagevh); 
       break; 
      case 3: 
       speekvh = new ViewHolder3(); 
       convertView = LayoutInflater.from(getActivity()).inflate(
         R.layout.speekall_item, null); 
       speekvh.image = (ImageView) convertView 
         .findViewById(R.id.image); 
       speekvh.title = (TextView) convertView 
         .findViewById(R.id.title); 
       speekvh.writer = (TextView) convertView 
         .findViewById(R.id.writer); 
       speekvh.pubdate = (TextView) convertView 
         .findViewById(R.id.pubdate); 
       speekvh.click = (TextView) convertView 
         .findViewById(R.id.click); 
       convertView.setTag(speekvh); 
       break; 

      default: 
       break; 
      } 
     } else { 
      switch (type) { 
      case 1: 
       newsvh = (ViewHolder) convertView.getTag(); 
       break; 
      case 2: 
       imagevh = (ViewHolder2) convertView.getTag();//Error 
       break; 
      case 3: 
       speekvh = (ViewHolder3) convertView.getTag(); 
       break; 

      default: 
       break; 
      } 

     } 
     switch (type) { 
     case 1: 
      newsvh.title.setText(getItem(position).getTitle()); 
      newsvh.writer.setText(getItem(position).getWriter()); 
      newsvh.pubdate.setText(CommonUtil.getData(getItem(position) 
        .getPubdate())); 
      newsvh.click.setText("浏览:" 
        + String.valueOf(getItem(position).getClick())); 
      imageLoader 
        .DisplayImage(
          AppConfig.IMAGE_ADDRESS 
            + getItem(position).getLitpic(), 
          newsvh.image); 
      newsvh.image.setLayoutParams(new LinearLayout.LayoutParams(
        imageWidth, (int) (imageWidth * 0.8))); 
      break; 
     case 2: 
      imagevh.title.setText(getItem(position).getTitle()); 
      imagevh.writer.setText(getItem(position).getWriter()); 
      imagevh.pubdate.setText(CommonUtil.getData(getItem(position) 
        .getPubdate())); 
      imagevh.click.setText("浏览:" 
        + String.valueOf(getItem(position).getClick())); 
      imagevh.image.setMargin(10); 
      imageLoader 
        .DisplayImage(
          AppConfig.IMAGE_ADDRESS 
            + getItem(position).getLitpic(), 
          imagevh.image); 
      break; 
     case 3: 

      break; 

     default: 
      break; 
     } 

     return convertView; 
    } 

    public class ViewHolder { 
     public TextView title, writer, pubdate, click; 
     public ImageView image; 

    } 

    public class ViewHolder2 { 
     public TextView title, writer, pubdate, click; 
     public AbScaleImageView image; 

    } 
    public class ViewHolder3 { 
     public TextView title, writer, pubdate, click; 
     public ImageView image; 

    } 

Ошибка:Android convertView.getTag() Ошибка

11-19 23:52:03.552: E/AndroidRuntime(17348): Process: com.huisifang.cms, PID: 17348 
11-19 23:52:03.552: E/AndroidRuntime(17348): java.lang.ClassCastException: com.huisifang.cms.fragment.ChannelFragment$NewsAdapter$ViewHolder3 cannot be cast to com.huisifang.cms.fragment.ChannelFragment$NewsAdapter$ViewHolder2 
11-19 23:52:03.552: E/AndroidRuntime(17348): at com.huisifang.cms.fragment.ChannelFragment$NewsAdapter.getView(ChannelFragment.java:511) 
11-19 23:52:03.552: E/AndroidRuntime(17348): at android.widget.HeaderViewListAdapter.getView(HeaderViewListAdapter.java:220) 
11-19 23:52:03.552: E/AndroidRuntime(17348): at android.widget.AbsListView.obtainView(AbsListView.java:2285) 
11-19 23:52:03.552: E/AndroidRuntime(17348): at android.widget.ListView.makeAndAddView(ListView.java:1790) 
11-19 23:52:03.552: E/AndroidRuntime(17348): at android.widget.ListView.fillDown(ListView.java:691) 
11-19 23:52:03.552: E/AndroidRuntime(17348): at android.widget.ListView.fillGap(ListView.java:655) 
11-19 23:52:03.552: E/AndroidRuntime(17348): at android.widget.AbsListView.trackMotionScroll(AbsListView.java:5424) 
11-19 23:52:03.552: E/AndroidRuntime(17348): at android.widget.AbsListView.scrollIfNeeded(AbsListView.java:3374) 
11-19 23:52:03.552: E/AndroidRuntime(17348): at android.widget.AbsListView.onTouchMove(AbsListView.java:3774) 
11-19 23:52:03.552: E/AndroidRuntime(17348): at android.widget.AbsListView.onTouchEvent(AbsListView.java:3583) 
11-19 23:52:03.552: E/AndroidRuntime(17348): at android.view.View.dispatchTouchEvent(View.java:7714) 
11-19 23:52:03.552: E/AndroidRuntime(17348): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2224) 
11-19 23:52:03.552: E/AndroidRuntime(17348): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1959) 
11-19 23:52:03.552: E/AndroidRuntime(17348): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2230) 
+2

Почему у вас есть 3 класса «ViewHolder»? – codeMagic

+1

Это может показаться нерушимым, но написание нескольких строк, описывающих вашу проблему, не повредит. – Fred

ответ

0

вы должны переопределить getViewTypeCount и getItemViewType, в противном случае вы получите только один нуль convertView

@Override 
public int getViewTypeCount() { 
    return 3; 
} 

@Override 
public int getItemViewType(int position) { 
    return getItem(position).getChanneltype() - 1; 
} 

и getView

int type = getItemViewType(position); 

и вместо перехода к 1, 2 and 3 вы должны переключиться на 0, 1 and 2

+0

спасибо, но есть ошибка! '11 -20 00: 14: 15.582: E/AndroidRuntime (20504): java.lang.ArrayIndexOutOfBoundsException: length = 3; index = 3 11-20 00: 14: 15.582: E/AndroidRuntime (20504): \t на android.widget.AbsListView $ RecycleBin.addScrapView (AbsListView.java:7012) 11-20 00: 14: 15.582: E/AndroidRuntime (20504): \t на android.widget.AbsListView.trackMotionScroll (AbsListView.java:5372) 11-20 00: 14: 15.582: E/AndroidRuntime (20504): \t на android.widget.AbsListView.scrollIfNeeded (AbsListView. java: 3374) 11-20 00: 14: 15.582: E/AndroidRuntime (20504): ' – Eide

+0

Я обновил свой ответ, – Blackbelt

+0

Я добавил ViewHolder3 в первый элемент списка. Из второго элемента появился ViewHolder2.Then возникла проблема. – Eide

0

Тег назначен convertView может быть любой из 3-х типов; не гарантируется соответствие типа элемента в текущем position. Таким образом, convertView перерабатывается из типа 3, тогда как текущий элемент является типом 2; это дает вам исключение ClassCastException.

Чтобы решить эту проблему, вам необходимо будет проверить тип ViewHolder, с которым вы работаете, в convertView. Если он не совместим с типом текущего элемента, вам придется повторно раздуть представление и снова установить тег.

+0

спасибо! Я пробую! – Eide

Смежные вопросы