gpt4 book ai didi

android - 将自定义字体应用于带有节标题的 ListView

转载 作者:行者123 更新时间:2023-11-29 18:01:18 26 4
gpt4 key购买 nike

我正在运行下面的代码:

public class SeparatedListAdapter extends BaseAdapter
{
public final Map<String, Adapter> sections = new LinkedHashMap<String, Adapter>();
public final ArrayAdapter<String> headers;
public final static int TYPE_SECTION_HEADER = 0;

public SeparatedListAdapter(Context context)
{
headers = new ArrayAdapter<String>(context, R.layout.list_header);
}

public void addSection(String section, Adapter adapter)
{
this.headers.add(section);
this.sections.put(section, adapter);
}

@Override
public Object getItem(int position)
{
for (Object section : this.sections.keySet())
{
Adapter adapter = sections.get(section);
int size = adapter.getCount() + 1;

// check if position inside this section
if (position == 0) {
return section;
}
if (position < size) {
return adapter.getItem(position - 1);
}

// otherwise jump into next section
position -= size;
}
return null;
}

@Override
public int getCount()
{
// total together all sections, plus one for each section header
int total = 0;
for (Adapter adapter : this.sections.values()) {
total += adapter.getCount() + 1;
}
return total;
}

@Override
public int getViewTypeCount()
{
// assume that headers count as one, then total all sections
int total = 1;
for (Adapter adapter : this.sections.values()) {
total += adapter.getViewTypeCount();
}
return total;
}

@Override
public int getItemViewType(int position)
{
int type = 1;
for (Object section : this.sections.keySet())
{
Adapter adapter = sections.get(section);
int size = adapter.getCount() + 1;

// check if position inside this section
if (position == 0) {
return TYPE_SECTION_HEADER;
}
if (position < size) {
return type + adapter.getItemViewType(position - 1);
}

// otherwise jump into next section
position -= size;
type += adapter.getViewTypeCount();
}
return -1;
}

public boolean areAllItemsSelectable()
{
return false;
}

@Override
public boolean isEnabled(int position)
{
return (getItemViewType(position) != TYPE_SECTION_HEADER);
}

@Override
public View getView(int position, View convertView, ViewGroup parent)
{
int sectionnum = 0;
for (Object section : this.sections.keySet())
{
Adapter adapter = sections.get(section);
int size = adapter.getCount() + 1;

// check if position inside this section
if (position == 0) {
return headers.getView(sectionnum, convertView, parent);
}
if (position < size) {
return adapter.getView(position - 1, convertView, parent);
}

// otherwise jump into next section
position -= size;
sectionnum++;
}
return null;
}

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

}

标题.xml

<!-- list_header.xml -->
<TextView
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/list_header_title"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:paddingTop="2dip"
android:paddingBottom="2dip"
android:paddingLeft="5dip"
android:textSize="20sp"
style="?android:attr/listSeparatorTextViewStyle" />

LIST_ITEM.xml

<?xml version="1.0" encoding="utf-8"?>
<!-- list_item.xml -->
<TextView
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/list_item_title"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:paddingTop="15dip"
android:paddingBottom="15dip"
android:paddingLeft="15dip"
android:textSize="24sp"/>

我是这样设置的:

adapter.addSection(header, new ArrayAdapter<String>(this, R.layout.list_item, array));

一切正常。现在我需要以编程方式将自定义字体 .ttf 添加到页眉和部分,该怎么做?

最佳答案

在您的 getView 方法中,您可以替换以下行

if (position == 0) {
return headers.getView(sectionnum, convertView, parent);
}
if (position < size) {
return adapter.getView(position - 1, convertView, parent);
}

View view = null;
if (position == 0) {
view = headers.getView(sectionnum, convertView, parent);
if(view != null) {
TextView text = (TextView) view.findViewById(R.id.list_header_title);
if(text != null) {
text.setTypeface(myTypeface);
}
}
return view;
}
if (position < size) {
view = adapter.getView(position - 1, convertView, parent);
TextView text = (TextView) view.findViewById(R.id.list_item_title);
if(view != null) {
if(text != null) {
text.setTypeface(myTypeface);
}
}
return view;
}

其中 myTypeFace 是类型 TypeFace 的成员,并按如下方式加载到构造函数中:

private TypeFace myTypeFace = null;    

public SeparatedListAdapter(Context context)
{
headers = new ArrayAdapter<String>(context, R.layout.list_header);
myTypeface = Typeface.createFromAsset(context.getAssets(), "fonts/myFont.ttf");
}

这会将放置在 assets/fonts/myFont.ttf 中的字体分配给您的 TextView 。但是你应该注意,如果你在应用程序的其他地方需要字体,你可能不应该把它放在适配器中,而是从自定义字体管理器或其他东西加载它,因为旧版本的 android 不会缓存字体时 createFromAsset 被调用,这将导致不必要的内存消耗。

关于android - 将自定义字体应用于带有节标题的 ListView ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15956032/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com