如何滚动包含3个列表视图的布局

11

我有一个布局,其中包含3个列表视图,高度为wrap_content。列表视图中的数据不是固定的。当列表视图具有较多的数据时,数据会向下移动,无法看到数据,因此我想滚动所有三个列表视图的视图,如何实现?

有人对此有想法吗?

这是我的视图,其中包含3个列表视图,现在它的数据很少,但当数据变得非常庞大时,最后一个列表视图会出现视图问题。我想滚动灰色的视图...

进入图像描述

4个回答

7
使用线性布局代替ListView在您的XML文件中。 这是您的XML文件。
<?xml version="1.0" encoding="utf-8"?>
<ScrollView android:id="@+id/scr" android:layout_height="fill_parent"
    android:layout_width="fill_parent" xmlns:android="http://schemas.android.com/apk/res/android">
    <LinearLayout android:layout_width="fill_parent"
        android:id="@+id/r2" android:orientation="vertical"
        android:layout_height="fill_parent" android:paddingTop="100dip"
        android:paddingBottom="100dip">
        <LinearLayout android:layout_width="fill_parent"
            android:id="@+id/l1" android:orientation="vertical"
            android:layout_height="wrap_content" android:layout_marginTop="10dip"
            android:background="#00B2EE">
        </LinearLayout>
        <LinearLayout android:layout_width="fill_parent"
            android:id="@+id/l2" android:orientation="vertical"
            android:layout_height="wrap_content" android:layout_marginTop="10dip"
            android:background="#00EE76">

        </LinearLayout>
        <LinearLayout android:layout_width="fill_parent"
            android:id="@+id/l3" android:orientation="vertical"
            android:layout_height="wrap_content" android:layout_marginTop="10dip"
            android:background="#7171C6">
        </LinearLayout>
    </LinearLayout>
</ScrollView>

并且放置另一个XML文件,将被列表填充。

这是您的主活动类。

package com.list.add;

import java.util.ArrayList;
import java.util.List;
import android.app.Activity;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.LinearLayout;
import android.widget.ScrollView;
import android.widget.TextView;

public class NewlistActivity extends Activity {
    /** Called when the activity is first created. */
    LinearLayout l1,l2,l3;
    ScrollView scrollView;
    ViewGroup contentView;
    List<String> list = new ArrayList<String>();
    List<String> list1 = new ArrayList<String>();
    List<String> list2 = new ArrayList<String>();

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        l1 = (LinearLayout) findViewById(R.id.l1);
        l2 = (LinearLayout) findViewById(R.id.l2);
        l3 = (LinearLayout) findViewById(R.id.l3);
        scrollView = (ScrollView) findViewById(R.id.scr);
        contentView = (ViewGroup) findViewById(R.id.r2);
        scrollView.setOnTouchListener(new ScrollPager(scrollView, contentView));
        scrollView.post(new Runnable() {
            public void run() {
                scrollView.scrollTo(0, contentView.getPaddingTop());
            }
        });
        list.add("Parth");
        list.add("Chirag");
        list.add("Chirag");
        list.add("Chirag");
        list.add("Chirag");
        list.add("Chirag");
        list.add("Parth");
        list.add("Chirag");
        list.add("Chirag");
        list.add("Chirag");
        list.add("Chirag");
        list.add("Chirag");
        list.add("Chirag");
        list.add("Chirag");
        list.add("Chirag");
        list.add("Chirag");
        list.add("Shah");
        list.add("Parth");
        list.add("Chirag");
        list.add("Chirag");
        list.add("Chirag");
        list.add("Chirag");
        list.add("Chirag");
        list.add("Parth");
        list.add("Chirag");
        list.add("Chirag");
        list.add("Chirag");
        list.add("Chirag");
        list.add("Chirag");
        list.add("Chirag");
        list.add("Chirag");
        list.add("Chirag");
        list.add("Chirag");
        list.add("Shah");

        list1.add("Parth");
        list1.add("Parth");
        list1.add("Parth");
        list1.add("Parth");
        list1.add("Parth");
        list1.add("Parth");

        list2.add("Kalpesh");
        list2.add("Kalpesh");
        list2.add("Kalpesh");
        list2.add("Kalpesh");
        list2.add("Kalpesh");
        list2.add("Kalpesh");
        list2.add("Kalpesh");
        System.out.println(list);
        System.out.println(list1);
        System.out.println(list2);
        for (int i=0; i<list.size(); i++) 
        {
        LayoutInflater inflater = getLayoutInflater();
        View vi = inflater.inflate(R.layout.raw, null);
        TextView tv = (TextView) vi.findViewById(R.id.textView1);
        tv.setText(list.get(i));
        l1.addView(vi);
        }
        for (int i=0; i<list1.size(); i++) 
        {
        LayoutInflater inflater = getLayoutInflater();
        View vi = inflater.inflate(R.layout.raw, null);
        TextView tv = (TextView) vi.findViewById(R.id.textView1);
        tv.setText(list1.get(i));
        l2.addView(vi);
        }
        for (int i=0; i<list2.size(); i++) 
        {
        LayoutInflater inflater = getLayoutInflater();
        View vi = inflater.inflate(R.layout.raw, null);
        TextView tv = (TextView) vi.findViewById(R.id.textView1);
        tv.setText(list2.get(i));
        l3.addView(vi);
        }
    }

}

并创建一个如下所示的滚动类:

public class ScrollPager implements OnTouchListener
public ScrollPager(ScrollView aScrollView, ViewGroup aContentView)
    {
        mScrollView = aScrollView;
        mContentView = aContentView;
        scroller = new Scroller(mScrollView.getContext(), new OvershootInterpolator());
        task = new Runnable()
        {
            public void run()
            {
                scroller.computeScrollOffset();
                mScrollView.scrollTo(0, scroller.getCurrY());

                if (!scroller.isFinished())
                {
                    mScrollView.post(this);
                }
            }
        };
    }
public boolean onTouch(View v, MotionEvent event)
    {
        // Stop scrolling calculation.
        scroller.forceFinished(true);
        // Stop scrolling animation.
        mScrollView.removeCallbacks(task);

        if (event.getAction() == MotionEvent.ACTION_UP)
        {

这对我来说可行。我知道它可能不是最节省内存的,因为我们必须显式地执行等操作,但在我的情况下,我没有使用超过5个项目,所以没问题。谢谢。 - lazyguy

1

在XML布局中,您应该在每个ListView中使用权重属性android:layout_weight="1"。这样它将平均分配屏幕空间给每个ListView,并且您的滚动将适用于每个ListView。


你好Sujit,但是我在使用相对布局时发现android:layout_weight属性不被支持。 - Yog Guru
你为什么使用RelativeLayout?有特定的原因吗?由于你有3个垂直对齐的listView,所以应该使用LinearLayout。 - Sujit
但是应用程序的设计与此视图相关,因此我需要在相对布局中使用这种设计。 - Yog Guru

1

如果您要在垂直或水平堆栈中呈现东西,应该使用LinearLayout,然后使用layout_weight属性来控制容器内单个行/列的比例。

如果您想要屏幕大小,请将layout_widthlayout_height设置为fill_parent,否则您将无法获得所有可用的屏幕尺寸。如果您尝试在高度上使用wrap_content,除非您采用其他布局约束,否则一切都会崩溃,例如minHeight

我们无处不用这个方法,而且相当可靠。对于三个项目,您可以使用1/1/13/3/3

权重也不必相等!您可以按任何方式分配比例;权重只是整个跨度(宽度/高度)的相对比率。例如,如果您希望中间元素的大小加倍,请使用1/2/1;如果您想要40%,请使用 30/40/30 或3/4/3

一个好的“技巧”是在恰好一行/列上使用layout_weight=1(其他默认为零),它将“填充”任何剩余空间。这是常见的布局方案。
如果您需要堆栈可滚动,则可以将其放入ScrollView中。在这种情况下,您必须将LinearLayoutlayout_height设置为wrap_content,并且您将受到布局系统心血来潮而导致的折叠的影响(这意味着您需要使用最小/最大约束)。

1

那么,让我提供一种同样实现的最佳想法。

你有没有想过使用ExpandableListView进行同样类型的实现?只需将第一个组项展开并将其他两个组项折叠起来,在用户单击特定组时展开即可。

以下是一些相同实现的示例:

  1. http://techdroid.kbeanie.com/2010/09/expandablelistview-on-android.html
  2. http://coderzheaven.com/2011/04/expandable-listview-in-android-using-simpleexpandablelistadapter-a-simple-example/

我相信这个想法并不好,但如果你实施它,你肯定会在你的情况下受益。


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