将片段寻呼机适配器与视图寻呼器一起使用时类转换异常



最初我没有使用FragmentPager适配器,我的应用程序运行良好,而不是我尝试操作我的代码以使其与Fragment一起工作。此应用程序包含一个包含片段的活动,并通过此片段我试图膨胀视图寻呼机,该寻呼机将显示我的SD卡中存在的图像。为此,我制作了一个FragmentPagerAdapter,但我得到了类转换异常。

-我也不知道要通过什么来获取适配器的 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)

似乎问题出在滑动适配器container.removeView((RelativeLayout) object);,你得到一个片段,但不是相对布局,这就是为什么你有这样的例外。

你可以看看你扩展的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);
}

在方法的顶部,我们可以看到,我们的对象是一个片段。完整课程的链接。

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

1. 在方法 instantiateItem() SwipeAdapter's 中,返回 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;
}

希望这会有所帮助~

相关内容

最新更新