Мне нужен не прокручиваемый 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)
Это также отключает выбор строк.