使用带有视图寻呼机的片段PagerAdapter时的类强制转换异常

时间:2017-05-09 18:53:46

标签: android android-viewpager classcastexception fragmentpageradapter

最初我没有使用fragmentpager适配器,我的应用程序工作正常,我试图操纵我的代码使其与fragment.this应用程序包括一个包含一个片段的活动,并通过这个片段我试图给视图寻呼机充气这将显示我的SD卡中的图像。为此目的,我已经制作了一个FragmentPagerAdapter但我得到了类强制转换异常。

-i也不知道要传递什么来获取适配器的Item方法。

这是我的Activity类

public class FragmentGallery extends Fragment {

private ViewPager viewPager;
private SwipeAdapter swipeAdapter;
ActivityGallery activityGallery=new ActivityGallery();
ActivityGallery gallery=(ActivityGallery) getActivity();

private ArrayList<String> filePath = new ArrayList<String>();// list of file paths
private ArrayList<String> filePathToSend = new ArrayList<String>();
private File[] listFile;

public FragmentGallery() {
    // Required empty public constructor
}


@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    getFromSdcard();

    View view= inflater.inflate(R.layout.fragment_fragment_gallery, container, false);

    viewPager = (ViewPager) view.findViewById(R.id.vp_Gallery);

    int position=activityGallery.getPos();

    for(int i=(position*3);i<=((position*3)+2);i++){

        filePathToSend.add(filePath.get(i));

    }

    swipeAdapter =new SwipeAdapter(getFragmentManager(),getContext(),filePathToSend);
    viewPager.setAdapter(swipeAdapter);

    return view;
}

public void getFromSdcard()
{
    File file= new File(android.os.Environment.getExternalStorageDirectory(),"Gallery");

    if (file.isDirectory())
    {
        listFile = file.listFiles();


        for (int i = 0; i < listFile.length; i++)
        {

            filePath.add(listFile[i].getAbsolutePath());

        }
    }
}

}

这是我的片段类

public class SwipeAdapter extends FragmentStatePagerAdapter {


private ImageView imagsForGallery;
/*private TextView imageNumber;*/
private Context context;
private LayoutInflater layoutInflater;
private ArrayList<String> filePathToReceive = new ArrayList<String>();

public SwipeAdapter(FragmentManager fm,Context context,ArrayList<String> filePathToReceive) {
    super(fm);
    this.context = context;
    this.filePathToReceive=filePathToReceive;

}


/*public SwipeAdapter(Context context,ArrayList<String> filePathToReceive) {

    this.context = context;
    this.filePathToReceive=filePathToReceive;
}*/

@Override
public int getCount() {
    return filePathToReceive.size();
}

@Override
public boolean isViewFromObject(View view, Object object) {

    return (view == object);
}

@Override
public android.support.v4.app.Fragment getItem(int position) {
    return FragmentGallery.instantiate(context,filePathToReceive.get(position));
}

@Override
public Object instantiateItem(ViewGroup container, int position) {

    layoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    View view = layoutInflater.inflate(R.layout.imageswipable, container, false);

    imagsForGallery = (ImageView) view.findViewById(R.id.iv_ImagesForGallery);
    /*imageNumber = (TextView) view.findViewById(R.id.tv_ImageNumber);*/

    //using picasso to load images
    Picasso.with(imagsForGallery.getContext()).load(new File(filePathToReceive.get(position))).into(imagsForGallery);
    /*imageNumber.setText("Image No. : " + (position + 1));*/
    container.addView(view);

    return view;
}

//distroy slides when we move from one slide to another
@Override
public void destroyItem(ViewGroup container, int position, Object object) {

    container.removeView((RelativeLayout) object);
    notifyDataSetChanged();

}

}

这是我的适配器类

05-10 00:14:42.074 26639-26639/com.example.jitendra.tourism E/AndroidRuntime: FATAL EXCEPTION: main
                                                                          Process: com.example.jitendra.tourism, PID: 26639
                                                                          java.lang.ClassCastException: android.widget.RelativeLayout cannot be cast to android.support.v4.app.Fragment
                                                                              at android.support.v4.app.FragmentStatePagerAdapter.setPrimaryItem(FragmentStatePagerAdapter.java:149)
                                                                              at android.support.v4.view.ViewPager.populate(ViewPager.java:1266)
                                                                              at android.support.v4.view.ViewPager.populate(ViewPager.java:1116)
                                                                              at android.support.v4.view.ViewPager.onMeasure(ViewPager.java:1642)
                                                                              at android.view.View.measure(View.java:19861)
                                                                              at android.widget.RelativeLayout.measureChildHorizontal(RelativeLayout.java:715)
                                                                              at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:461)
                                                                              at android.view.View.measure(View.java:19861)
                                                                              at android.widget.RelativeLayout.measureChildHorizontal(RelativeLayout.java:715)
                                                                              at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:461)
                                                                              at android.view.View.measure(View.java:19861)
                                                                              at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6083)
                                                                              at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
                                                                              at android.support.v7.widget.ContentFrameLayout.onMeasure(ContentFrameLayout.java:139)
                                                                              at android.view.View.measure(View.java:19861)
                                                                              at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6083)
                                                                              at android.support.v7.widget.ActionBarOverlayLayout.onMeasure(ActionBarOverlayLayout.java:393)
                                                                              at android.view.View.measure(View.java:19861)
                                                                              at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6083)
                                                                              at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
                                                                              at android.view.View.measure(View.java:19861)
                                                                              at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6083)
                                                                              at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1464)
                                                                              at android.widget.LinearLayout.measureVertical(LinearLayout.java:758)
                                                                              at android.widget.LinearLayout.onMeasure(LinearLayout.java:640)
                                                                              at android.view.View.measure(View.java:19861)
                                                                              at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6083)
                                                                              at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
                                                                              at com.android.internal.policy.DecorView.onMeasure(DecorView.java:691)
                                                                              at android.view.View.measure(View.java:19861)

}

这是我的日志

$x = "1-2";
$x = "2 to 8";
$x = "13 days to 18 days";

2 个答案:

答案 0 :(得分:0)

似乎麻烦在SwipeAdapter container.removeView((RelativeLayout) object);中,你得到一个片段,但不是RelativeLayout,这就是为什么你有这样的例外。

您可以查看您扩展的FragmentStatePagerAdapter的源代码:

 @Override
public void destroyItem(ViewGroup container, int position, Object object) {
    Fragment fragment = (Fragment) object;

    if (mCurTransaction == null) {
        mCurTransaction = mFragmentManager.beginTransaction();
    }
    if (DEBUG) Log.v(TAG, "Removing item #" + position + ": f=" + object
            + " v=" + ((Fragment)object).getView());
    while (mSavedState.size() <= position) {
        mSavedState.add(null);
    }
    mSavedState.set(position, fragment.isAdded()
            ? mFragmentManager.saveFragmentInstanceState(fragment) : null);
    mFragments.set(position, null);

    mCurTransaction.remove(fragment);
}

在方法的顶部,我们可以看到,我们的对象是一个片段。 Link for the full class.

请尝试更改方法实施。

答案 1 :(得分:0)

1。instantiateItem()方法ViewGroup中,返回View而不是@Override public Object instantiateItem(ViewGroup container, int position) { layoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); ViewGroup view = (ViewGroup) layoutInflater.inflate(R.layout.imageswipable, container, false); imagsForGallery = (ImageView) view.findViewById(R.id.iv_ImagesForGallery); /*imageNumber = (TextView) view.findViewById(R.id.tv_ImageNumber);*/ //using picasso to load images Picasso.with(imagsForGallery.getContext()).load(new File(filePathToReceive.get(position))).into(imagsForGallery); /*imageNumber.setText("Image No. : " + (position + 1));*/ container.addView(view); return view; }

destroyItem()

2。更新@Override public void destroyItem(ViewGroup container, int position, Object object) { container.removeView((View) object); } 方法如下:

PagerAdapter

3。使用FragmentStatePagerAdapter代替SwipeAdapter

以下是您的最终import android.content.Context; import android.support.v4.view.PagerAdapter; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import java.io.File; import java.util.ArrayList; public class SwipeAdapter extends PagerAdapter { private Context context; private ImageView imagsForGallery; private ArrayList<String> filePathToReceive = new ArrayList<String>(); public SwipeAdapter(Context context, ArrayList<String> filePathToReceive) { this.context = context; this.filePathToReceive = filePathToReceive; } @Override public int getCount() { return filePathToReceive.size(); } @Override public boolean isViewFromObject(View view, Object object) { return (view == object); } @Override public Object instantiateItem(ViewGroup container, int position) { LayoutInflater layoutInflater = LayoutInflater.from(context); ViewGroup view = (ViewGroup) layoutInflater.inflate(R.layout.imageswipable, container, false); imagsForGallery = (ImageView) view.findViewById(R.id.iv_ImagesForGallery); /*imageNumber = (TextView) view.findViewById(R.id.tv_ImageNumber);*/ //using picasso to load images Picasso.with(context).load(new File(filePathToReceive.get(position))).into(imagsForGallery); /*imageNumber.setText("Image No. : " + (position + 1));*/ container.addView(view); return view; } // destroy slides when we move from one slide to another @Override public void destroyItem(ViewGroup container, int position, Object object) { container.removeView((View) object); } } 课程:

FragmentGallery

4. :在swipeAdapter中,初始化@Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { ............ ..................... swipeAdapter = new SwipeAdapter(getActivity(), filePathToSend); viewPager.setAdapter(swipeAdapter); return view; } ,如下所示:

{{1}}

希望这会有所帮助〜