2013-07-30 20 views
2

我已經創建了我自己的適配器,它擴展了ArrayAdapter ...問題是,我在列表中有3種可能的行,並且通過快速滾動某些行是不正確的,我認爲是因爲「回收機制」 Android視圖...我閱讀了很多關於StackOverflow的教程,但我仍然遇到這個問題。 我的代碼有問題嗎? (代碼沒有最優化,我總是在功能正確時對其進行優化)。你能幫我嗎?謝謝!ArrayAdapter和3種不同類型的行。沒有工作

我一個ArrayAdapter類:

package com.example.birthdayReminder; 

import java.util.List; 

import android.app.Activity; 
import android.graphics.Typeface; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.ArrayAdapter; 
import android.widget.CheckBox; 
import android.widget.CompoundButton; 
import android.widget.TextView; 

public class InteractiveArrayAdapter extends ArrayAdapter<Human> { 

     private final List<Human> list; 
     private final Activity context; 
     private int TYPE = 0; 
     ViewHolder holder; 

     public InteractiveArrayAdapter(Activity context, List<Human> list) { 
       super(context, R.layout.programlistview_row_layout, list); 
       this.context = context; 
       this.list = list; 
     } 

     static class ViewHolder { 
       protected TextView text; 
       protected TextView birthDate; 
       protected TextView daysToBirthDate; 
       protected TextView daysToBirthDateValue; 
       protected CheckBox checkbox; 
     } 

     @Override 
     public View getView(int position, View convertView, ViewGroup parent) { 

       //View view = null; 

       Human h = list.get(position); 

       holder = null; 

       TYPE = getItemViewType(position); 
       //System.out.println("getView " + position + " " + convertView + " type = " + type); 

       if (convertView == null) { 

         //LayoutInflater inflator = context.getLayoutInflater(); 
         LayoutInflater inflator = LayoutInflater.from(getContext()); 
         holder = new ViewHolder(); 

         switch(TYPE){ 
           case 0: 
             convertView = inflator.inflate(R.layout.programlistview_row_layout_birthday, parent, false); 
             break; 
           case 1: 
             convertView = inflator.inflate(R.layout.programlistview_row_layout_text_sentence, parent, false); 
             break; 
           case 2: 
             convertView = inflator.inflate(R.layout.programlistview_row_layout, parent, false); 
             break; 
         } 

         convertView.setTag(holder); 

       } else { 
         holder = (ViewHolder) convertView.getTag(); 
         ((ViewHolder) convertView.getTag()).checkbox.setTag(list.get(position)); 
       } 

       holder.text = (TextView) convertView.findViewById(R.id.label); 
       holder.birthDate = (TextView) convertView.findViewById(R.id.birthDate); 
       holder.checkbox = (CheckBox) convertView.findViewById(R.id.check); 

       holder.checkbox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 
         @Override 
         public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
           Human element = (Human) holder.checkbox.getTag(); 
           element.setSelected(buttonView.isChecked()); 
         } 
       }); 

       convertView.setTag(holder); 
       holder.checkbox.setTag(h); 

       holder.text.setText(h.getName() + " " + h.getLastName()); 
       holder.text.setTypeface(null, Typeface.BOLD); 
       holder.birthDate.setText(" Birthday: " + String.valueOf(h.getBirthDate())); 

       switch(TYPE){ 
         case 0: 
           holder.daysToBirthDate = (TextView) convertView.findViewById(R.id.daysTobirthDate); 

           if(h.getAge() == 1) 
             holder.daysToBirthDate.setText(" ... is " + (int)(h.getAge()) + " year old today!"); 
           else 
             holder.daysToBirthDate.setText(" ... is " + (int)(h.getAge()) + " years old today!"); 
           break; 
         case 1: 
           holder.daysToBirthDate = (TextView) convertView.findViewById(R.id.daysTobirthDate);        

           if(h.getAge() == 0){ 
             holder.daysToBirthDate.setText(" ... was born today!"); 
           } 
           else if(h.getAge() < 0) 
             holder.daysToBirthDate.setText(" ... was not born yet!");     
           break; 
         case 2: 
           holder.daysToBirthDateValue = (TextView) convertView.findViewById(R.id.daysTobirthDate_value); 
           holder.daysToBirthDate = (TextView) convertView.findViewById(R.id.daysTobirthDate); 
           holder.daysToBirthDate.setText(" Days to birthday: "); 
           holder.daysToBirthDateValue.setText(String.valueOf(h.getDaysToBirthDate())); 
           break; 
       } 

       holder.checkbox.setChecked(h.isSelected()); 

       return convertView; 

     } 

     @Override 
     public int getViewTypeCount(){ 
       return 3; 

     } 

     @Override 
     public int getItemViewType(int position){ 
       Human h = list.get(position); 
       if (h.getDaysToBirthDate() == 0 && h.getAge() > 0){ 
         TYPE = 0; 
       } 
       else if((h.getDaysToBirthDate() == 0 && h.getAge() == 0) || (h.getDaysToBirthDate() == 0 && h.getAge() < 0) || (h.getDaysToBirthDate() != 0 && h.getAge() < 0)){ 
         TYPE = 1; 
       } 
       else if(h.getDaysToBirthDate() != 0 && h.getAge() >= 1){ 
         TYPE = 2; 
       } 
       return TYPE; 
     } 

     @Override 
     public int getCount(){ 
       return list.size(); 
     } 

     @Override 
     public Human getItem(int position) { 
      return list.get(position); 
     } 

     @Override 
     public long getItemId(int position) { 
      return position; 
     } 


     /* 
    //private class AnimalAdapter extends BaseAdapter { 
     final List<com.example.birthdayReminder.row.Row> rows; 

     InteractiveArrayAdapter(Activity context, List<Human> humans) { 
       super(context, R.layout.programlistview_row_layout); 
       //super(context, R.layout.programlistview_row_layout, list); 
      rows = new ArrayList<com.example.birthdayReminder.row.Row>();//member variable 

      for (Human h : humans) { 
       if (h.getDaysToBirthDate() == 0 && h.getAge() > 0){ 
        rows.add((com.example.birthdayReminder.row.Row) new BirthdayRow(LayoutInflater.from(context), h)); 
       } else if((h.getDaysToBirthDate() == 0 && h.getAge() == 0) || (h.getDaysToBirthDate() == 0 && h.getAge() < 0) || (h.getDaysToBirthDate() != 0 && h.getAge() < 0)){ 
        rows.add((com.example.birthdayReminder.row.Row) new TodayFutureRow(LayoutInflater.from(context), h)); 
       } else if(h.getDaysToBirthDate() != 0 && h.getAge() >= 1){ 
         rows.add((com.example.birthdayReminder.row.Row) new NonBirthdayRow(LayoutInflater.from(context), h)); 
       } 
      } 
     } 

     @Override 
     public int getViewTypeCount() { 
      return com.example.birthdayReminder.row.RowType.values().length; 
     } 

     @Override 
     public int getItemViewType(int position) { 
      return rows.get(position).getViewType(); 
     } 

     public int getCount() { 
      return rows.size(); 
     } 

     //public Object getItem(int position) { 
     // return position; 
     //} 

     public long getItemId(int position) { 
      return position; 
     } 

     public View getView(int position, View convertView, ViewGroup parent) { 
      return rows.get(position).getView(convertView); 
     } 
    //} 
     */ 

} 
+0

u能請您分享如何將要顯示的數據,目前如何U所得到的數據的屏幕截圖。 – Ruban

+0

如果你的convertView不爲null,你不更新佈局。所以convertView沒有得到更新。通過臨時刪除if條件'convertView == null'它應該看起來o.k.然後你可以實現一個方法來檢查convertView的類型是否正常。 – Christian

+1

首先,不要在'getItemViewType()'和'getView()'方法之間共享TYPE變量。其次確保'getItemViewType()'方法中的'if'子句覆蓋了所有**可能的情況,所以你不會退出具有指向某個隨機值的'TYPE'的方法。 – Luksprog

回答

0

除去持有人,並用自己的邏輯來檢查item.because如果ü把持有烏爾* 視圖將在列表視圖,以便烏爾數據均不會倒塌被重用。使用持有人很好(記憶的觀點)。但是對於你的要求,你不能使用持有人。 *

public class InteractiveArrayAdapter extends ArrayAdapter<Human> { 


    private final List<Human> list; 
     private final Activity context; 
     private int TYPE = 0; 
     private LayoutInflater l_Inflater; 

     public ItemListBaseAdapter(Context context, 
       List<Human> list) { 

       this.context = context; 
         this.list = list; 

     } 

     public int getCount() { 
      return list.size(); 

     } 

     public Object getItem(int position) { 
      return list.get(position); 
     } 

     public long getItemId(int position) { 


      return position; 
     } 

     @Override 
     public View getView(int position, View convertView, ViewGroup parent) { 


       Human h = list.get(position); 

       TYPE = getItemViewType(position); 
       //System.out.println("getView " + position + " " + convertView + " type = " + type); 

       if (convertView == null) { 

         //LayoutInflater inflator = context.getLayoutInflater(); 
         LayoutInflater inflator = LayoutInflater.from(getContext()); 

         switch(TYPE){ 
           case 0: 
             convertView = inflator.inflate(R.layout.programlistview_row_layout_birthday, parent, false); 
             break; 
           case 1: 
             convertView = inflator.inflate(R.layout.programlistview_row_layout_text_sentence, parent, false); 
             break; 
           case 2: 
             convertView = inflator.inflate(R.layout.programlistview_row_layout, parent, false); 
             break; 
         } 



       } 



       text = (TextView) convertView.findViewById(R.id.label); 
       birthDate = (TextView) convertView.findViewById(R.id.birthDate); 
       checkbox = (CheckBox) convertView.findViewById(R.id.check); 

       checkbox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 
         @Override 
         public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 

         } 
       }); 

       checkbox.setTag(h); 

       text.setText(h.getName() + " " + h.getLastName()); 
       text.setTypeface(null, Typeface.BOLD); 
       birthDate.setText(" Birthday: " + String.valueOf(h.getBirthDate())); 

       switch(TYPE){ 
         case 0: 
         daysToBirthDate = (TextView) convertView.findViewById(R.id.daysTobirthDate); 

           if(h.getAge() == 1) 
            daysToBirthDate.setText(" ... is " + (int)(h.getAge()) + " year old today!"); 
           else 
             holder.daysToBirthDate.setText(" ... is " + (int)(h.getAge()) + " years old today!"); 
           break; 
         case 1: 
           holder.daysToBirthDate = (TextView) convertView.findViewById(R.id.daysTobirthDate);        

           if(h.getAge() == 0){ 
             holder.daysToBirthDate.setText(" ... was born today!"); 
           } 
           else if(h.getAge() < 0) 
             holder.daysToBirthDate.setText(" ... was not born yet!");     
           break; 
         case 2: 
           daysToBirthDateValue = (TextView) convertView.findViewById(R.id.daysTobirthDate_value); 
           daysToBirthDate = (TextView) convertView.findViewById(R.id.daysTobirthDate); 
           daysToBirthDate.setText(" Days to birthday: "); 
           holder.daysToBirthDateValue.setText(String.valueOf(h.getDaysToBirthDate())); 
           break; 
       } 

       holder.checkbox.setChecked(h.isSelected()); 

       return convertView; 

     } 

     @Override 
     public int getViewTypeCount(){ 
       return 3; 

     } 

     @Override 
     public int getItemViewType(int position){ 
       Human h = list.get(position); 
       if (h.getDaysToBirthDate() == 0 && h.getAge() > 0){ 
         TYPE = 0; 
       } 
       else if((h.getDaysToBirthDate() == 0 && h.getAge() == 0) || (h.getDaysToBirthDate() == 0 && h.getAge() < 0) || (h.getDaysToBirthDate() != 0 && h.getAge() < 0)){ 
         TYPE = 1; 
       } 
       else if(h.getDaysToBirthDate() != 0 && h.getAge() >= 1){ 
         TYPE = 2; 
       } 
       return TYPE; 
     } 



    } 
+0

謝謝,但它仍然是同樣的問題。 –

+0

不幸的是,你會被要求添加一個具有特定資源ID的構造函數,所以這種方法不起作用。 – romedius

相關問題