为什么自定义字体适用于列表中的其他元素?

时间:2014-07-22 23:32:19

标签: android layout fonts android-adapter

我有一个列表,其中显示了一些联系人。为了简化操作,列表的最后一个元素是添加另一个联系人的添加按钮。添加按钮是使用特殊字体的+图标。我遇到的问题和它让我发疯的是,当我向下滚动列表然后回来时,有时(并非总是)顶部联系人将其字体更改为此特殊字体,如果我向下滚动它会发生相同对其他人。你知道问题是什么吗?

这是我的适配器:

public class CustomAdapter extends BaseAdapter {

private ArrayList<Contact> _data;
private Typeface font;
Context _c;

CustomAdapter (ArrayList<Contact> data, Context c, Typeface font){
    _data = data;
    _c = c;
    this.font=font;
}

public int getCount() {
    // TODO Auto-generated method stub
    return _data.size();
}

public Object getItem(int position) {
    // TODO Auto-generated method stub
    return _data.get(position);
}

public long getItemId(int position) {
    // TODO Auto-generated method stub
    return position;
}

public View getView(int position, View convertView, ViewGroup parent) {
    // TODO Auto-generated method stub
     View v = convertView;
     if (v == null)
     {
        LayoutInflater vi = (LayoutInflater)_c.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        v = vi.inflate(R.layout.list_single, null);
     }

       ImageView image = (ImageView) v.findViewById(R.id.photo_single);
       TextView name = (TextView)v.findViewById(R.id.name_single);


       Contact msg = _data.get(position);

       image.setImageBitmap(msg.getBlurredPhoto());
       name.setText(msg.getName());
       //to make sure that the font only applies to the add button, I also gave it 
       //the phone number "1"
       if((position==_data.size()-1)&&(msg.getNumber().equals("1"))){
          name.setTypeface(font);
          name.setText(R.string.icon_add);
          name.setTextColor(0xFF2c3e50);

       }


    return v;
}
}

这是它的布局:

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >

    <ImageView

        android:id="@+id/photo_single"
        android:layout_width="fill_parent"
        android:layout_height="100dp"
        android:scaleType="centerCrop"
         />

    <TextView

        android:id="@+id/name_single"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:textSize="40sp"
        android:textColor="#FFFFFF" />

1 个答案:

答案 0 :(得分:2)

您正在回收行,但您永远不会重置字体。如果您致电setTypeface()在特殊行上设置特殊字体,则还需要调用setTypeface()以返回常规行上的常规字体。

或者,实施getViewTypeCount()getItemViewType(),因此您的特殊字体行会与其他类型的行分开回收。