如何在ListView中覆盖项目列表创建?

时间:2015-01-10 15:36:18

标签: android listview android-listview

我想使用simple_list_item_1布局创建自定义列表,以便我可以更改字体,背景等。您如何进行此操作?

我尝试使用扩展getView的自定义适配器来覆盖ArrayAdapter,但每当我对列表执行某些操作(例如搜索)时,生成的列表将失去所有自定义,直到我最小化键盘。这就是为什么我认为如果我可以首先覆盖列表创建方法会更好。

这是自定义适配器类

public class AlphabeticalAdapter extends ArrayAdapter<String> implements SectionIndexer {
private HashMap<String, Integer> _alphaIndexer;
private String[] _sections;
private Typeface _typeface;

public AlphabeticalAdapter(Context c, int resource, List<String> data) {
    // create ArrayAdapter<String>
    super(c, resource, data);

    try {
        // generate typeface
        _typeface = Typeface.createFromAsset(getContext().getAssets(), "fonts/hs_bold.otf");
    } catch (Exception e) {
        e.printStackTrace();
    }
}

public int getPositionForSection(int section) {
    return _alphaIndexer.get(_sections[section]);
}

public int getSectionForPosition(int position) {
    return 1;
}

public Object[] getSections() {
    return _sections;
}

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

    TextView text = (TextView) convertView;

    if (text != null) {
        text.setTypeface(_typeface);
    }

    return super.getView(position, convertView, parent);
}

}

1 个答案:

答案 0 :(得分:1)

引述自己的评论:

  

步骤3:如果你想拥有基于模型数据的动态效果,请覆盖getView()并根据需要修改行小部件。只需确保您始终修改行小部件,因为行会被回收,因此您不一定知道小部件的起始状态是什么。

在您的情况下,您并不总是在每次getView()来电时定制小部件。您只有在convertView不是null时才会这样做。当您最初填充convertView时,null将为ListView

以下实现始终调用setTypeface()

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    TextView text=(TextView)super.getView(position, convertView, parent);

    text.setTypeface(_typeface);

    return(text);
}

现在,我还没有研究过调用setTypeface()的影响。理想情况下,它很便宜,所以每次调用它都可以。如果,OTOH,分析表明每次调用setTypeface()都会增加太多开销,那么你可以寻求优化问题。特别是,在这种情况下,您希望为每一行使用相同的字体 - 它不会根据您渲染的行而变化。在这种情况下,您只需要在创建新setTypeface()的{​​{1}}次来电时致电getView(),而 应该{{1>}是TextView。因此,以下开销较少但风险较大,因为您对超类的实现做了一些假设:

convertView