2011-06-26 88 views
5

我在這裏很近,我嘗試了很多東西,但無法讓它工作。我在這裏有兩個列表視圖。我想要的是每個listview顯示其整個內容。我不希望列表視圖滾動。我想要保持列表視圖可滾動的滾動視圖。最近我已經能夠得到它(這是錯誤的),以便每個listview是可滾動的。這意味着每個listview只顯示爲1 1/2個單元格。我認爲這將是一件簡單的事情,但Android有一些奇怪的事情發生。兩個ListViews&ScrollView

因此,每個列表視圖都會顯示其全部內容,即使內容高度超過了屏幕。然後,我所要做的就是向下滾動查看顯示其全部內容的第二個列表視圖。

<?xml version="1.0" encoding="utf-8"?> 
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_height="fill_parent" 
android:layout_width="wrap_content" 
android:orientation="vertical" 
android:fillViewport="true"> 
<LinearLayout 
android:layout_height="fill_parent" 
android:layout_width="wrap_content" 
android:orientation="vertical" 
android:fillViewport="true"> 
<LinearLayout 
android:layout_weight="10" 
android:orientation="vertical" 
android:layout_height="wrap_content" 
android:layout_width="fill_parent"> 
<TextView 
android:layout_width="fill_parent" 
android:layout_height="wrap_content" 
android:background="#CCCCCC" 
android:text="@string/alerts_top_title" 
android:gravity="center" 
android:textColor="#000000" 
android:layout_centerVertical="true" 
android:layout_centerHorizontal="true"> 
</TextView> 
<ListView 
android:layout_width="fill_parent" 
android:layout_height="wrap_content" 
android:id="@+id/cameraListAlerts" > 
</ListView> 
</LinearLayout> 
<LinearLayout 
android:layout_weight="10" 
android:orientation="vertical" 
android:layout_height="wrap_content" 
android:layout_width="fill_parent"> 
<TextView 
android:gravity="center" 
android:layout_centerVertical="true" 
android:layout_centerHorizontal="true" 
android:layout_width="fill_parent" 
android:layout_height="wrap_content" 
android:background="#CCCCCC" 
android:textColor="#000000" 
android:text="@string/alerts_bottom_title"> 
</TextView> 
<LinearLayout 
android:layout_width="fill_parent" 
android:layout_height="8dp"> 
</LinearLayout> 
<Button 
android:id="@+id/addRecipient" 
android:layout_height="50dp" 
android:layout_width="fill_parent" 
android:layout_centerHorizontal="true" 
android:text="@string/addRecipient"/> 

<ListView 
android:layout_width="fill_parent" 
android:layout_height="wrap_content" 
android:id="@+id/recipientListAlerts" > 
</ListView> 
</LinearLayout> 
</LinearLayout> 
</ScrollView> 
+2

'ListView'不會進入'ScrollView's。以編程方式將您的列表填充到LinearLayout中,而不是使用ListView。這正是你想要的。 –

+0

我知道一個人會被拋出去。沒有辦法,我可以在沒有做這麼多工作的情況下讓它工作嗎? – spentak

回答

9

你會花費更多的時間和精力,試圖讓它工作。 ListView存在處理需要太多資源一次繪製的長列表。當您滾動瀏覽行視圖時,它們會循環查看行視圖以允許快速加載。你試圖拋棄這個功能,從而使你對ListView的使用毫無意義。

以編程方式填充LinearLayout根本沒什麼大不了的。你的行有XML文件嗎?當您通過您的Array或while循環運行一個非常簡單的for循環時,通過您的光標,綁定數據並將其添加到您的LinearLayout,爲每個新行充氣。

完成。沒有滾動問題......它全部由ScrollView處理,就像它應該一樣。

+0

我有大量的代碼,通過我的自定義適配器和事件處理程序(單擊項目等)。我怎麼會納入你的方法,而不做重大修改的所有東西? – spentak

+0

所以你寧願強制ListView做一些他們沒有設計的東西?對於有ListView體驗的人來說,這是一個衆所周知的事實,他們不能在同一個方向的ScrollView中正常工作。我建議你從谷歌IO 2010觀看這個視頻:http://www.youtube.com/watch?v = wDBM6wVEO70 – zienkikk

+0

那麼什麼樣的項目點擊?行點擊?我只是在行的XML中將'android:onClick'設置爲某個方法,然後在循環中使用'setTag(index [array]或id [cursor])',以便隨後調用'getTag()'傳遞給您在onClick屬性中設置的方法的視圖,並辨別哪個項目被點擊。然後你可以採取相應的行動可能有一個更優雅的方式來做到這一點。對於該視圖中的其他視圖(例如,單擊描述聯繫人的行中的圖像),我會創建一個非常快速的自定義視圖。這可能聽起來像很多工作,但這是一個更好的方法。 –

0

試試這個,

private ListView first, second; 
private String check=""; 
String[] COUNTRIES = new String[] { "Afghanistan", "Albania", 
     "Algeria", "American Samoa", "Andorra", "Angola", "Anguilla", 
     "Antarctica", "Antigua and Barbuda", "Argentina", "Armenia", 
     "Aruba", "Australia", "Austria", "Azerbaijan", "Bahrain", 
     "Montserrat", "Morocco", 
     "Mozambique", "Myanmar", "Namibia", "Nauru", "NepalA", 
     "Montserrat", "MoroccoF", 
     "Mozambique", "Myanmar", "Namibia", "Nauru", "NepalB", 
     "Montserrat", "MoroccoD", 
     "Mozambique", "Myanmar", "Namibia", "Nauru", "NepalC", 

}; 

String[] COUNTRIES1 = new String[] { "Martinique", 
     "Mauritania", "Mauritius", "Mayotte", "Mexico", "Micronesia", 
     "Moldova", "Monaco", "Mongolia", "Montserrat", "Morocco", 
     "Mozambique", "Myanmar", "Namibia", "Nauru", "Nepal", }; 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    first = (ListView) findViewById(R.id.firstlist); 
    second = (ListView) findViewById(R.id.secondlist); 

    ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, 
      android.R.layout.simple_list_item_1, COUNTRIES); 
    ArrayAdapter<String> adapter1 = new ArrayAdapter<String>(this, 
      android.R.layout.simple_list_item_1, COUNTRIES1); 

    first.setAdapter(adapter); 
    second.setAdapter(adapter1); 

    second.setOnTouchListener(new OnTouchListener() { 
    @Override 
    public boolean onTouch(View arg0, MotionEvent arg1) { 
     check="second"; 
    return false; 
    } 
     }); 

    first.setOnTouchListener(new OnTouchListener() { 
     @Override 
     public boolean onTouch(View arg0, MotionEvent arg1) { 
      check="first"; 
     return false; 
     } 
      }); 
    first.setOnScrollListener(newScrollEvent); 
    second.setOnScrollListener(newScrollEvent); 
} 

private OnScrollListener newScrollEvent = new OnScrollListener() { 

    @Override 
    public void onScrollStateChanged(AbsListView view, int scrollState) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void onScroll(AbsListView view, int firstVisibleItem, 
      int visibleItemCount, int totalItemCount) { 
     // TODO Auto-generated method stub 
     if(check.equalsIgnoreCase("first")){ 
     System.out.println("first"); 

     if (first.getChildAt(0) != null) { 
     Rect r1 = new Rect(); 
     first.getChildVisibleRect(first.getChildAt(0), r1, null); 
     second.setSelectionFromTop(first.getFirstVisiblePosition(), 
     r1.top); 
     } 
     } 
     else if(check.equalsIgnoreCase("second")){ 
     if (second.getChildAt(0) != null) { 
     Rect r1 = new Rect(); 
     second.getChildVisibleRect(second.getChildAt(0), r1, null); 
     first.setSelectionFromTop(second.getFirstVisiblePosition(), 
     r1.top); 
     } 
     } 
    } 
}; 
0

在運行時創建這樣的方式滾動視圖。

//find parent xml layout 
     LinearLayout lL1 =(LinearLayout)rootView.findViewById(R.id.pro_scroll); 

     //Create ScrollView programatically 
      ScrollView _scrollView = new ScrollView(appContext); 
      _scrollView.setBackgroundColor(Color.WHITE); 
      _scrollView.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, 
    LayoutParams.MATCH_PARENT)); 

     ViewGroup layout=new LinearLayout(appContext); 
          layout.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)); 

//add scrollview to layout 
          layout.addView(_scrollView); 
//add layout to xml parent layout 
          lL1.addView(layout);