Я боролся с этой проблемой на протяжении всей жизни моего проекта. У меня есть много списков в моем проекте, и большинство из них имеют заголовки. Я делаю отдельный файл макета и добавляю его в список с помощью addHeaderView(). Проблема в том, что когда данные (ArrayList, в моем случае) пустые, заголовок не отображается. После нескольких часов поиска способа повторного использования макета заголовка в качестве пустого представления я отказался и решил реплицировать макет кода и назначить его как пустой вид с помощью setEmptyView(). Проблема заключается в том, что многие заголовки содержат интерактивные представления, поэтому мне нужно удвоить всю мою интерактивную логику для каждого дублирующегося вида. Я пытался включить заголовок раньше, но не смог, в основном потому, что я до сих пор не совсем понимаю, как раздуты макетов и т.д.
Наконец, я придумал решение, которое хотел бы поделиться с сообществом, в случае, если у других возникла аналогичная проблема. Я не знаю, будет ли это лучший способ решить эту проблему, и любые отзывы или предложения, безусловно, будут приветствоваться.
вот код макета, который содержит представление списка списка:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
>
<ListView
android:id="@+id/lv_my_list"
style="@style/ListStyle"
android:headerDividersEnabled="false"
/>
<include
layout="@layout/my_list_header"
android:id="@+id/my_list_empty"
/>
</LinearLayout>
стиль определяет ширину и высоту макета между прочим.
теперь у меня есть файл макета, который содержит представление заголовка
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:id="@+id/my_list_header"
>
<Button
android:id="@+id/my_list_button"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Click Me"
/>
</LinearLayout>
Я знаю, что LinearLayout не очень эффективен, и я экспериментирую с использованием мер слияния или других мер эффективности, но это первая версия, которая работает, поэтому я собираюсь с ней на данный момент. Наконец, код:
// set up the header
myListView = (ListView)findViewById(R.id.lv_my_list);
View header = View.inflate(this, R.layout.my_list_header, null);
Button b = (Button)header.findViewById(R.id.my_list_button);
b.setOnClickListener(this);
myListView.addHeaderView(header);
// set up the empty view
LinearLayout ll = (LinearLayout)findViewById(R.id.my_list_empty);
b = (Button)ll.findViewById(R.id.my_list_button);
b.setOnClickListener(this);
meLocalListView.setEmptyView(ll);
Причина, по которой я завернул кнопку в макете, состоит в том, что я могу установить каждый экземпляр кнопки, чтобы использовать это как OnClickListener, а затем ссылаться на оба из них с одним id: R.id.my_list_button в моем методе onClick. Мне нужно проверить это намного больше, но, похоже, сейчас это работает. Я еще не реализовал его во всех моих списках, просто так, чтобы он не работал во всех ситуациях. Если у вас есть какие-либо предложения, сообщите мне, потому что это уже давно проблема для меня. Одна из проблем может заключаться в том, что если вы хотите создать экземпляр кнопки из идентификатора, вам, вероятно, придется снова пройти весь этот процесс, чтобы получить доступ к правильным идентификаторам?