【问题标题】:Class cast exception while using fragment PagerAdapter with view pager将片段 PagerAdapter 与视图寻呼机一起使用时发生类转换异常
【发布时间】:2017-05-11 16:50:08
【问题描述】:

最初我没有使用 fragmentpager 适配器,我的应用程序运行良好,而不是我尝试操纵我的代码以使其与 fragment 一起使用。这个应用程序包括一个包含一个片段的 Activity,并且通过这个片段我试图膨胀一个视图寻呼机这将显示我的 sd 卡中存在的图像。为此,我制作了一个 FragmentPagerAdapter,但我得到了 Class cast 异常。

-我也不知道要通过什么来获取适配器的Item方法。

这是我的活动课

public class ActivityGallery extends AppCompatActivity {


private int position;

@Override
protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    setContentView(R.layout.activitygallery);

    Intent in = getIntent();
    position = in.getIntExtra("position", 0);


}



public int getPos(){

    return position;
}

}

这是我的片段类

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)

【问题讨论】:

  • 能否请您删除您的注释代码?可读性会更好。
  • 我已经评论了这些行,因为如果我找不到使用 fragmentpageradapter 制作我的应用程序的方法,那么我将回滚到我以前的代码。
  • 删除了 cmets

标签: android android-viewpager classcastexception fragmentpageradapter


【解决方案1】:

似乎问题出在 SwipeAdapter container.removeView((RelativeLayout) object);,你得到一个 Fragment,但不是 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);
}

在方法的顶部,我们可以看到,我们的 Object 是一个 Fragment。 Link for the full class.

请尝试更改您的方法实现。

【讨论】:

  • 至少提供一些最小的步骤、一个小例子、资源或其他东西,以确保得到一个可接受的答案。
【解决方案2】:

1.SwipeAdapter's方法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;
}

2.更新destroyItem()方法如下:

@Override
public void destroyItem(ViewGroup container, int position, Object object) {

    container.removeView((View) object);
}

3. 使用PagerAdapter 而不是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);
    }
}

4. 在您的FragmentGallery 中,初始化您的swipeAdapter,如下所示:

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

    ............
    .....................

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

    return view;
}

希望对你有帮助~

【讨论】:

  • 如前所述位不工作。还是一样的错误。
  • 你能告诉我我应该在 getItem 方法中写什么代码吗?我无法理解这种方法。
  • 你已经使用了FragmentGallery.instantiate(context,filePathToReceive.get(position)),但是你的FragmentGallery中没有instantiate()方法
  • 我在更新的答案中给出了一个可行的解决方案。试试看,让我知道结果。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多