Как получить прокручиваемый ListView?

Мне нужен не прокручиваемый ListView и показать весь ListView. Это потому, что весь экран - это ScrollView, и я отправляю виджеты с RelativeLayout, поэтому мне не нужен прокрутка ListView.

Я установил свой ui с кодом, а не с xml.

Я использовал listView.setScrollContainer(false), но он не работает, я не понимаю, почему.

Спасибо.

Ответ 1

Не помещайте listview в scrollview, это не работает. Если вам нужен список элементов, которые не прокручиваются, он называется linearlayout.

Ответ 2

Правильный ответ находится здесь.

Просто назначьте этот прослушиватель вашему ListView:

    listView.setOnTouchListener(new OnTouchListener() {

    public boolean onTouch(View v, MotionEvent event) {
        if (event.getAction() == MotionEvent.ACTION_MOVE) {
            return true; // Indicates that this has been handled by you and will not be forwarded further.
        }
        return false;
    }
});

Ответ 3

Я нашел для этого очень простое решение. Просто получите адаптер списка и вычислите его размер, когда будут показаны все элементы. Преимущество заключается в том, что это решение также работает внутри ScrollView.

Пример:

public void justifyListViewHeightBasedOnChildren (ListView listView) {

    ListAdapter adapter = listView.getAdapter();

    if (adapter == null) {
        return;
    }
    ViewGroup vg = listView;
    int totalHeight = 0;
    for (int i = 0; i < adapter.getCount(); i++) {
        View listItem = adapter.getView(i, null, vg);
        listItem.measure(0, 0);
        totalHeight += listItem.getMeasuredHeight();
    }

    ViewGroup.LayoutParams par = listView.getLayoutParams();
    par.height = totalHeight + (listView.getDividerHeight() * (adapter.getCount() - 1));
    listView.setLayoutParams(par);
    listView.requestLayout();
}

Вызов этой функции, проходящей через объект ListView:

justifyListViewHeightBasedOnChildren(myListview);

Функция, показанная выше, является модификацией сообщения в: Отключить прокрутку списка в списке

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

Ответ 4

В зависимости от того, что именно вы пытаетесь сделать, вы можете решить свою проблему, нажав ScrollView и вместо этого используя ListView addHeaderView(View) и addFooterView(View).

Ответ 5

Я придумал BaseAdapterUnscrollable. В основном это просто добавляет представления в контейнер ViewGroup. Реализация немного похожа на BaseAdapter. Его довольно удобно, если вы используете несколько прокручиваемых списков, подобных этому в проекте.

В onCreate:

 PeopleAdapter peopleAdapter = new PeopleAdapter(this, personList, containerPeopleLinearLayout);
 peopleAdapter.setOnItemClickListener(this);
 peopleAdapter.drawItems();

Ваш конкретный адаптер:

public class PeopleAdapter extends BaseAdapterNonScrollable<Person> {

public PeopleAdapter(Context context, List<Person> items, LinearLayout container) {
    super(context, items, container);
}

@Override
public View getView(View container, Person person) {
    TextView textView = (TextView) LayoutInflater.from(context).inflate(android.R.layout.simple_list_item_1, null);
    textView.setText(person.getName());
    return textView;
}

}

BaseAdapterNonScrollable (просто скопировать):

public abstract class BaseAdapterNonScrollable<T> implements NonScrollable, OnItemClick {

public Context context;
private ViewGroup containerViewGroup;
private List<T> itemObjectList;
private OnItemClick itemClickListener;

public BaseAdapterNonScrollable(Context context, List<T> items, ViewGroup containerViewGroup) {
    this.context = context;
    this.itemObjectList = items;
    this.containerViewGroup = containerViewGroup;
}

@Override
public void drawItems() {
    if (containerViewGroup == null || itemObjectList.size() == 0) {
        return;
    }

    if (containerViewGroup.getChildCount() > 0) {
        containerViewGroup.removeAllViews();
    }

    //draw all items
    for (int i = 0; i < itemObjectList.size(); i++) {
        final int position = i;
        final View itemView = getView(containerViewGroup, itemObjectList.get(i));
        if (itemView != null) {
            containerViewGroup.addView(itemView);
            //handle item click event
            itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    if (itemClickListener != null) {
                        itemClickListener.onItemClick(itemObjectList, position);
                    }
                }
            });
        }
    }
}

public void setOnItemClickListener(OnItemClick onItemClick) {
    this.itemClickListener = onItemClick;
}

public abstract View getView(View container, T itemObject);

@Override
public void onItemClick(List<?> itemList, int position) {
}

}

Интерфейсы

public interface NonScrollable {
    void drawItems();
}

public interface OnItemClick {
    void onItemClick(List<?> itemList, int position);
}

Ответ 6

чтобы отключить прокрутку, вы можете использовать listview.setEnabled(false)

Это также отключает выбор строк.