2016-02-10 2 views
0

У меня есть следующий макет определяется в моем приложении:Scrollview Работает только в Listview

<?xml version="1.0" encoding="utf-8"?> 
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
     android:orientation="vertical" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content"> 

     <ImageView 
      android:id="@+id/disco_photo" 
      android:layout_width="match_parent" 
      android:layout_height="150dp" 
      android:layout_alignParentStart="true" 
      android:layout_alignParentTop="true" 
      android:layout_alignParentLeft="true" 
      android:scaleType="centerCrop" /> 

     <TextView 
      android:id="@+id/disco_name" 
      android:layout_width="wrap_content" 
      android:layout_height="match_parent" 
      android:layout_below="@id/disco_photo" 
      android:layout_alignParentLeft="true" 
      android:layout_gravity="left" 
      android:layout_margin="8dp" 
      android:gravity="end" 
      android:textSize="20sp" 
      android:textStyle="italic" /> 

     <TextView 
      android:id="@+id/disco_times" 
      android:layout_width="wrap_content" 
      android:layout_height="match_parent" 
      android:layout_below="@id/disco_name" 
      android:layout_alignParentLeft="true" 
      android:layout_gravity="left" 
      android:layout_margin="8dp" 
      android:gravity="end" 
      android:textSize="20sp" 
      android:textStyle="italic" 
      android:visibility="gone" /> 

     <ListView 
      android:id="@+id/disco_parties" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_below="@id/disco_times" 
      android:layout_alignParentLeft="true" 
      android:layout_gravity="left" 
      android:layout_margin="8dp" 
      android:text="@string/map_view" 
      android:gravity="end" 
      android:textSize="20sp" 
      android:textStyle="italic" /> 

     <RatingBar 
      android:id="@+id/disco_rating" 
      android:layout_width="wrap_content" 
      android:layout_height="match_parent" 
      android:layout_below="@id/disco_parties" 
      android:numStars="5" 
      android:stepSize="1.0" 
      android:rating="3.0" 
      android:visibility="gone" /> 

     <TextView 
      android:id="@+id/disco_map" 
      android:layout_width="wrap_content" 
      android:layout_height="match_parent" 
      android:layout_below="@id/disco_rating" 
      android:layout_alignParentLeft="true" 
      android:layout_gravity="left" 
      android:layout_margin="8dp" 
      android:text="@string/map_view" 
      android:gravity="end" 
      android:textSize="20sp" 
      android:textStyle="italic" /> 

    </RelativeLayout> 
</ScrollView> 

Я хочу, чтобы прокрутить весь макет, но проблемы наступает, когда только ListView становится скроллбар, так что вы можете только прокрутите этот список. Остальная часть плитки закреплена на высоте экрана.

Как можно прокрутить весь макет? Заранее спасибо.

+0

'ListView' имеет собственную полосу прокрутки. – Stanojkovic

ответ

0

ListView не может быть размещен внутри ScrollView, если вы не определите, что ваш ListView не прокручивается. Если вы хотите сделать это, вы должны создать пользовательский элемент управления ListView, как в следующем

public class NonScrollListView extends ListViewCompat { 

//Define a public constructor 
    @Override 
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 
     int heightMeasureSpec_custom = View.MeasureSpec.makeMeasureSpec(
       Integer.MAX_VALUE >> 2, View.MeasureSpec.AT_MOST); 
     super.onMeasure(widthMeasureSpec, heightMeasureSpec_custom); 
     ViewGroup.LayoutParams params = getLayoutParams(); 
     params.height = getMeasuredHeight(); 
    } 
} 
0

Вы не должны использовать ListView в ScroolView, он имеет свой свиток, и они мешают друг-другу. я бы рекомендовал создать адаптер список, который создает все ваши различные виды из массива с помощью переключателя оператор:

class MyAdapter extends ArrayAdapter{ 

    public MyAdapter(Context context, int resource, List objects) { 
     super(context, resource, objects); 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     ViewItem viewType = getItem(position); 

     switch(viewType.type){ 
      case TEXTVIEW: convertView = LayoutInflater.from(getContext()).inflate(R.layout.textView1, parent, false); 

       break; 
      case LISTITEM: convertView = LayoutInflater.from(getContext()).inflate(R.layout.listItem, parent, false); 

       break; 
     } 


     return convertView; 
    } 


} 
2

Я иду через вашу проблему. Вы не можете напрямую использовать представление списка внутри прокрутки. Если вы хотите использовать его, то вам нужно дать прагматичную высоту, чтобы просмотреть список, и это работает для меня.

public class test1 extends Activity { 
... 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_test1); 
... 

//here 1st set your list view than call set_List_View_Height_Based_On_Children... 

set_List_View_Height_Based_On_Children(your_Listview_name); 
... 
} 
///method set_List_View_Height_Based_On_Children 
public static void set_List_View_Height_Based_On_Children(ListView listView) { 
    ListAdapter listAdapter = listView.getAdapter(); 
    if (listAdapter == null) 
     return; 

    int desiredWidth = View.MeasureSpec.makeMeasureSpec(listView.getWidth(), View.MeasureSpec.UNSPECIFIED); 
    int totalHeight = 0; 
    View view = null; 
    for (int i = 0; i < listAdapter.getCount(); i++) { 
     view = listAdapter.getView(i, view, listView); 
     if (i == 0) 
      view.setLayoutParams(new ViewGroup.LayoutParams(desiredWidth, ViewGroup.LayoutParams.WRAP_CONTENT)); 

     view.measure(desiredWidth, View.MeasureSpec.UNSPECIFIED); 
     totalHeight += view.getMeasuredHeight(); 
    } 
    ViewGroup.LayoutParams params = listView.getLayoutParams(); 
    params.height = totalHeight + (listView.getDividerHeight() * (listAdapter.getCount() - 1)); 
    listView.setLayoutParams(params); 
    listView.requestLayout(); 
} 
}