2

我想设置 listview 以显示所有项目而不滚动。
下面是我的布局:

<LinearLayout
          android:id="@+id/layout"
      android:layout_width="match_parent"
      android:layout_height="wrap_content"
      android:orientation="vertical" >

      <TextView
      android:id="@+id/tv1"
      android:layout_width="match_parent"
      android:layout_height="wrap_content"
      android:text="Large Text"
      android:textColor="@android:color/black"
      android:textAppearance="?android:attr/textAppearanceLarge" />

      <ListView
        android:id="@+id/list"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" >
    </ListView>

    <TextView
         android:id="@+id/tv2"
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
         android:text="Large Text"
         android:textColor="@android:color/black"
         android:textAppearance="?android:attr/textAppearanceLarge" />

     </LinearLayout>

线性布局属于滚动视图。
所以我想设置listview所有项目并通过父滚动滚动。
我该怎么做?

4

4 回答 4

5

这就是您应该如何在滚动视图中设置列表视图,但就像其他人回答的那样,您永远不应该将列表视图放在滚动视图中,特别是如果列表视图将包含很多项目

ListView lv = (ListView)findViewById(R.id.list);  // your listview inside scrollview

lv.setOnTouchListener(new ListView.OnTouchListener() 
{
    @Override
    public boolean onTouch(View v, MotionEvent event) 
    {
        int action = event.getAction();
        switch (action) 
        {
        case MotionEvent.ACTION_DOWN:
            // Disallow ScrollView to intercept touch events.
            v.getParent().requestDisallowInterceptTouchEvent(true);
            break;

        case MotionEvent.ACTION_UP:
            // Allow ScrollView to intercept touch events.
            v.getParent().requestDisallowInterceptTouchEvent(false);
            break;
        }

        // Handle ListView touch events.
        v.onTouchEvent(event);
        return true;
    }
});
于 2013-09-04T07:51:32.220 回答
3

如果这个要求的原因与我需要的类似,下面的课程可以提供帮助。它是一种替代品ListView,它观察适配器及其变化并做出相应反应,但LinearLayout实际上在引擎盖下使用手动填充。我想我在网上的某个地方找到了这段代码,但我现在找不到它以链接到它。

我的要求是利用 a 的优点,即它的适配器功能,在页面上显示很少的项目(1 到 5),在单个屏幕上ListView可能有多个这样的替换。ListView一旦显示,元素本身就成为较大页面的一部分,因此它们不会在自己的内部单独滚动ListView,而是与整个页面一起滚动。

public class StaticListView extends LinearLayout {
  protected Adapter adapter;
  protected Observer observer = new Observer(this);

  public StaticListView(Context context) {
    super(context);
  }

  public StaticListView(Context context, AttributeSet attrs) {
    super(context, attrs);
  }

  public void setAdapter(Adapter adapter) {
    if (this.adapter != null)
      this.adapter.unregisterDataSetObserver(observer);
    this.adapter = adapter;
    adapter.registerDataSetObserver(observer);
    observer.onChanged();
  }

  private class Observer extends DataSetObserver {
    StaticListView context;

    public Observer(StaticListView context) {
      this.context = context;
    }

    @Override
    public void onChanged() {
      List<View> oldViews = new ArrayList<View>(context.getChildCount());
      for (int i = 0; i < context.getChildCount(); i++)
        oldViews.add(context.getChildAt(i));

      Iterator<View> iter = oldViews.iterator();
      context.removeAllViews();
      for (int i = 0; i < context.adapter.getCount(); i++) {
        View convertView = iter.hasNext() ? iter.next() : null;
        context.addView(context.adapter.getView(i, convertView, context));
      }
      super.onChanged();
    }

    @Override
    public void onInvalidated() {
      context.removeAllViews();
      super.onInvalidated();
    }
  }
}
于 2014-11-18T17:14:21.213 回答
2

不要将列表视图放在滚动视图中。

http://developer.android.com/reference/android/widget/ScrollView.html

从文档中引用您永远不应该将 ScrollView 与 ListView 一起使用,因为 ListView 负责自己的垂直滚动。最重要的是,这样做会破坏 ListView 中处理大型列表的所有重要优化,因为它有效地强制 ListView 显示其整个项目列表以填充 ScrollView 提供的无限容器。

您可以将您的文本视图作为页眉和页脚添加到列表视图。

http://developer.android.com/reference/android/widget/ListView.html

检查上面链接中的页眉和页脚方法

您可以有一个相对布局在顶部和底部添加文本视图。相对于文本视图有文本视图之间的列表视图

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" >

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"
        android:text="TextView1" />

    <TextView
        android:id="@+id/textView2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/textView1"
        android:layout_alignParentBottom="true"
        android:text="TextView1" />

    <ListView
        android:id="@+id/listView1"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_below="@+id/textView1"
        android:layout_above="@+id/textView2"
       >

    </ListView>

</RelativeLayout>
于 2013-09-04T07:51:48.627 回答
2

我认为这是不可能的。如果我们使用父布局滚动覆盖列表视图滚动行为,列表视图将无法正常工作。

于 2013-09-04T08:02:03.810 回答