2013-02-06 71 views
0

我有一個自定義TextView,我在自定義GridView適配器中使用。自定義TextView正在使用自定義字體進行翻譯。在缺省情況下安裝了語言環境的設備中,這種方式非常有效。奇怪的行爲與CustomAdapter和CustomTextView

但是,在未安裝語言的設備中,顯示出奇怪的行爲。當應用第一次加載時,TextViews不會顯示自定義字體。但是,當我按刷新按鈕重新加載片段時,TextViews顯示自定義字體。

我不知道爲什麼會發生這種情況。

這發生在我使用自定義TextView的應用程序中的所有自定義Adapters

非常基本的適配器:

public class CalendarWeekAdapter extends BaseAdapter{ 

    private String[] weekdays; 
    Context mContext; 
    private LayoutInflater mInflater; 

     public CalendarWeekAdapter(Context context, int firstDay) 
     { 
       mContext=context; 
       mInflater = LayoutInflater.from(context); 
       weekdays = context.getResources().getStringArray(R.array.weekdays); 
     } 
     public int getCount() 
     { 
       return weekdays.length; 
     } 
     public Object getItem(int position) 
     { 
       return position; 
     } 
     public long getItemId(int position) 
     { 
       return position; 
     } 
     public View getView(int position, View convertView, ViewGroup parent) 
     { 
       ViewHolder holder=null; 
       if(convertView==null) 
       { 
        convertView = mInflater.inflate(R.layout.calendar_week, parent,false); 
        holder = new ViewHolder(); 
        holder.txtWeekdays=(CustomTextView)convertView.findViewById(R.id.weekdays); 
        if(position==0) 
        {        
          convertView.setTag(holder); 
        } 
       } 
       else 
       { 
        holder = (ViewHolder) convertView.getTag(); 
       } 


      holder.txtWeekdays.setText(weekdays[position]); 


      return convertView; 
     } 

} 
class ViewHolder 
{   
      CustomTextView txtWeekdays;     
} 

基本CustomTextView:

public class CustomTextView extends TextView { 
     public CustomTextView(Context context, AttributeSet attrs, int defStyle) { 
      super(context, attrs, defStyle); 
      init(); 
     } 

     public CustomTextView(Context context, AttributeSet attrs) { 
      super(context, attrs); 
      init(); 
     } 

     public CustomTextView(Context context) { 
      super(context); 
      init(); 
     } 

     private void init() { 
      if (!isInEditMode()) { 
       setTypeface(Utils.getFont(getContext())); 
      } 
     } 
} 

回答

1

這可能不是答案,但我不明白這個if語句:

    holder.txtWeekdays=(CustomTextView)convertView.findViewById(R.id.weekdays); 
       if(position==0) 
       {        
         convertView.setTag(holder); 
       } 

這是爲什麼?所有新近膨脹的convertView應該有持有人作爲他們的標籤。 只是刪除了「如果」圍繞convertView.setTag(持有人):

  if(convertView==null) 
      { 
       convertView = mInflater.inflate(R.layout.calendar_week, null,false); 
       holder = new ViewHolder(); 
       holder.txtWeekdays=(CustomTextView)convertView.findViewById(R.id.weekdays); 
       convertView.setTag(holder); 
      } 
      ... 

,看看這是否會改善甚至解決您的情況。

+0

如果我僅從'convertView.setTag(holder)'附近刪除'ifs',它仍然顯示相同的行爲,即沒有字體。但是,如果我完全刪除了'if'('if(convertView == null)'),那麼它的工作效果令人驚訝。刪除if(convertView)== null'是否是好習慣? – input

+0

不,如果您沒有檢查convertView == null,那麼您可能會用完資源,爲列表項目創建太多視圖並繞過視圖回收。尊重convertView!= null並重新使用它們這一事實是一種很好的做法。 –

+0

如果你不使用'parent'參數會怎麼樣(我通過'''而不是'parent'來更改'原始答案'中的示例)。 –