我想使用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);
}
}
答案 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