2016-03-30 16 views
0

Ich habe ein Problem mit ViewPager innerhalb ScrollView. Ich habe einen Adapter erstellt, der richtig funktioniert, wenn LinearLayout ein Root-Layout ist. Aber wenn ich zu ScrollView wechsle, dann zeigt es keine Bilder an. Ich brauche ScrollView, weil ich ein paar Elemente zum Anzeigen habe und es muss scrollbar sein. Mein Layout ist in activity_exercises_preview.xml Datei.ViewPager Bild Slider in ScrollView

-Layout, das nicht funktioniert:

<ScrollView 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:padding="5dp" 
    android:background="@color/colorBackground"> 

    <LinearLayout 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:orientation="vertical"> 

     <android.support.v7.widget.CardView 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      app:cardCornerRadius="0dp" 
      android:id="@+id/cv" 
      > 

      <LinearLayout 
       android:layout_width="match_parent" 
       android:layout_height="match_parent" 
       android:orientation="vertical" 
       android:minHeight="200dp"> 

       <android.support.v4.view.ViewPager 
        android:id="@+id/viewPager" 
        android:layout_width="fill_parent" 
        android:layout_height="fill_parent"> 

       </android.support.v4.view.ViewPager> 

      </LinearLayout> 

     <android.support.v7.widget.CardView...> 

     <android.support.v7.widget.CardView...> 

     <android.support.v7.widget.CardView...> 

    </LinearLayout> 

</ScrollView> 

enter image description here

-Layout, das, aber ohne Scroll funktioniert:

<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:padding="5dp" 
    android:background="@color/colorBackground"> 

    <LinearLayout 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:orientation="vertical"> 

     <android.support.v7.widget.CardView 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      app:cardCornerRadius="0dp" 
      android:id="@+id/cv" 
      > 

      <LinearLayout 
       android:layout_width="match_parent" 
       android:layout_height="match_parent" 
       android:orientation="vertical" 
       android:minHeight="200dp"> 

       <android.support.v4.view.ViewPager 
        android:id="@+id/viewPager" 
        android:layout_width="fill_parent" 
        android:layout_height="fill_parent"> 

       </android.support.v4.view.ViewPager> 

      </LinearLayout> 

     <android.support.v7.widget.CardView...> 

     <android.support.v7.widget.CardView...> 

     <android.support.v7.widget.CardView...> 

    </LinearLayout> 

</LinearLayout> 

enter image description here

Mein Adapter:

public class CustomAdapter extends PagerAdapter{ 

    Context context; 
    int[] imageId = {R.drawable.icon, R.drawable.gwiazdki, R.drawable.arnoldki_3}; 

    public CustomAdapter(Context context){ 
     this.context = context; 
    } 

    @Override 
    public Object instantiateItem(ViewGroup container, int position) { 
     // TODO Auto-generated method stub 

     LayoutInflater inflater = ((Activity)context).getLayoutInflater(); 

     View viewItem = inflater.inflate(R.layout.image_item, container, false); 
     ImageView imageView = (ImageView) viewItem.findViewById(R.id.imageView); 
     imageView.setImageResource(imageId[position]); 
     ((ViewPager)container).addView(viewItem); 

     return viewItem; 
    } 

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

    @Override 
    public boolean isViewFromObject(View view, Object object) { 
     // TODO Auto-generated method stub 

     return view == ((View)object); 
    } 


    @Override 
    public void destroyItem(ViewGroup container, int position, Object object) { 
     // TODO Auto-generated method stub 
     ((ViewPager) container).removeView((View) object); 
    } 
} 

    Activity: 



public class ExercisesPreview extends AppCompatActivity { 
     List<Exercise> exercises; 
     Exercise exercise; 
     ViewPager viewPager; 

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

      viewPager = (ViewPager) findViewById(R.id.viewPager); 
      PagerAdapter adapter = new CustomAdapter(ExercisesPreview.this); 
      viewPager.setAdapter(adapter); 
      viewPager.setOnTouchListener(new View.OnTouchListener() { 
       @Override 
       public boolean onTouch(View v, MotionEvent event) { 
        viewPager.getParent().requestDisallowInterceptTouchEvent(true); 
        return false; 
       } 
      }); 

     } 
    (...) 
    } 

image_item.xml:

<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical" > 

    <ImageView 
     android:id="@+id/imageView" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     /> 

</LinearLayout> 

Irgendwelche Ideen?

+0

ich hatte ein solches Problem wie bei Ihnen, aber durch meine benutzerdefinierte nestedScrollView aufgelöst, die Somethings und als Notiz viewPager in einem Scrollview propperly –

+0

Griffe wird nicht funktionieren möchten Sie gerne zeige deine Layoutdatei? Ich habe es auch mit 'NestedScrollView' versucht, aber leider ohne Glück. – user3448282

+1

Ja krank Beitrag als Antwort, wenn nicht helfen, sagen Sie mir, das zu löschen, und wenn es eine andere Möglichkeit ist, Sie mein Layout zu sagen. –

Antwort

1

Verwendung dieser Brauch ViewPager in Ihrem Scroll:

public class WrapContentHeightViewPager extends ViewPager { 
public WrapContentHeightViewPager(Context context) { 
    super(context); 
} 

public WrapContentHeightViewPager(Context context, AttributeSet attrs) { 
    super(context, attrs); 
} 

@Override 
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 
    super.onMeasure(widthMeasureSpec, heightMeasureSpec); 

    int height = 0; 
    for (int i = 0; i < getChildCount(); i++) { 
     View child = getChildAt(i); 
     child.measure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED)); 
     int h = child.getMeasuredHeight(); 
     if (h > height) height = h; 
    } 
    heightMeasureSpec = MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY); 
    super.onMeasure(widthMeasureSpec, heightMeasureSpec); 
}} 
+0

Wow! Es funktioniert perfekt! Vielen Dank, Bryan! – user3448282