Для того, чтобы определенным айтемам списка задать различный вид необходимо создать, собственно, саму разметку для каждого вида айтема - как они будут выглядеть и в адаптере переопределить два метода:
getItemViewType(position) - содержит условие, по которому можно определить, айтем какого вида выводить в текущюю позицию. Возвращает идентификатор этого айтема.
getViewTypeCount() - возвращает количество айтемов разного вида.
Создадим простой список с двумя видами айтемов: item_normal.xml - общий вид и item_big.xml - вид с увеличенным шрифтом (размер шрифта задается прямо в разметке). Сами разметки я придумывать не буду - они должны реализовывать,как будут выглядеть айтемы для каждого вида.
Кастомный адаптер (простейший пример на основе ArrayAdapter - только важные для понимания части):
public class CustomAdapter extends ArrayAdapter
{
private LayoutInflater mInflater;
private static final int TYPE_1 = 0; // идентификатор айтема первого типа
private static final int TYPE_2 = 1; // идентификатор айтема второго типа
private ArrayList mItems;
public CustomAdapter(Context context, ArrayList items)
{
super(context, items);
mInflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
mItems = items;
}
public View getView(int position, View convertView, ViewGroup parent)
{
// получаем идентификатор вида айтема в текущей позиции
int type = getItemViewType(position);
View v = convertView;
//инфлейтим разметку айтема для текущей позиции
switch (type)
{
case TYPE_1:
v = mInflater.inflate(R.layout.item_normal, null);
break;
case TYPE_2:
v = mInflater.inflate(R.layout.item_big, null);
break;
default:
}
// Если айтемы разных видов содержат разные данные для отображения
// то разделяем биндинг:
//
// switch (type)
// {
// case TYPE_1: // биндинг данных в айтем первого вида.
//
// break;
// case TYPE_2: // биндинг данных в айтем второго вида.
//
// break;
// }
//
// Так как в вашем случае данные в айтемах не меняются, то для обоих
// биндинг одинаковый и его не нужно разделять.
String text = mItems.get(position); // извлекаем данные
TextView tv = (TextView) v.findViewById(R.id.text);
tv.setText(text); // размещаем в айтем
return v;
}
@Override
public int getItemViewType(int position)
{
// Здесь нужно определить вторую видимую позицию
// и вернуть идентификатор айтема второго типа
// иначе - айтема первого типа
// Надо подумать.
return (twoPosition) ? TYPE_2 : TYPE_1;
}
@Override
public int getViewTypeCount() {
return 2; // два различных вида айтемов
}
}
Поскольку в вашем случае внешний вид разных айтемов не отличается ни чем, кроме цвета и размера шрифта, то все эти отличия вы задаете непосредственно в разметке - биндить данные отдельно не требуется.
В более сложных случаях вы можете использовать любые независимые данные для разных видов айтемов, которые могут содержать абсолютно разные разметки и разделять их наполнение через switch - case в закоментированном блоке.
В реальном адаптере лучше использовать холдеры и прочие оптимизации
ListViewее не решить. Скорее всего, вам нужно реализовать что то по мотивам этой библиотеки, только не со строками, а с айтемами. – pavlofff Oct 16 '15 at 04:35ListView, у него есть методgetFirstVisiblePosition(), который возвращает номер той позиции в адаптере, которая находится в первой видимой позиции списка. Со стороны адаптера это, по всей видимости, не реализовать и мой ответ нельзя считать правильным. – pavlofff Oct 16 '15 at 04:44