如何获得一个不可滚动的ListView?
我应该想要一个不可滚动的ListView,并显示整个ListView。 这是因为我的整个屏幕是一个ScrollView,我用一个RelativeLayout调度小部件,所以我不需要ListView滚动。
我用代码设置了我的用户界面,而不是用xml。
我已经使用listView.setScrollContainer(false)
,但它不工作,我不明白为什么。
谢谢。
不要把一个列表视图滚动视图,它不起作用。 如果你想要一个不滚动的项目列表,它被称为线性布局。
正确的答案在这里。
只需将此侦听器分配给您的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; } });
我find了一个非常简单的解决scheme。 只需获取listview的适配器,并在显示所有项目时计算其大小。 优点是这个解决scheme也可以在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);
上面显示的function是对以下内容的修改: 禁用在列表视图中滚动
请注意,在将适配器设置为列表视图后调用此函数。 如果适配器中条目的大小发生了变化,则还需要调用该函数。
根据你正在尝试做什么,你可能能够通过抛弃ScrollView
来解决你的问题,而使用ListView
的addHeaderView(View)
和addFooterView(View)
。
我想出了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); }
禁用滚动,你可以使用listview.setEnabled(false)
这也会禁用行select。