Как получить не прокручиваемый 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);
}