Добавление TextView над элементами ListView для прокрутки элементов ListView

Я пытаюсь добавить представление над ListView в ListFragment (мой фрагмент расширяет ListFragment).

Я использую адаптер для размещения элементов в ListView.

Чего я не могу добиться, так это поместить другой вид (в этом случае TextView будет в порядке), который появляется над элементами списка и прокручивает их.

Я попытался изменить суперкласс Fragment на Fragment и добавить макет с TextView и ListView, и проблема в том, что таким образом TextView не прокручивает элементы ListView.

Я также попытался добавить ScrollView и поместить в него как TextView, так и ListView, но таким образом ListView не прокручивается.

Я также пытался вручную добавить объект в ArrayAdapter ListFragment (это была первая попытка), а затем соответствующим образом изменить макет элемента ListView, но проблема в том, что он не появится (я не знаю, почему).

Любая помощь будет оценена по достоинству. Спасибо!


person Tigger    schedule 10.04.2013    source источник


Ответы (1)


Вам нужно использовать ListView.addHeaderView().

Вы не можете сделать это в XML.

public View onCreateView(LayoutInflater li, ViewGroup vg, Bundle b)
{
    ViewGroup result = (ViewGroup) super.onCreateView(li, vg, b);
    TextView tv = new TextView(this);
    tv.setText("lalala");
    ListView lv = result.findViewById(android.R.id.list);
    lv.addHeaderView(tv);
    return result;
}
person j__m    schedule 10.04.2013
comment
В порядке! Это работает. Но только визуально! Данные о предметах меняются местами. В первом элементе это данные из второго элемента списка, а в заголовке списка - данные из первого элемента списка... - person Tigger; 10.04.2013
comment
Это зависит от того, откуда вы получаете данные. Ваш адаптер будет возвращать только те данные, о которых он знает. Если вы вызываете getAdapter() в ListView или используете ListView.getItemAtPosition(), он будет использовать свой собственный внутренний адаптер, который знает, как смещать позиции элементов перед вызовом вашего адаптера. - person j__m; 10.04.2013
comment
Это помогает, но, как я уже сказал, не решает мою проблему, поскольку меняет местами данные элемента списка с первого элемента на заголовок списка, со второго на первый и т. д., хотя визуально это выглядит правильно. У меня есть индивидуальный адаптер, который я устанавливаю с помощью setListAdapter(MyListAdapter); и добавление к первой проблеме заключается в том, что я должен сделать setListAdapter для метода onResume ListFragment. Это приводит к тому, что когда я возвращаюсь к этому фрагменту из другого фрагмента, который был вызван, он пытается добавить заголовок в метод onResume, и тогда приложение взрывается. - person Tigger; 10.04.2013
comment
Я пытаюсь понять, что вы упомянули в ListView.getItemAtPosition и передали addHeader методу onCreateView ListFragment, и я вернусь, как только закончу пробовать. Не беспокойтесь об этом, конечно, я приму ваш ответ как правильный, как только решу свою проблему. Спасибо! - person Tigger; 10.04.2013
comment
Вы должны использовать метод onCreateView() для установки заголовка. Таким образом, это делается только один раз. Что я говорю о других вещах, так это то, что ListView считает заголовок первым элементом в ListView, а первый элемент в вашем адаптере становится вторым элементом в ListView и т. д. Это нормально. Если вы используете ListView.getItemAtPosition() или ListView.getListAdapter(), он позаботится о смещении за вас. Если вы пытаетесь получить данные для любого элемента, напрямую вызывая свой адаптер, вы всегда можете просто вычесть его самостоятельно. - person j__m; 10.04.2013
comment
Нет, на CreateView тоже не работает, так что только на Resume. При таком подходе использование пользовательского адаптера невозможно. Так что это не решит мою проблему =/ Спасибо в любом случае! ;) Если у вас есть еще советы, я был бы признателен! - person Tigger; 10.04.2013
comment
Я отредактировал ответ, чтобы продемонстрировать, как использовать onCreateView() из ListFragment. - person j__m; 10.04.2013
comment
Вероятно, лучшее место для установки вашего адаптера — onActivityCreated. - person j__m; 10.04.2013
comment
С тем, что мы обсуждали, все получилось отлично! Необходимо было установить адаптер на onActivityCreated() и макет для всего экрана (компонент View плюс ListView) на onCreateView(). В адаптере вместо использования MyData (объект ArrayList MyData) я использовал ListView.getItemAtPosition(position) в getView() адаптера. Я также создал установщик для ListView в адаптере, который я использую в ListFragment, в onActivityCreated() перед вызовом setListAdapter(). Всем большое спасибо за помощь =) - person Tigger; 11.04.2013