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

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

Я установил свой интерфейс с кодом, а не с XML.

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

Благодарю.

7 ответов

Решение

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

Я нашел очень простое решение для этого. Просто возьмите адаптер списка и рассчитайте его размер, когда все элементы будут показаны. Преимущество состоит в том, что это решение также работает внутри 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);

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

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

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

Просто назначьте этого слушателя вашему 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;
    }
});

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

Я добился этого, передав свойство физики в ListView:

      ListView.builder(
  --->  physics: ScrollPhysics(), <-----
        shrinkWrap: true,
        itemCount: items.length,
        itemBuilder: (context, index) {
          return //ListTile or whatever

Примечание. Этот ListView находится внутри столбца с другими виджетами, а столбец заключен в SingleChildScrollView.

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

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

Я придумал 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);
}
Другие вопросы по тегам