为什么ListView不能在ScrollView中使用?

时间:2012-01-08 10:01:11

标签: android listview scrollview

我发现了许多教程和示例,但为什么ListView不能在ScrollView中使用?

只有答案 使用ListView使其不滚动是非常昂贵的,并且违背了ListView的全部目的。 resources

我有以下xml文件。

.........
<ScrollView 
   android:id="@+id/sv" 
   android:layout_width="fill_parent"
   android:layout_height="wrap_content"
   android:layout_below="@+id/textView2">
      <ListView 
         android:id="@+id/list"
         android:layout_width="275dp"
         android:layout_height="200dp">
     </ListView>
</ScrollView>
.........

在这个xml文件中,我已经使用

  

wrap_content而不是listview的高度为200dp

   ListView lv = (ListView) findViewById(R.id.list);
   lv.setAdapter(new EfficientAdapter(this));

但不起作用。

特定身高和体重的替代滚动列表项目是什么。

但我试过这个:

<ListView 
         android:id="@+id/list"
         android:layout_width="275dp"
         android:layout_height="200dp">
     </ListView>

<ScrollView android:layout_width="fill_parent" android:id="@+id/sv" 
        android:layout_height="wrap_content"   android:layout_below="@+id/textView2">   
    <LinearLayout android:layout_width="fill_parent"
        android:orientation="vertical"
        android:layout_height="wrap_content">
        <ListView android:id="@+id/list" android:layout_width="275dp"
            android:layout_height="240dp"></ListView>
    </LinearLayout>
    </ScrollView>

没有scollview但滚动listitem是好的,但不是很平常。 我试过this,但在这背后无法理解。

编辑:

是否正确 Listview具有内置滚动功能。因此没有必要在scrollview中定义listview。这意味着滚动视图没有必要吗?

6 个答案:

答案 0 :(得分:4)

问题不是ListView而是ScrollView

这两个视图需要控制垂直滚动,如果你有一个滚动视图和一个列表视图在同一个布局中,用户向下滚动,哪一个必须采取焦点,所以滚动?

这是一个常见且容易解决的问题(此解决方案来自Google Android团队的Romain Guy!):不要在滚动视图中使用列表视图!

如果你想要一个有趣的视频/谈话,你可以通过Google I / O会谈观看:The world of ListView我真的建议你看一下:)

答案 1 :(得分:0)

这是因为两个视图都是可滚动的。 您是否已尝试搜索/谷歌搜索?有一千场比赛..

http://www.google.de/search?sourceid=chrome&ie=UTF-8&q=android+listview+in+scrollview

答案 2 :(得分:0)

ListView内置了滚动功能。您无需在ScrollView中再次定义它

答案 3 :(得分:0)

ListViews不应该进入ScrollView。即使你破解,我的意思是大黑客,通过扩展它们并让它们滚动,也可以是itemclickable等等两种观点,最终会破坏某些东西。另外,不要将ListView添加到Scroll 图。

答案 4 :(得分:0)

修改 是的android doc说不要将listview用于scrollview,因为两者都有相同的垂直触摸手势。在滚动项目时会出错。还有他们的适配器大小的问题,为什么我们无法看到整个项目。

最后我得到了最好的解决方案,我希望与大家分享。请不要将Listview用于Scrollview,而不是使用LinearLayout并使用View Infaltor绑定您的项目。

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

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

        <TextView
            android:id="@+id/textView3"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="5dp"
            android:text="@string/bottom_item"
            android:layout_gravity="center"
            android:textAppearance="?android:attr/textAppearanceLarge" />

        <TextView
            android:id="@+id/textView4"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="right"
            android:layout_marginTop="5dp"
            android:text="@string/androidhub4you" />
    </LinearLayout>
</ScrollView>

在你的java类中 -

 for (int i = 0; i < mArrayListData.size(); i++) {
                     /**
                      * inflate items/ add items in linear layout instead of listview
                      */
                     LayoutInflater inflater = null;
                     inflater = (LayoutInflater) getApplicationContext()
                                  .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                     View mLinearView = inflater.inflate(R.layout.row, null);
                     /**
                      * getting id of row.xml
                      */
                     TextView mFirstName = (TextView) mLinearView
                                  .findViewById(R.id.textViewName);
                     TextView mLastName = (TextView) mLinearView
                                  .findViewById(R.id.textViewLastName);

                     /**
                      * set item into row
                      */
                     final String fName = mArrayListData.get(i).getmFirstName();
                     final String lName = mArrayListData.get(i).getmLastName();
                     mFirstName.setText(fName);
                     mLastName.setText(lName);

                     /**
                      * add view in top linear
                      */

                     mLinearListView.addView(mLinearView);

                     /**
                      * get item row on click
                      *
                      */
                     mLinearView.setOnClickListener(new OnClickListener() {

                           @Override
                           public void onClick(View v) {
                                  // TODO Auto-generated method stub
                                  Toast.makeText(MainActivity.this, "Clicked item;" + fName,
                                                Toast.LENGTH_SHORT).show();
                           }
                     });
              }

Read more: http://www.androidhub4you.com/2014/03/android-listview-into-scrollview-issue.html#ixzz2xc7Ag74u

答案 5 :(得分:0)

我已经使用xml以下测试过了。但仍尝试处理ScrollView和ListView之间的onTouchEvent函数。您可以点击here查看原始解决方案。

<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:quilt="http://schemas.android.com/apk/res-auto"
    android:id="@+id/scrollview"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity" >

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent" >

        <ListView
            android:id="@+id/inner_listview"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />
    </LinearLayout>

</ScrollView>