Как заставить ListView расти до размера контента - PullRequest
0 голосов
/ 16 марта 2010

Итак, у меня довольно сложное действие, родительский элемент которого представляет собой линейный макет с таблицей с некоторой базовой информацией и кнопками. Затем пара списков, в которые пользователь может добавлять элементы. Таким образом, эти списки увеличиваются по мере того, как пользователь использует приложение. Проблема, с которой я сталкиваюсь, заключается в том, что Linearlayout больше, чем разрешение экрана, поэтому его нужно прокручивать. Таким образом, прокрутка не работает на ListViews. Я попытался поиграть с изменением layout_height списка и его дочернего элемента, но безуспешно. Есть ли способ сделать так, чтобы эти списки пар расширились до количества детей? Или я все об этом говорю не так? Если да, какие другие элементы управления я могу использовать?

Я открыт для любых идей. Я просто не знаю, как это сделать.

Спасибо

Ответы [ 2 ]

1 голос
/ 27 марта 2012

Если у вас простая компоновка, вы можете заменить компонент ListView на LinearLayout и вручную запрограммировать все функции, необходимые для добавления / удаления, и щелкнуть элементы внутри него.

Вот мой простой пример. refreshStudentList() занял место notifyDataSetChanged(), вызываемого на адаптере, recentConnections - это LinearLayout, а adapter - это экземпляр Adapter (Вы можете использовать адаптер, который вы использовали для своего ListView):

private void refreshStudentList() {
    recentConnections.removeAllViews();

    for(int i=0; i < adapter.getCount(); i++) {
        View toAdd = adapter.getView(i, null, recentConnections);
        final int position = i;
        toAdd.setOnClickListener(new OnClickListener() {

            public void onClick(View v) {
                // onItemClick functionality here
            }
        });

        recentConnections.addView(toAdd, new LayoutParams(LayoutParams.MATCH_PARENT, 
                (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 50, getResources().getDisplayMetrics())));
    }

    recentConnections.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));
}

Как видите, вместо onItemClickListener я установил onClick слушатель для каждого элемента списка. Это можно легко изменить, чтобы он был onTouch слушателем, если вы хотите реализовать внешний вид нажатия на элемент списка (путем изменения фона представления на MotionEvent.ACTION_DOWN и MotionEvent.ACTION_UP).

Еще одна вещь, которую вам нужно отметить, это то, что я жестко закодировал значение dp для высоты каждого значения (50dp в данном случае). Когда вы создаете и раздувает представления программно, у них нет значения «height», поэтому «wrap_content» становится равным 0.

также, notifyDataSetChanged() на вашем адаптере ничего не сделает.

Как я уже сказал, это простое решение, но это начало создания собственного пользовательского компонента ExtendingListView, если это то, к чему вы в конечном итоге стремитесь.

1 голос
/ 16 марта 2010

Проблема, с которой я сталкиваюсь, заключается в Linearlayout больше, чем разрешение экрана и так нужно прокрутить. Итак, прокрутка не работает в списках просмотра.

Вам необходимо переосмыслить способ построения пользовательского интерфейса, поскольку вы не можете иметь ListViews внутри ScrollView.

Одна из возможностей - поместить все в ListView, пометив некоторые строки как недоступные для нажатия, поэтому ListView справится с прокруткой. Вы можете использовать мой MergeAdapter для подобных случаев.

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