Как добавить нижний колонтитул в ListView?

88

Я разрабатываю приложение. В своем приложении я использую Listview для отображения данных с помощью синтаксического анализа dom, я хочу, чтобы нижний колонтитул в списке, когда я нажимал нижний колонтитул, добавлял дополнительные данные в представление списка, я прикреплял изображение, я хотел бы этот дизайн и Пожалуйста, обратитесь к image1 и imgae2.Я упоминаю нижний колонтитул в красном прямоугольнике

Fig1-Footer, как "Больше новостей"
альтернативный текст

альтернативный текст

Fig2-Добавить дополнительные 10 записей, добавленных в список

Джонник
источник

Ответы:

205

Создайте макет представления нижнего колонтитула, состоящий из текста, который вы хотите установить в качестве нижнего колонтитула, а затем попробуйте

View footerView = ((LayoutInflater) ActivityContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE)).inflate(R.layout.footer_layout, null, false);
ListView.addFooterView(footerView);

Макет нижнего колонтитула может быть примерно таким:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:paddingTop="7dip"
    android:paddingBottom="7dip"
    android:orientation="horizontal"
    android:gravity="center">

    <LinearLayout 
        android:id="@+id/footer_layout" 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        android:gravity="center"
        android:layout_gravity="center">

    <TextView 
        android:text="@string/footer_text_1" 
        android:id="@+id/footer_1" 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:textSize="14dip" 
        android:textStyle="bold" 
        android:layout_marginRight="5dip" />
    </LinearLayout>
</LinearLayout> 

Класс активности может быть:

public class MyListActivty extends ListActivity {
    private Context context = null;
    private ListView list = null;

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        list = (ListView)findViewById(android.R.id.list);

        //code to set adapter to populate list
        View footerView =  ((LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE)).inflate(R.layout.footer_layout, null, false);
        list.addFooterView(footerView);
    }
}
Шайрин
источник
7
Это хорошо, но что, если вы хотите, чтобы нижний колонтитул был ИСПРАВЛЕНО на экране, а не отображался только при прокрутке вниз? А что, если вы хотите, чтобы нижний колонтитул был виден, даже когда список ПУСТО? См. Полный вопрос на stackoverflow.com/questions/12353701/… .
gcl1
33
У меня были проблемы с работой этого кода, и я решил их. Вот что говорится в документации addFooterView ()NOTE: Call this before calling setAdapter. This is so ListView can wrap the supplied cursor with one that will also account for header and footer views.
demosten
13
@ gcl1 В этом случае это не нижний колонтитул, а просто обычный элемент в вашем макете, который находится под представлением списка. Просто, знаете, поместите его под списком?
Davor
2
Просто крик @demonsten: если вы вызовете setAdapter () перед добавлением представлений, у вас будут плохие времена.
Бен Огорек
1
если в адаптере нет данных, нижний колонтитул не прикрепляется (отображается). Итак, как мы можем отображать нижний колонтитул, даже если в адаптере нет данных? спасибо
Kalpesh Lakhani
10

Ответы здесь немного устарели. Хотя код остался прежним, есть некоторые изменения в поведении.

public class MyListActivity extends ListActivity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        TextView footerView = (TextView) ((LayoutInflater) this.getSystemService(Context.LAYOUT_INFLATER_SERVICE)).inflate(R.layout.footer_view, null, false);
        getListView().addFooterView(footerView);
        setListAdapter(new ArrayAdapter<String>(this, getResources().getStringArray(R.array.news)));
    }
}

Информация о addFooterView()методе

Добавьте фиксированный вид, который будет отображаться в нижней части списка. Если addFooterView()вызывается более одного раза, представления будут отображаться в том порядке, в котором они были добавлены. Представления, добавленные с помощью этого вызова, могут получить фокус, если захотят.

Большинство приведенных выше ответов подчеркивают очень важный момент -

addFooterView()должен быть вызван перед вызовом. setAdapter()Это значит, что ListView может обернуть предоставленный курсор курсором, который также будет учитывать представления верхнего и нижнего колонтитула.

С Китката это изменилось.

Примечание. При первом появлении этот метод можно было вызвать только перед установкой адаптера с помощью setAdapter (ListAdapter). Начиная с KITKAT, этот метод можно вызывать в любое время. Если адаптер ListView не расширяет HeaderViewListAdapter, он будет заключен в оболочку с поддерживающим экземпляром WrapperListAdapter.

Документация

Аникет Такур
источник
9

Я знаю, что это очень старый вопрос, но я погуглил здесь и обнаружил, что полученный ответ не удовлетворяет на 100%, потому что, как упоминалось в gcl1 - таким образом, нижний колонтитул на самом деле не является нижним колонтитулом экрана - это просто "надстройка" "в список.

Итог - для тех, кто может найти здесь свой путь в Google - я нашел здесь следующее предложение: Фиксированный и всегда видимый нижний колонтитул под ListFragment

Попробуйте сделать следующее, где акцент делается на кнопке (или любом элементе нижнего колонтитула), указанной первой в XML, а затем список добавляется как «layout_above»:

<RelativeLayout>

<Button android:id="@+id/footer" android:layout_alignParentBottom="true"/> 
<ListView android:id="@android:id/list" **android:layout_above**="@id/footer"> <!-- the list -->

</RelativeLayout>
Офер Ландо
источник
6

Если ListView является дочерним элементом ListActivity:

getListView().addFooterView(
    getLayoutInflater().inflate(R.layout.footer_view, null)
);

(внутри onCreate ())

Андрей
источник
2

Действие, в котором вы хотите добавить нижний колонтитул списка, и я также создал событие при щелчке нижнего колонтитула списка.

  public class MainActivity extends Activity
{

        @Override
        protected void onCreate(Bundle savedInstanceState)
         {

            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);

            ListView  list_of_f = (ListView) findViewById(R.id.list_of_f);

            LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);

            View view = inflater.inflate(R.layout.web_view, null);  // i have open a webview on the listview footer

            RelativeLayout  layoutFooter = (RelativeLayout) view.findViewById(R.id.layoutFooter);

            list_of_f.addFooterView(view);

        }

}

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@drawable/bg" >

    <ImageView
        android:id="@+id/dept_nav"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@drawable/dept_nav" />

    <ListView
        android:id="@+id/list_of_f"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@+id/dept_nav"
        android:layout_margin="5dp"
        android:layout_marginTop="10dp"
        android:divider="@null"
        android:dividerHeight="0dp"
        android:listSelector="@android:color/transparent" >
    </ListView>

</RelativeLayout>
AndroidGeek
источник
0

В этом вопросе лучший ответ мне не подходит. После этого я нашел этот метод для отображения нижнего колонтитула списка,

LayoutInflater inflater = getLayoutInflater();
ViewGroup footerView = (ViewGroup)inflater.inflate(R.layout.footer_layout,listView,false);
listView.addFooterView(footerView, null, false);

И создайте новый макет с вызовом footer_layout

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <TextView
        android:id="@+id/tv"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Done"
        android:textStyle="italic"
        android:background="#d6cf55"
        android:padding="10dp"/>
</LinearLayout>

Если не работает, обратитесь к этой статье, послушайте

Кусал Тиванка
источник
0

вы можете использовать stackLayout, внутри этого макета вы можете поместить список в рамку, например:

<StackLayout VerticalOptions="FillAndExpand">
            <ListView  ItemsSource="{Binding YourList}"
                       CachingStrategy="RecycleElement"
                       HasUnevenRows="True">

                <ListView.ItemTemplate>
                    <DataTemplate>
                        <ViewCell >
                            <StackLayout  Orientation="Horizontal">
                                <Label Text="{Binding Image, Mode=TwoWay}" />

                            </StackLayout>
                        </ViewCell>
                    </DataTemplate>
                </ListView.ItemTemplate>
            </ListView>
            <Frame BackgroundColor="AliceBlue" HorizontalOptions="FillAndExpand">
                <Button Text="More"></Button>
            </Frame>
        </StackLayout>

вот результат:

введите описание изображения здесь

x-rw
источник