如何获得一个不可滚动的ListView?

14
我希望得到一个不可滚动的ListView,并显示整个ListView。因为我的整个屏幕是ScrollView,并使用RelativeLayout分派小部件,所以我不需要ListView滚动。
我使用代码设置ui,而非xml。
我已经使用“listView.setScrollContainer(false)”,但它并没有起作用,我不明白为什么。
谢谢。
7个回答

16

我找到了一个非常简单的解决办法。只需获取列表视图的适配器并在显示所有项目时计算其大小即可。

优点是,此解决方案还可以在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);
上面展示的函数是对以下帖子的修改: Disable scrolling in listview
请注意,在将适配器设置到列表视图之后调用此函数。如果适配器中的条目大小已更改,则还需要调用此函数。

2
谢谢。你的回答很好。应该有一种方法只让列表视图知道这正是我们想要的(我需要一个包含小型列表视图的滚动视图,由于我正在重用带有列表视图的片段,所以我不想更改并使用LinearLayout)。我没有找到更好的方法来做到这一点,所以你的答案基本上是我能找到的最好的答案。希望它能得到更多的赞。它值得。 - acrespo

13

正确答案在这里。

只需将此监听器分配给您的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;
    }
});

12

不要在ScrollView中放置ListView,它不起作用。如果您想要一个不滚动的项目列表,则称为LinearLayout。


1
是的,我知道怎么做,谢谢。但是当我点击一行时,如何像ListView一样执行相同的操作?(抱歉,我是一个Android新手。) - Istao
3
你可以将一个 OnClickListener 或 OnTouchListener 绑定到一个视图上,当它被点击或触摸时会触发相应的动作。 - Flo
2
如果您想从ListView中获取其他功能,例如选择项目、CursorAdapter等,该怎么办? - Timmmm
7
我该如何将一个适配器(Lazy Loader)设置到一个LinearLayout中? - happyhardik
@Timmmm,如果你的数据不会改变,那么你可能只需要一个游标适配器。否则,只需迭代游标的结果即可。然而,围绕任何列表适配器构建一个包装器并不难,该包装器将在适配器上注册一个DataSetObserver。 - gatoatigrado

5

0

要禁用滚动,您可以使用listview.setEnabled(false)

这也会禁用行选择。


它将会禁用一切。OP只想要禁用滚动。 - bhavya joshi

0
我想出了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);
}

0
我通过将物理属性传递到ListView中来实现这一点:
ListView.builder(
  --->  physics: ScrollPhysics(), <-----
        shrinkWrap: true,
        itemCount: items.length,
        itemBuilder: (context, index) {
          return //ListTile or whatever

注意:此 ListView 位于包含其他小部件的列中,并且该列被包装在 SingleChildScrollView 中。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接