最初我没有使用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;
}
希望这会有所帮助~