Android Как использовать макет заголовка как пустое представление в ListView - PullRequest
3 голосов
/ 25 января 2011

Я боролся с этой проблемой на протяжении всей жизни моего проекта.У меня есть много списков в моем проекте, и большинство из них имеют заголовки.Я делаю отдельный файл макета и добавляю его в список, используя 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, а затем ссылаться на них обоих с одним идентификатором:R.id.my_list_button в моем методе onClick.Мне нужно проверить это намного больше, но пока это работает.Я еще не реализовал его во всех своих списках, только один, чтобы он не работал во всех ситуациях.Если у вас есть какие-либо предложения, пожалуйста, дайте мне знать, потому что это проблема для меня в течение долгого времени.Одной из проблем может быть то, что если вы хотите создать экземпляр кнопки из идентификатора, вам, вероятно, придется снова пройти весь этот процесс, чтобы получить правильные идентификаторы?

Ответы [ 2 ]

1 голос
/ 27 апреля 2012

Если вы хотите показать заголовок ListView, когда список пуст, то вы действительно хотите показать сам список, а не отдельное пустое представление.Итак, самый простой способ - проверить, является ли ваш список пустым, и установить список видимым, если его еще нет:

getListView().setVisibility(View.VISIBLE);

Это очень легко проверить с помощью следующего кода:

public class TestListActivity extends ListActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.test_listview);

        // create the empty grid item mapping
        String[] from = new String[] {};
        int[] to = new int[] {};

        // prepare the empty list
        List<HashMap<String, String>> fillMaps = new ArrayList<HashMap<String, String>>();

        // fill in the grid_item layout
        SimpleAdapter adapter = new SimpleAdapter(this, fillMaps, R.layout.test_listitem, from, to);

        View listHeader = 
                ((LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE))
                .inflate(R.layout.test_listheader, null, false);

        getListView().addHeaderView(listHeader);
        getListView().setAdapter(adapter);
    }
}

Список пуст, но заголовок виден.

0 голосов
/ 13 марта 2011

Мое решение - создать представление с макетом для заголовка, но установить фон таким же, как элементы списка.android: background = "@ android: drawable / list_selector_background"

Но мое решение не работает, если я использую 'include' для встраивания макета заголовка из другого файла макета.Не знаю почему.

...