Я знаю, как добавить заголовок или нижний колонтитул в JAVA, но мне было интересно, могу ли я добавить его прямо в XML. Я бы не хотел симулировать это, но на самом деле добавить его как нижний колонтитул или заголовок!
Добавить верхний/нижний колонтитул в списке в xml
Ответ 1
Нет, я не думаю, что это возможно. На основе Исходный код ListView из атрибутов XML доступны только overScrollHeader/overScrollFooter
. Но эти атрибуты принимают только чертежи.
Если вы не хотите использовать трюки с макетами выше/ниже ListView
. Вы можете расширить ListView
и реализовать собственную поддержку нижнего колонтитула и заголовка в настраиваемом View
. Это не так сложно, потому что нижний колонтитул и заголовок уже реализованы. Вам нужно только добавить XML-атрибуты в свой конструктор View.
Ответ 2
Я просто пытался добиться того же самого (чтобы очистить мой код и использовать XML для разметки и исходного кода для логики), но единственным решением, которое я нашел, является определение вида заголовка с XML где-то в вашем макете, а затем отделите его и вставьте в ListView в качестве заголовка.
Например, имея этот XML:
<ListView android:id="@+id/myListView">
</ListView>
<LinearLayout android:id="@+id/myHeader">
....
</LinearLayout>
Вы можете сделать это в своем коде:
ListView myListView = (ListView) findViewById(R.id.myListView);
LinearLayout myHeader = (LinearLayout) findViewById(R.id.myHeader);
// Let remove the myHeader view from it current child...
((ViewGroup) myHeader.getParent()).removeView(myHeader);
// ... and put it inside ListView.
myListView.addFooterView(myHeader);
В принципе, здесь мы просто отсоединяем раздутый LinearLayout от его родителя и устанавливаем его как дочерний элемент списка ListView.
Это не идеальное решение, но оно все же проще, чем создание/раздувание заголовка вручную. Кроме того, это использует силу XML-инфляции и повторное использование, если вы используете это внутри некоторого шаблона "держатель".
Надеюсь, это поможет кому-то.
Ответ 3
Вот как это сработало для меня, в моем классе Adapter, который расширяет BaseAdapter. Я нацелен на API 23:
@Override
public View getView(int position, View view, ViewGroup parent) {
if (position == 0) {
if (view == null) {
LayoutInflater layoutInflater = LayoutInflater.from(mContext);
view = layoutInflater.inflate(R.layout.test_results_header, parent, false);
}
} else {
if (view == null) {
LayoutInflater layoutInflater = LayoutInflater.from(mContext);
view = layoutInflater.inflate(R.layout.test_result_item, parent, false);
}
}
Довольно просто, я раздуваю XML-заголовок для позиции 0 и контент XML для остальных. Если вам известна позиция, в которой вы хотите заголовок или любой другой XML, в вашей логике вам нужно будет проверить позицию и раздуть соответствующий XML для этой позиции.