2011-06-26 3 views
5

Я так близко здесь, и я пробовал много вещей, но не могу заставить его работать. У меня есть два списка. Я хочу, чтобы каждый список отображал его содержимое ENTIRE. Я не хочу прокручивать списки. Я хочу, чтобы Scrollview содержал прокручиваемые списки. Самое близкое, что мне удалось получить (что неправильно), так это то, что каждый список прокручивается. Это означает, что каждый список имеет только 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'. Заполняйте свои списки в LinearLayout программно, а не используя 'ListView'. Это именно то, что вы хотите. –

+0

Я знал, что его выбросят. Разве нет способа, которым я могу просто заставить это работать, не делая столько работы? – spentak

ответ

9

Вы собираетесь потратить гораздо больше времени и сил, пытаясь заставить это работать, если оно когда-либо будет. ListView s существуют для обработки длинных списков, для которых требуется слишком много ресурсов для рисования за один раз. Они перерабатывают строку «Представления», когда вы просматриваете их, чтобы обеспечить мгновенную загрузку. Вы пытаетесь сорвать эту функциональность, тем самым делая ваше использование ListView по существу бессмысленным.

Заполнение LinearLayout программно не имеет большого значения. У вас есть XML-файл для ваших строк? Надуйте его для каждой новой строки, когда вы запускаете чрезвычайно простой цикл for через ваш массив или while через ваш курсор, привязывая данные и добавляя его в ваш LinearLayout.

Выполнено. Никаких проблем с прокруткой ... все это обрабатывается ScrollView, как должно быть.

+0

У меня есть тонны кода, который работает через мои пользовательские адаптеры и обработчики событий (для кликов и т. Д.). Как бы я включил ваш метод без серьезной модификации всего этого? – spentak

+0

Значит, вы предпочитаете заставить ListViews делать то, для чего они не предназначены? Общим для ListView является хорошо известный факт, что они не могут нормально функционировать в ScrollView той же ориентации. Я бы предложил вам посмотреть это видео с Google IO 2010: http://www.youtube.com/watch?v=wDBM6wVEO70 – zienkikk

+0

Ну что за клики? Row клики? Я просто установил 'android: onClick' в XML-строке некоторого метода, затем использовал' setTag (index [array] или id [cursor]) 'в цикле, чтобы вы могли затем вызвать' getTag() 'on представление, которое передано методу, установленному в атрибуте 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

создать Scrollview во время выполнения, как этот путь.

//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); 
Смежные вопросы