Android中的水平ListView?


215

可以ListView水平制作吗?我已经使用图库视图完成了此操作,但是所选项目自动出现在屏幕中央。我不希望所选项目位于我单击的同一位置。如何解决此问题?我的想法是ListView使用水平滚动条设置。分享您的想法?


1
使用我的帖子的链接创建Horizo​​ntal listView,希望对您有所帮助。
FAIZ ANWAR 2014年

2
您提到的博客的@Indra已被删除
Animesh Mangla

Answers:


123

根据Android文档,这RecyclerView是一种在列表视图中组织项目并水平显示的新方法

优点:

  1. 由于通过使用Recyclerview Adapter,将自动实现ViewHolder模式
  2. 动画易于执行
  3. 更多功能

有关的更多信息RecyclerView

  1. grokkingandroid.com
  2. antonioleiva.com

样品:

survivingwithandroid.com

只需添加以下代码块,即可将ListView垂直方向从水平变为水平

程式码片段

LinearLayoutManager layoutManager= new LinearLayoutManager(this,LinearLayoutManager.HORIZONTAL, false);
mRecyclerView = (RecyclerView) findViewById(R.id.recycler_view);
mRecyclerView.setLayoutManager(layoutManager);

1
如果google已解决LayoutManager的问题,这将是最佳解决方案。code.google.com/p/android/issues/detail?id=74772
Ponsuyambu Velladurai 2015年

建立一个简单的回收视图,使用本示例:android-examples.com/...
Matcoil

1
好的,小部件用什么方式?
弗拉迪斯拉夫

与其他适配器支持的视图(如ListView或GridView)相比,RecyclerView允许客户端代码为子视图提供自定义布局安排。这些安排由RecyclerView.LayoutManager控制。必须提供LayoutManager才能使RecyclerView起作用。
Yohanes AI

RecyclerView仍然无法像ListView一样轻松方便地处理项目点击(不要提及RecyclerView.Selection类),这是我认为RecyclerView不是此问题的最佳答案的几个原因之一。
Edward Quixote

60

Paul不会费心去修复他的库中的错误或接受用户修复。这就是为什么我建议另一个具有类似功能的库:

https://github.com/sephiroth74/Horizo​​ntalVariableListView

更新:2013年7月24日,作者(sephiroth74)根据android 4.2.2 ListView的代码发布了完全重写的版本。我必须说,它没有以前版本所具有的所有错误,而且效果很好!


2
这应该是一个可以接受的答案,因为这个Horizo​​ntalVariableListView比Paul的要先进得多。例如,它有一个适当的方法来选择列表中的位置,Paul的位置中有“ TODO:有一天实现”。
Yan.Yurkin

5
请注意,此解决方案需要Android 2.3或更高
user1032613

1
sephiroth74的Horizo​​ntalVariableListView正是您所希望的:android源代码中ListView的副本,其中所有方法已更新为水平移动而不是垂直移动。我还没有遇到任何问题。非常感谢您将我引导到那里,Malachiasz!
SilithCrowe 2014年

这个lib仍然不支持将wrap_content转换为listview
Kalpesh Lakhani 2014年

1
现在已弃用
Animesh Mangla 2015年

28

@Paul答案链接到一个很好的解决方案,但是该代码不允许对子项使用onClickListeners(从不调用回调函数)。我一直在努力寻找解决方案,我决定在此处发布您需要在该代码中进行修改的内容(以防有人需要)。

而不是覆盖dispatchTouchEventoverride onTouchEvent。使用和相同的代码dispatchTouchEvent并删除该方法(您可以在http://developer.android.com/guide/topics/ui/ui-uis.html#EventHandlers中阅读两者的区别)

@Override
public boolean onTouchEvent(MotionEvent event) {
    boolean handled = mGesture.onTouchEvent(event);
    return handled;
}

然后,添加以下代码,这些代码将决定从子项中窃取事件并将其提供给我们onTouchEvent,或由他们处理。

@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
    switch( ev.getActionMasked() ){
        case MotionEvent.ACTION_DOWN:
             mInitialX = ev.getX();
             mInitialY = ev.getY();             
             return false;
        case MotionEvent.ACTION_MOVE:
             float deltaX = Math.abs(ev.getX() - mInitialX);
             float deltaY = Math.abs(ev.getY() - mInitialY);
             return ( deltaX > 5 || deltaY > 5 );
        default:
             return super.onInterceptTouchEvent(ev);
    }
}

最后,不要忘记在您的类中声明变量:

private float mInitialX;
private float mInitialY;

13
您为什么不将此请求作为请求发送给Paul?
克里斯蒂安(Cristian)2012年

ev.getActionMasked()在android 2.1平台上不可用。你知道如何克服这个吗?
尤金·波波维奇

看来我可以使用int maskedAction = ev.getAction()和MotionEvent.ACTION_MASK来与ev.getMaskedAction()相等
Eugene Popovich

真的有用!但是将代码更改为onTouchEvent我得到了一个怪异的偏移量。我将其保存在dispatchTouchEvent中,并且效果很好!谢谢
jbc25

jbc25我可以确认是否使用此修复程序会发生怪异的跳跃
Eugene Popovich

23

由于Google引入了Android支持库v7 21.0.0,因此您可以使用RecyclerView来水平滚动项目。RecyclerView小部件是ListView的更高级,更灵活的版本。

要使用RecyclerView,只需添加依赖项:

com.android.support:recyclerview-v7:23.0.1

这是一个示例:

public class MyActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.my_activity);

        RecyclerView recyclerView = (RecyclerView) findViewById(R.id.my_recycler_view);

        LinearLayoutManager layoutManager = new LinearLayoutManager(this);
        layoutManager.setOrientation(LinearLayoutManager.HORIZONTAL);
        recyclerView.setLayoutManager(layoutManager);

        MyAdapter adapter = new MyAdapter(myDataset);
        recyclerView.setAdapter(adapter);
    }
}

有关RecyclerView的更多信息:


21

这有点晚(很晚),但是我要发布此消息,以防以后有人来。

从Android L预览版开始RecyclerView,支持库的功能完全可以满足您的需求。

目前,您只能通过L预览SDK来获取它,并且需要将设置minSdkL。但是您可以将所有必需的文件复制到您的项目中,并以这种方式使用它们,直到L正式退出。

您可以在此处下载预览文档。

警告:Recycler View的API可能会更改,并且可能存在错误。

更新

水平列表视图的源代码为:

LinearLayoutManager layoutManager
    = new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false);

RecyclerView myList = findViewById(R.id.my_recycler_view);
myList.setLayoutManager(layoutManager);

嗨,行得通吗?因为我尝试过,但无法制作水平RecyclerView。你能放一些代码吗?谢谢
Cocorico 2015年

只需设置LinearLayoutManager-在这里看到:stackoverflow.com/questions/28460300/...
斯特凡

19

此处下载jar文件

现在将其放入您的libs文件夹中,右键单击它并选择“添加为库”

现在在main.xml中将此代码

 <com.devsmart.android.ui.HorizontalListView
    android:id="@+id/hlistview"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    />

现在在Activity类中,如果您想使用带有图像的水平Listview,则将此代码放入

  HorizontalListView hListView = (HorizontalListView) findViewById(R.id.hlistview);
    hListView.setAdapter(new HAdapter(this));


 private class HAdapter extends BaseAdapter {

    LayoutInflater inflater;

    public HAdapter(Context context) {
        inflater = LayoutInflater.from(context);

    }

    @Override
    public int getCount() {
        // TODO Auto-generated method stub
        return Const.template.length;
    }

    @Override
    public Object getItem(int position) {
        // TODO Auto-generated method stub
        return position;
    }

    @Override
    public long getItemId(int position) {
        // TODO Auto-generated method stub
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        HViewHolder holder;
        if (convertView == null) {
            convertView = inflater.inflate(R.layout.listinflate, null);
            holder = new HViewHolder();
            convertView.setTag(holder);

        } else {
            holder = (HViewHolder) convertView.getTag();
        }
        holder.img = (ImageView) convertView.findViewById(R.id.image);
        holder.img.setImageResource(Const.template[position]);
        return convertView;
    }

}

class HViewHolder {
    ImageView img;
}

它不支持任何选择器或任何自定义选择器?任何想法?
Nitin Misra 2014年

我可以添加数字数组而不是图像吗?
souravlahoti 2015年

@BeingSrv是的,您可以
Siddhpura Amit 2015年

将其放入libs文件夹后,右键单击它并单击“添加为库”
M. Usman Khan 2015年

如何开发pulse,bbcnews之类的horizo​​ntallistview列表,请帮助我
Harsha

13

它实际上非常简单:只需旋转列表视图以使其侧放

mlistView.setRotation(-90);

然后,在给孩子充气时,应该在getView方法内部。您旋转孩子使其直立:

 mylistViewchild.setRotation(90);

编辑: 如果您的ListView在旋转后无法正确放置,则将ListView放在此RotateLayout中,如下所示:

 <com.github.rongi.rotate_layout.layout.RotateLayout
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:angle="90"> <!-- Specify rotate angle here -->

    <ListView
       android:layout_width="match_parent"
       android:layout_height="match_parent">
    </ListView>
</com.github.rongi.rotate_layout.layout.RotateLayout>

1
我已经尝试过-并非如此简单。我没有使旋转视图适合屏幕的宽度和高度。而且此API仅在新设备​​中可用。
马拉基亚斯

旋转之前,将listViews宽度设置为屏幕高度,并将listviews高度设置为屏幕宽度..(即,如果您希望listview填充屏幕),否则将listview设置为想要的任何高度和宽度,然后旋转。
kc ochibili 2013年

1
您是否一直在尝试说什么?我有,但都没有用。
玛拉基亚斯

旋转后是否尝试更改值?我不明白为什么它不起作用。(如果你想知道,你怎么会知道旋转后,先前的高度和宽度值,你可以在一个变量保存旋转前,然后旋转后应用它们。
KC ochibili

这个库的新版本(stackoverflow.com/a/16589629/2075875)可以正常工作,并且可以在android 2.3上运行,而setRotation()从3.0开始可用,所以我不想再次玩rotate,但是我鼓励您可以自己尝试并提供工作代码。
马拉基亚斯

9

我的解决方案是简单地使用ViewPager小部件。它不是中心锁定的,Gallery并且具有用于回收视图的内置功能(如ListView)。每当您处理水平滚动列表时,您可能会在Google Play应用中看到类似的方法。

您只需要在PagerAdapter此处扩展并执行一些调整即可:

public class MyPagerAdapter extends PagerAdapter {

    private Context mContext;

    public MyPagerAdapter(Context context) {
        this.mContext = context;
    }

    // As per docs, you may use views as key objects directly 
    // if they aren't too complex
    @Override
    public Object instantiateItem(ViewGroup container, int position) {
        LayoutInflater inflater = LayoutInflater.from(mContext);
        View view = inflater.inflate(R.layout.item, null);
        container.addView(view);
        return view;
    }

    @Override
    public void destroyItem(ViewGroup container, int position, Object object) {
        container.removeView((View) object);
    }

    @Override
    public int getCount() {
        return 10;
    }

    @Override
    public boolean isViewFromObject(View view, Object object) {
        return view == object;
    }

    // Important: page takes all available width by default,
    // so let's override this method to fit 5 pages within single screen
    @Override
    public float getPageWidth(int position) {
        return 0.2f;
    }
}

结果,您将获得带有适配器的可水平滚动的小部件,如下所示: 在此处输入图片说明


3
它像ListView一样可滚动,但沿水平方向。我看到的唯一区别是:项目正在一个一个地滚动,因此不可能滚动到下一个项目的中间。但这就是ViewPager的工作方式。
fraggjkee 2014年

8

注意:Android现在支持使用RecyclerView的水平列表视图,因此不建议使用此答案,以获取有关RecyclerView的信息:https : //developer.android.com/reference/android/support/v7/widget/RecyclerView

我已经开发出一种无需使用任何外部水平滚动视图库即可执行此操作的逻辑,这是我实现的水平视图,我在此处发布了答案:https ://stackoverflow.com/a/33301582/5479863

我的json响应是这样的:

{"searchInfo":{"status":"1","message":"Success","clist":[{"id":"1de57434-795e-49ac-0ca3-5614dacecbd4","name":"Theater","image_url":"http://52.25.198.71/miisecretory/category_images/movie.png"},{"id":"62fe1c92-2192-2ebb-7e92-5614dacad69b","name":"CNG","image_url":"http://52.25.198.71/miisecretory/category_images/cng.png"},{"id":"8060094c-df4f-5290-7983-5614dad31677","name":"Wine-shop","image_url":"http://52.25.198.71/miisecretory/category_images/beer.png"},{"id":"888a90c4-a6b0-c2e2-6b3c-561788e973f6","name":"Chemist","image_url":"http://52.25.198.71/miisecretory/category_images/chemist.png"},{"id":"a39b4ec1-943f-b800-a671-561789a57871","name":"Food","image_url":"http://52.25.198.71/miisecretory/category_images/food.png"},{"id":"c644cc53-2fce-8cbe-0715-5614da9c765f","name":"College","image_url":"http://52.25.198.71/miisecretory/category_images/college.png"},{"id":"c71e8757-072b-1bf4-5b25-5614d980ef15","name":"Hospital","image_url":"http://52.25.198.71/miisecretory/category_images/hospital.png"},{"id":"db835491-d1d2-5467-a1a1-5614d9963c94","name":"Petrol-Pumps","image_url":"http://52.25.198.71/miisecretory/category_images/petrol.png"},{"id":"f13100ca-4052-c0f4-863a-5614d9631afb","name":"ATM","image_url":"http://52.25.198.71/miisecretory/category_images/atm.png"}]}}

布局文件:

    <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:weightSum="5">    
    <fragment
        android:id="@+id/map"
        android:name="com.google.android.gms.maps.SupportMapFragment"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="4" />
    <HorizontalScrollView
        android:id="@+id/horizontalScroll"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1">

        <LinearLayout
            android:id="@+id/ll"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:gravity="center"
            android:orientation="horizontal">    
        </LinearLayout>
    </HorizontalScrollView>
</LinearLayout>

类文件:

LinearLayout linearLayout = (LinearLayout) findViewById(R.id.ll);
        for (int v = 0; v < collectionInfo.size(); v++) {
            /*---------------Creating frame layout----------------------*/

            FrameLayout frameLayout = new FrameLayout(ActivityMap.this);
            LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(FrameLayout.LayoutParams.WRAP_CONTENT, getPixelsToDP(90));
            layoutParams.rightMargin = getPixelsToDP(10);
            frameLayout.setLayoutParams(layoutParams);

            /*--------------end of frame layout----------------------------*/

            /*---------------Creating image view----------------------*/
            final ImageView imgView = new ImageView(ActivityMap.this); //create imageview dynamically
            LinearLayout.LayoutParams lpImage = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);
            imgView.setImageBitmap(collectionInfo.get(v).getCatImage());
            imgView.setLayoutParams(lpImage);
            // setting ID to retrieve at later time (same as its position)
            imgView.setId(v);
            imgView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {

                    // getting id which is same as its position
                    Log.i(TAG, "Clicked on " + collectionInfo.get(v.getId()).getCatName());
                    // getting selected category's data list
                    new GetSelectedCategoryData().execute(collectionInfo.get(v.getId()).getCatID());
                }
            });
            /*--------------end of image view----------------------------*/

            /*---------------Creating Text view----------------------*/
            TextView textView = new TextView(ActivityMap.this);//create textview dynamically
            textView.setText(collectionInfo.get(v).getCatName());
            FrameLayout.LayoutParams lpText = new FrameLayout.LayoutParams(FrameLayout.LayoutParams.WRAP_CONTENT, FrameLayout.LayoutParams.WRAP_CONTENT, Gravity.BOTTOM | Gravity.CENTER);
            // Note: LinearLayout.LayoutParams 's gravity was not working so I putted Framelayout as 3 paramater is gravity itself
            textView.setTextColor(Color.parseColor("#43A047"));
            textView.setLayoutParams(lpText);
            /*--------------end of Text view----------------------------*/

            //Adding views at appropriate places
            frameLayout.addView(imgView);
            frameLayout.addView(textView);
            linearLayout.addView(frameLayout);

        }

 private int getPixelsToDP(int dp) {
        float scale = getResources().getDisplayMetrics().density;
        int pixels = (int) (dp * scale + 0.5f);
        return pixels;
    }

在这里起作用的技巧是我分配给ImageView“ imgView.setId(v)”的ID,然后将onClickListener应用于该ID,我再次获取视图的ID...。我也在代码内部进行了注释,因此它很容易理解,我希望这可能是非常有用的... Happy Coding ... :)

http://i.stack.imgur.com/lXrpG.png


1
我已经在此处编辑并发布了完整的解释,谢谢您的建议:)
Abdul Aziz

您好,谢谢您的代码,您可以发布该方法getPixelsToDP()吗?
Skizo-ozᴉʞS

@Skizo我已在Java代码末尾添加了该方法,请看一下
Abdul Aziz


5

您可以在支持库中使用RecyclerView。RecyclerView是ListView的通用版本,它支持:

  • 用于定位项目的布局管理器
  • 常见项目操作的默认动画

Android Recycler查看文件


到目前为止,这是真正的答案。但是,即使这还没有准备好,仍处于“预览”中
Martin

3

我已经做了很多寻找该问题的解决方案。简短的答案是,没有一个好的解决方案,而不是覆盖私有方法之类的东西。我发现最好的事情是自己通过扩展实现它AdapterView。真是可悲。看到我关于水平ListViews的问题


不幸的是,您的答案是正确的。甚至Google都确认,水平列表视图的唯一方法是图库。但是Gallery与水平列表视图不同。您愿意分享您的代码吗?您是否回收视图?
Patrick Boos

1
不幸的是,该代码是为我公司编写的,因此是专有的。但是,我确实希望在接下来的几个月中找到一些空闲时间来重写它(原始实现非常不稳定)并将其发布到公共领域。我还可以告诉你,我是从索尼爱立信开始进行此演示的,将所有“ x”更改为“ y”,将所有“宽度”更改为“高度”。然后,我删除了3D变换并添加了“停止时停止”行为。
尼尔·特拉夫特

@Neil Traft您是如何固定物品位置的?那最后停下来怎么办?
Adrian Magdas'3

老实说,这实际上只是猜测。花了很长时间才把它弄对,我坚信有更好的方法。但是基本前提是,在该fillListDown()方法中,您需要跟踪最后一个列表项的底部边缘。但是直到实际创建最后一项(adapter.getCount()-1),您才知道该边缘在哪里。因此,您要等到创建该项目后,才能存储边缘的位置。一旦知道,就可以确保mListTop不小于0并且不大于列表的高度。
尼尔·特拉夫特

1
如果您不是真的需要一个水平清单,我强烈建议您放弃或使用画廊。
尼尔·特拉夫特

3

我必须为我的一个项目做同样的事情,最终我也写了自己的项目。我称之为HorzListView现在是我的开源Aniqroid库的一部分。

http://aniqroid.sileria.com/doc/api/ (在底部查找下载内容,或使用Google Code项目查看更多下载选项:http : //code.google.com/p/aniqroid/downloads/list

此类文档位于此处:http : //aniqroid.sileria.com/doc/api/com/sileria/android/view/HorzListView.html


如何以编程方式设置滚动位置?
Dima Portenko

有setSelection()方法,但可能没有100%实现。试试吧。
Sileria

1

在我的应用程序中,我使用了一个Horizo​​ntalScrollView,其中包含LinearLayout,其方向设置为水平。为了在其中添加图像,我在活动中创建了ImageViews并将它们添加到我的LinearLayout中。例如:

<HorizontalScrollView 
        android:id="@+id/photo_scroll"
        android:layout_width="wrap_content"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:scrollbars="horizontal"
        android:visibility="gone">

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

        </LinearLayout>
    </HorizontalScrollView>

这对我来说很好用。在活动中,我要做的只是类似下面的代码:

LinearLayout imgViewHolder = findViewById(R.id.imageview_holder);
ImageView img1 = new ImageView(getApplicationContext());
//set bitmap
//set img1 layout params
imgViewHolder.add(img1);
ImageView img2 = new ImageView(getApplicationContext());
//set bitmap
//set img2 layout params
imgViewHolder.add(img2); 

就像我说的那样,它对我有用,我希望它对寻求实现这一目标的人也有所帮助。


0

好吧,您可以随时动态创建textviews等,并像使用适配器一样设置onclicklisteners


你什么意思?我无法得到你?请发布有关您的想法的代码段?
Praveen

请告诉我“水平列表视图”的目的,它将具有复杂的/多视图吗?例如2个文本框1个进度栏?还是只说纯文本?视图中是否有固定数量的元素,或者您想动态更改它?回答我,我将可以为您提供代码帮助
weakwire 2010年

我想做水平文本库。但默认情况下,所选项目位于中心。我想成为所选项目必须在我单击的地方。也请您查看我的帖子:stackoverflow.com/questions/3237566/text-gallery-on-androidstackoverflow.com/questions/3318617/...
普利文

0

当适配器中的数据涉及另一个线程时,Horizo​​ntialListView无法工作。一切都在UI线程上运行100%,这在多线程中是一个大问题。我认为使用Horizo​​ntialListView并不是解决问题的最佳方法.HorzListView是更好的方法,您只需要用HorzListView替换以前的Gallery,就不需要修改适配器的代码,然后一切都会按照您希望的方式进行。请参阅https://关于HorzListView的stackoverflow.com/a/12339708/1525777


0

我在项目中使用了 水平listview链接,并获得了良好的效果。我最初使用过devsmart库,但它给了我一些问题。因此,使用水平listview链接的最佳方法是它解决了我的问题,最近我也使用该库在Google PlayStore上启动了我的应用,并得到了用户的好评。因此,我建议您使用上面提到的同一库来水平显示listview。请享用 :)


0

有一个很棒的库,名为TwoWayView,它很容易实现,只需将项目库包含到您的工作空间中,并将其作为库项目添加到原始项目中,然后按照下面最初提到的步骤进行操作:

首先,让我们在(res / values / styles.xml)中添加一个指示ListView(水平或垂直)方向的样式:

<style name="TwoWayView">
    <item name="android:orientation">horizontal</item>
</style>

然后,

在您的布局XML中,使用以下代码添加TwoWayView:

<org.lucasr.twowayview.TwoWayView 
     xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:tools="http://schemas.android.com/tools"
     xmlns:app="http://schemas.android.com/apk/res-auto"
     android:id="@+id/lvItems"
     style="@style/TwoWayView"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
     android:drawSelectorOnTop="false"
     tools:context=".MainActivity" />

最后,只需声明它并像对待任何常规对象一样对其进行处理ListView

TwoWayView lvTest = (TwoWayView) findViewById(R.id.lvItems);

的所有方法都ListView将在这里照常上班,但只有一个区别,我注意到,这是设置选择方式时,该方法setChoiceMode不能接受一个int值,但是从价值的enumChoiceMode,所以list_view.setChoiceMode(ListView.CHOICE_MODE_SINGLE);lvTest.setChoiceMode(ChoiceMode.SINGLE); // or MULTIPLE or NONE


1
我尝试了此操作-但它不允许我使用自己的ArrayAdapter <PreviewImage>
DeNitE Appz

-1

您可以使用ViewFlipper包含布局XML并为每个布局XML添加图片和listview

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.