问题描述
我知道这里已经有一些关于此的主题,但我找不到可以为我的案例工作的解决方案.
I know there are some topics about this here already but I could not find a solution which I could get to work for my case.
我有一个使用自定义 FragmentActivity
和 FragmentPagerAdapter
的滑动图库,其中包含一个 Fragment 列表.
I have a working sliding gallery using a custom FragmentActivity
and FragmentPagerAdapter
which holds a list of Fragments.
在 FragmentActivity
中是一个 ImageView
删除".如果点击,函数 deleteMedia()
被调用,然后应该删除当前的 Fragment
并且应该显示下面的 Fragment
.在我的示例中,我必须如何做到这一点?
Within the FragmentActivity
is a ImageView
"delete". If clicked, the function deleteMedia()
is called which then should remove the current Fragment
and the following Fragment
should be displayed.How would I have to do that in my example?
片段活动:
public class GalleryPagerActivity extends FragmentActivity implements OnClickListener {
private Intent intent;
private SharedPreferences settings;
private PagerAdapter mPagerAdapter;
private ViewPager mPager;
private List<Fragment> fragments;
private List<WhiteboardMedia> wiList;
private int selectedPosition;
private LinearLayout llTop;
private TextView tvTop;
private ImageView delete;
private ImageView share;
private TextView tvCounter;
private TextView tvFilename;
private TextView tvFilesize;
private TextView tvDate;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
try {
super.setContentView(R.layout.gallery_pager);
intent = getIntent();
Type collectionType = new TypeToken<List<WhiteboardMedia>>(){}.getType();
wiList = gson.fromJson(intent.getStringExtra("wiList"), collectionType);
selectedPosition = intent.getIntExtra("position", 1);
llTop = (LinearLayout) findViewById(R.id.llTop);
llTop.setOnClickListener(this);
tvTop = (TextView) findViewById(R.id.tvTop);
tvTop.setOnClickListener(this);
delete = (ImageView) findViewById(R.id.imgDelete);
delete.setOnClickListener(this);
share = (ImageView) findViewById(R.id.imgShare);
share.setOnClickListener(this);
tvCounter = (TextView) findViewById(R.id.tvCounter);
tvFilename = (TextView) findViewById(R.id.tvFilename);
tvFilesize = (TextView) findViewById(R.id.tvFilesize);
tvDate = (TextView) findViewById(R.id.tvDate);
createContextMenu();
initDropbox();
} catch (Exception e) {
Log.e("GalleryPagerActivity", e.getLocalizedMessage());
}
}
/**
* Initialise the pager
*/
private void initialisePager() {
mPager = (ViewPager) super.findViewById(R.id.viewpager);
mPager.setAdapter(this.mPagerAdapter);
mPager.setOnPageChangeListener(new GalleryPageListener(tvCounter, tvFilename, tvFilesize, tvDate, wiList));
mPager.setCurrentItem(selectedPosition, true);
updatePage(selectedPosition);
}
public void updatePage(int position)
{
int focusedPage = position + 1;
Log.i("onPageSelected", "page selected " + position);
WhiteboardMedia wiImage = wiList.get(position);
String imageDate = "N/A";
try {
Date dateTaken= new Date(); //wiImage.getDate();
SimpleDateFormat sdf = new SimpleDateFormat("yy/MM/dd");
imageDate = sdf.format(dateTaken);
} catch (Exception e) {
}
try {
tvCounter.setText(focusedPage + "/" + wiList.size());
tvFilename.setText(wiImage.getFilename());
tvFilesize.setText(wiImage.getSize() + "a");
tvDate.setText(imageDate);
} catch (Exception e) {
}
}
@Override
protected void onResume() {
super.onResume();
}
@Override
public void onDestroy() {
super.onDestroy();
}
private WhiteboardMedia getActiveWhiteboardImage() {
return wiList.get(mPager.getCurrentItem());
}
private final int DELETE = 1;
@Override
public boolean onCreateOptionsMenu(Menu menu) {
menu.add(1, DELETE, 2, R.string.delete).setIcon(R.drawable.menu_btn_trash);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case DELETE:
deleteMedia();
return true;
}
return super.onContextItemSelected(item);
}
@Override
public void onClick(View v) {
if (v == delete) {
deleteMedia();
}
}
private void deleteMedia() {
// TODO delete the active Fragment and display the next Fragment in the list
}
/******************************************************************************
* Context Menu
*****************************************************************************/
private void createContextMenu() {
// context menu stuff
}
@Override
protected Dialog onCreateDialog(int id) {
// stuff
}
}
FragmentPagerAdapter:
public class GalleryPagerAdapter extends FragmentPagerAdapter {
private final List<Fragment> fragments;
public GalleryPagerAdapter(FragmentManager fm, List<Fragment> fragments) {
super(fm);
this.fragments = fragments;
}
@Override
public Fragment getItem(int position) {
return this.fragments.get(position);
}
@Override
public int getCount() {
return this.fragments.size();
}
}
感谢您的帮助!
推荐答案
首先,我建议您考虑更改您的 FragmentPagerAdapter
,使其看起来更像 示例.您通常不持有片段列表,就像 ArrayAdapter
通常持有行的 Views
列表一样.通常,您按需创建片段,其他人持有列表.
First, I suggest that you consider altering your FragmentPagerAdapter
, to look more like the sample. You normally do not hold a list of fragments, any more than an ArrayAdapter
normally holds a list of Views
for the rows. Normally, you create the fragments on demand, and somebody else holds the list.
然后,要删除某些内容,请从您的模型数据中删除它(FragmentPagerAdapter
通常包装的内容).确保 getCount()
然后将返回正确数量的项目.然后,在 FragmentPagerAdapter
上调用 notifyDataSetChanged()
,这将触发 ViewPager
的重绘.
Then, to delete something, delete it from your model data (what the FragmentPagerAdapter
normally wraps). Make sure that getCount()
will then return the right number of items. Then, call notifyDataSetChanged()
on the FragmentPagerAdapter
, which should trigger a redraw of the ViewPager
.
这篇关于如何从 FragmentPagerAdapter 中删除 Fragment?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!