在Android上没有滚动的ListView

时间:2013-09-04 07:48:23

标签: android listview

我想设置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>

线性布局属于滚动视图 所以我想设置列表视图所有项目并按父项滚动滚动 我该怎么做?

4 个答案:

答案 0 :(得分:5)

这就是你应该如何在scrollView中设置listview,但就像其他人的回答一样,你不应该把一个listview放在一个scrollview中,特别是如果listview将包含很多项目

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;
    }
});

答案 1 :(得分:3)

如果此要求的原因与我需要的相似,则下面的课程可以提供帮助。它是一个替换ListView,它可以观察适配器及其更改并做出相应的反应,但实际上使用了手动填充的LinearLayout。我想我在网上的某个地方找到了这个代码,但我现在无法找到它以便链接到它。

我的要求是利用ListView的优势,即其适配器功能,在页面上显示很少的项目(1到5),可能有多个这样的替换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();
    }
  }
}

答案 2 :(得分:2)

不要将listview放在滚动视图中。

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

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

您可以将textview作为页眉和页脚添加到listview。

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

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

您可以在顶部和底部添加相对布局添加文本视图。相对于textview具有textview的

之间的列表视图
<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>

答案 3 :(得分:2)

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