2015-01-10 2 views
0

Я хочу создать собственный список, используя макет simple_list_item_1, чтобы изменить шрифт, фон и т. Д. Как вы это делаете?Как переопределить создание списка элементов в ListView?

Я попытался переопределить 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: скопируйте макет 'simple_list_item_1' в свой проект и внесите изменения в него. Вы найдете копии этого макета в вашей установке Android SDK. Шаг № 2: Используйте свой переработанный макет в конструкторе 'ArrayAdapter'. Шаг № 3: Если вы хотите иметь динамические эффекты на основе данных модели, переопределите 'getView()' и измените виджеты строк по мере необходимости. Просто убедитесь, что вы * всегда * изменяете виджеты строк, поскольку строки перерабатываются, и поэтому вы не обязательно знаете, что такое начальное состояние ваших виджетов. – CommonsWare

+0

", но всякий раз, когда я делаю что-то в списке (например, поиск), сгенерированный список теряет всякую настройку, пока я не скрою клавиатуру" - предположительно есть ошибка в реализации 'getView()'. Мы не можем вам помочь с этим, так как ваш вопрос не содержит ваш код 'getView(), не говоря уже о каком-либо описании точно, какая настройка была потеряна. Не стесняйтесь редактировать свой вопрос и добавлять этот материал, если вам нужна конкретная помощь. Скриншоты также будут полезны, но вам, возможно, придется загружать их в другое место и ссылаться на них здесь, так как у вас может не быть репутации для загрузки изображений напрямую. – CommonsWare

+0

@CommonsWare Я добавил пользовательский класс адаптера. В основном, когда я загружаю активность (и заполняю список), есть короткий момент, когда список неформатирован. Перед форматированием требуется секундная смена. – geft

ответ

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() по телефону getView(), где создается новый TextView, и что должен быть в тех случаях, когда convertView - null. Таким образом, следующие имеют меньше накладные расходы, но более рискованное, так как вы делаете какое-то предположение о реализации Вашего суперкласса: «Как вы идти об этом»

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

    if (convertView==null) { 
     text.setTypeface(_typeface); // because a new TextView definitely was created, since we could not reuse the convertView as it was null 
    } 

    return(text); 
} 
+0

Большое спасибо. Фактически, я выполнил ваше первое предложение (обнаружив фактический файл макета и изменив его), прежде чем увидеть ваш ответ, и он работал отлично. Тем не менее, ваш ответ здесь также отвечает на мой вопрос. Это было бы полезно для динамических дополнений. – geft

Смежные вопросы