2017-12-31 65 views
0

VerticalViewPagerウィジェットが表示されたら、クラスCustomPagerAdapter mResources内の画像が表示されない理由を理解しようとしています。開始時には何も表示されず、垂直スワイプでは何も表示されません。PageAdapter + VerticalViewPagerは一緒に動作しません。どうして?

私は数日間それに行ってきましたが、ちょうどそれをひっくり返すことはありません。 ViewPager /アダプタのドキュメントが非常に明確でないことを助けません。

使用 - ネクサス6 AVDを、minSdkVersionが=

私は、このエラーメッセージが表示される(下からシングルクリックをし、トップのすべての方法をスワイプ)上にスクロールしようとすると19 ...

*AndroidRuntime: FATAL EXCEPTION: main 
Process: sparktic.com.verticalviewpager, PID: 19242 
java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first. 
at android.view.ViewGroup.addViewInner(ViewGroup.java:3562)* 

AFAIK pager_itemを正しく追加して削除しています。

のJava/MainActivity.java

package sparktic.com.verticalviewpager; 

import android.content.Context; 
import android.support.v4.view.PagerAdapter; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 

import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.ImageView; 
import android.widget.LinearLayout; 

public class MainActivity extends AppCompatActivity 
{ 
    VerticalViewPager mPager; 

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

     mPager = findViewById(R.id.viewpager); 

     CustomPagerAdapter adapter = new CustomPagerAdapter(this); 
     mPager.setAdapter(adapter); 
    } 

    class CustomPagerAdapter extends PagerAdapter 
    { 
     Context mContext; 
     public LayoutInflater mLayoutInflater; 

     int[] mResources = { 
       R.drawable.first, // Dload: https://i.imgur.com/suvAa9x.jpg 
       R.drawable.second, // Dload: https://i.imgur.com/c2f0Hvy.jpg 
       R.drawable.third // Dload: https://i.imgur.com/0GAs8qp.jpg 
     }; 

     public CustomPagerAdapter(Context context) 
     { 
      mContext = context; 
      mLayoutInflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     } 

     @Override 
     public int getCount() 
     { 
      return mResources.length; 
     } 

     @Override 
     public boolean isViewFromObject(View view, Object object) 
     { 
      return view == ((LinearLayout) object); 
     } 

     @Override 
     public Object instantiateItem(ViewGroup container, int position) 
     { 
      View itemView = mLayoutInflater.inflate(R.layout.pager_item, container, false); 

      ImageView imageView = (ImageView) itemView.findViewById(R.id.imageView); 
      imageView.setImageResource(mResources[position]); 

      container.addView(imageView); 

      return itemView; 
     } 

     @Override 
     public void destroyItem(ViewGroup container, int position, Object object) 
     { 
      container.removeView((LinearLayout) object); 
     } 
    } 
} 

レイアウト/ activity_main.xml

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    tools:context="sparktic.com.verticalviewpager.MainActivity"> 

    <sparktic.com.verticalviewpager.VerticalViewPager 
     android:id="@+id/viewpager" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" /> 

</RelativeLayout> 

レイアウト/ pager_item.xml

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

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

のjava/VerticalViewPager.java

package sparktic.com.verticalviewpager; 

import android.content.Context; 
import android.support.v4.view.ViewPager; 
import android.util.AttributeSet; 
import android.view.MotionEvent; 
import android.view.View; 

public class VerticalViewPager extends ViewPager 
{ 

    public VerticalViewPager(Context context) 
    { 
     this(context, null); 
    } 

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

    @Override 
    public boolean canScrollHorizontally(int direction) 
    { 
     return false; 
    } 

    @Override 
    public boolean canScrollVertically(int direction) 
    { 
     return super.canScrollHorizontally(direction); 
    } 

    private void init() 
    { 
     setPageTransformer(true, new VerticalPageTransformer()); 
     setOverScrollMode(View.OVER_SCROLL_NEVER); 
    } 

    @Override 
    public boolean onInterceptTouchEvent(MotionEvent ev) 
    { 
     final boolean toIntercept = super.onInterceptTouchEvent(flipXY(ev)); 
     flipXY(ev); 
     return toIntercept; 
    } 

    @Override 
    public boolean onTouchEvent(MotionEvent ev) 
    { 
     final boolean toHandle = super.onTouchEvent(flipXY(ev)); 
     flipXY(ev); 
     return toHandle; 
    } 

    private MotionEvent flipXY(MotionEvent ev) 
    { 
     final float width = getWidth(); 
     final float height = getHeight(); 
     final float x = (ev.getY()/height) * width; 
     final float y = (ev.getX()/width) * height; 
     ev.setLocation(x, y); 
     return ev; 
    } 

    private static final class VerticalPageTransformer implements ViewPager.PageTransformer 
    { 
     @Override 
     public void transformPage(View view, float position) 
     { 
      final int pageWidth = view.getWidth(); 
      final int pageHeight = view.getHeight(); 
      if (position < -1) 
      { 
       view.setAlpha(0); 
      } 
      else if (position <= 1) 
      { 
       view.setAlpha(1); 
       view.setTranslationX(pageWidth * -position); 
       float yPosition = position * pageHeight; 
       view.setTranslationY(yPosition); 
      } 
      else 
      { 
       view.setAlpha(0); 
      } 
     } 
    } 
} 

答えて

0

は私自身の問題を解決しました。他人を助ける場合...

問題は「instantiateItem」の範囲内でした。

container.addView(imageView); container.addView(itemView)にする必要があります。

PageAdapterオーバーライド内で何が起こっているのかについてはまだ把握していませんが、うまくいきますので、私は勝利して移動します。