我想动态地在我的视图寻呼机中添加或删除页面。这可能吗?
答案 0 :(得分:25)
是。您可以动态地向ViewrAdapter添加或删除视图,并将其提供给ViewPager,并从PagerAdapter调用notifyDataSetChanged()
以向受影响的ViewPager发出有关更改的警报。但是,当您这样做时,您必须覆盖PagerAdapter的getItemPosition(Object)
,它会告诉他们当前显示的项目是否已更改位置。默认情况下,此函数设置为POSITION_UNCHANGED
,因此如果不重写此方法,ViewPager将不会立即刷新。例如,
public class mAdapter extends PagerAdapter {
List<View> mList;
public void addView(View view, int index) {
mList.add(index, view);
notifyDataSetChanged();
}
public void removeView(int index) {
mList.remove(index);
notifyDataSetChanged();
}
@Override
public int getItemPosition(Object object)) {
if (mList.contains(object) {
return mList.indexOf(object);
} else {
return POSITION_NONE;
}
}
}
但是,如果您只想暂时从显示中添加或删除视图,而不是从PagerAdapter的数据集中添加或删除视图,请尝试使用setPrimaryItem(ViewGroup, int, Object)
转到PagerAdapter数据中的特定视图并{{1}用于从显示中删除视图。
答案 1 :(得分:18)
是的,由于ViewPager从PagerAdapter获取子视图,您可以在其上添加新页面/删除页面,并调用.notifyDataSetChanged()来重新加载它。
答案 2 :(得分:16)
是的,代码应该是这样的:
public int addPage(View view, int position) {
if ((position >= 0) && (position < getSize())) {
myPagerAdapter.mListViews.add(position, view);
myPagerAdapter.notifyDataSetChanged();
return position;
} else {
return -1;
}
}
public View removePage(int position) {
if ((position < 0) || (position >= getSize()) || (getSize()<=1)) {
return null;
} else {
if (position == mPager.getCurrentItem()) {
if(position == (getSize()-1)) {
mPager.setCurrentItem(position-1);
} else if (position == 0){
mPager.setCurrentItem(1);
}
}
View tempView = myPagerAdapter.mListViews.remove(position);
myPagerAdapter.notifyDataSetChanged();
return tempView;
}
}
但是有一个错误。如果当前项目为0,并且要删除第0页,它将不会立即刷新屏幕,我还没有找到解决方案。
答案 3 :(得分:3)
我确信您通过扩展PageAdapter创建了一个适配器,因此有一种方法:
@Override
public void destroyItem(View collection, int position, Object view) {
((ViewPager) collection).removeView((View) view);
}
有关相同的详细示例,请浏览this example。
答案 4 :(得分:3)
以下是此问题的替代解决方案。我的适配器:
private class PagerAdapter extends FragmentPagerAdapter implements
ViewPager.OnPageChangeListener, TabListener {
private List<Fragment> mFragments = new ArrayList<Fragment>();
private ViewPager mPager;
private ActionBar mActionBar;
private Fragment mPrimaryItem;
public PagerAdapter(FragmentManager fm, ViewPager vp, ActionBar ab) {
super(fm);
mPager = vp;
mPager.setAdapter(this);
mPager.setOnPageChangeListener(this);
mActionBar = ab;
}
public void addTab(PartListFragment frag) {
mFragments.add(frag);
mActionBar.addTab(mActionBar.newTab().setTabListener(this).
setText(frag.getPartCategory()));
}
@Override
public Fragment getItem(int position) {
return mFragments.get(position);
}
@Override
public int getCount() {
return mFragments.size();
}
/** (non-Javadoc)
* @see android.support.v4.app.FragmentStatePagerAdapter#setPrimaryItem(android.view.ViewGroup, int, java.lang.Object)
*/
@Override
public void setPrimaryItem(ViewGroup container, int position,
Object object) {
super.setPrimaryItem(container, position, object);
mPrimaryItem = (Fragment) object;
}
/** (non-Javadoc)
* @see android.support.v4.view.PagerAdapter#getItemPosition(java.lang.Object)
*/
@Override
public int getItemPosition(Object object) {
if (object == mPrimaryItem) {
return POSITION_UNCHANGED;
}
return POSITION_NONE;
}
@Override
public void onTabSelected(Tab tab, FragmentTransaction ft) {
mPager.setCurrentItem(tab.getPosition());
}
@Override
public void onTabUnselected(Tab tab, FragmentTransaction ft) { }
@Override
public void onTabReselected(Tab tab, FragmentTransaction ft) { }
@Override
public void onPageScrollStateChanged(int arg0) { }
@Override
public void onPageScrolled(int arg0, float arg1, int arg2) { }
@Override
public void onPageSelected(int position) {
mActionBar.setSelectedNavigationItem(position);
}
/**
* This method removes the pages from ViewPager
*/
public void removePages() {
mActionBar.removeAllTabs();
//call to ViewPage to remove the pages
vp.removeAllViews();
mFragments.clear();
//make this to update the pager
vp.setAdapter(null);
vp.setAdapter(pagerAdapter);
}
}
动态删除和添加的代码
//remove the pages. basically call to method removeAllViews from ViewPager
pagerAdapter.removePages();
pagerAdapter.addPage(pass your fragment);
在Peri Hartman的建议之后,在我将null
设置为ViewPager适配器并在删除视图后再次放置适配器后,它开始工作。在此之前,页面0没有显示其列表内容。
答案 5 :(得分:2)
首先:覆盖pagerAdapter方法&#34; getItemPosition&#34;
@Override
public int getItemPosition(Object object) {
return POSITION_NONE;
}
}
第二步:使用适配器删除数据绑定。并调用adapter.notifydatachanged
答案 6 :(得分:1)
@Bind(R.id.pager)
ViewPager pager;
int pos = pager.getCurrentItem();
pager.removeViewAt(pos);
答案 7 :(得分:0)
此解决方案目前运作良好:
public class CustomPagerAdapter extends PagerAdapter {
private final List<Item> objects = new ArrayList<>();
public CustomPagerAdapter(List<Item> objects) {
if (objects != null) {
this.objects.add(objects);
}
}
@Override
public int getCount() {
return objects.size();
}
@Override
public boolean isViewFromObject(View view, Object object) {
Item item = (Item) object;
ItemView itemView = (ItemView) view;
return Objects.equals(itemView.getItem(), item);
}
@Override
public int getItemPosition(Object object) {
Item item = (Item) object;
int idx = objects.indexOf(item);
return idx == -1 ? POSITION_NONE : idx;
}
@Override
public Item instantiateItem(ViewGroup container, int position) {
Item item = objects.get(position);
final int id = generateViewIdForItem(item);
ItemView itemView = new ItemView(container.getContext());
itemView.setId(id);
container.addView(itemView);
itemView.setItem(item);
return item;
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
Item item = (Item) object;
final int id = generateViewIdForItem(item);
View view = container.findViewById(id);
if (view != null) {
container.removeView(view);
}
}
public void update(@Nullable List<Item> objects) {
this.objects.clear();
if (objects != null) {
this.objects.addAll(objects);
}
notifyDataSetChanged();
}
public void clear() {
update(null);
}
/* add remove/update/add methods if you need, don't forget to call notifyDataSetChanged */
private static int generateViewIdForItem(Item item) {
return Math.abs(item.hashCode());
}
}
请注意:
Item
课程必须包含equals
和hashCode
方法的相应实施ItemView
课程必须包含Item
对象的getter和setter。答案 8 :(得分:0)
根据其他答案和其他资源,我已使用此代码结束。
<强> CustomPagerAdapter 强>:
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.support.v4.view.PagerAdapter;
import android.view.View;
import android.view.ViewGroup;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class CustomPagerAdapter extends PagerAdapter {
private List<Fragment> pages = new ArrayList<>();
private Map<Fragment, Integer> fragmentsPosition = new HashMap<>();
private Fragment currentPrimaryItem;
private FragmentManager fragmentManager;
private FragmentTransaction currentTransaction;
public CustomPagerAdapter(FragmentManager fragmentManager) {
this.fragmentManager = fragmentManager;
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
if (currentTransaction == null) {
currentTransaction = fragmentManager.beginTransaction();
}
Fragment pageFragment = pages.get(position);
String tag = pageFragment.getArguments().getString(MainActivity.FRAGMENT_TAG_ARG);
Fragment fragment = fragmentManager.findFragmentByTag(tag);
if (fragment != null) {
if (fragment.getId() == container.getId()) {
currentTransaction.attach(fragment);
}
else {
fragmentManager.beginTransaction().remove(fragment).commit();
fragmentManager.executePendingTransactions();
currentTransaction.add(container.getId(), fragment, tag);
}
}
else {
fragment = pageFragment;
currentTransaction.add(container.getId(), fragment, tag);
}
if (fragment != currentPrimaryItem) {
fragment.setMenuVisibility(false);
fragment.setUserVisibleHint(false);
}
return fragment;
}
@Override
public int getCount() {
return pages.size();
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
if (currentTransaction == null) {
currentTransaction = fragmentManager.beginTransaction();
}
currentTransaction.detach((Fragment) object);
}
@Override
public void setPrimaryItem(ViewGroup container, int position, Object object) {
Fragment fragment = (Fragment) object;
if (fragment != currentPrimaryItem) {
if (currentPrimaryItem != null) {
currentPrimaryItem.setMenuVisibility(false);
currentPrimaryItem.setUserVisibleHint(false);
}
if (fragment != null) {
fragment.setMenuVisibility(true);
fragment.setUserVisibleHint(true);
}
currentPrimaryItem = fragment;
}
}
@Override
public void finishUpdate(ViewGroup container) {
if (currentTransaction != null) {
currentTransaction.commitAllowingStateLoss();
currentTransaction = null;
fragmentManager.executePendingTransactions();
}
}
@Override
public boolean isViewFromObject(View view, Object object) {
return ((Fragment) object).getView() == view;
}
@Override
public int getItemPosition(Object o) {
Integer result = fragmentsPosition.get(o);
if (result == null) {
return PagerAdapter.POSITION_UNCHANGED;
}
return result;
}
// ---------------------------------- Page actions ----------------------------------
public void addPage(Fragment fragment) {
fragmentsPosition.clear();
pages.add(fragment);
notifyDataSetChanged();
}
public void removePage(int position) {
fragmentsPosition.clear();
Fragment pageFragment = pages.get(position);
String tag = pageFragment.getArguments().getString(MainActivity.FRAGMENT_TAG_ARG);
Fragment fragment = fragmentManager.findFragmentByTag(tag);
if (fragment != null) {
fragmentsPosition.put(fragment, PagerAdapter.POSITION_NONE);
}
for (int i = position + 1; i < pages.size(); i++) {
pageFragment = pages.get(i);
tag = pageFragment.getArguments().getString(MainActivity.FRAGMENT_TAG_ARG);
fragment = fragmentManager.findFragmentByTag(tag);
if (fragment != null) {
fragmentsPosition.put(fragment, i - 1);
}
}
pages.remove(position);
notifyDataSetChanged();
}
}
<强> MainActivity 强>:
import android.os.Bundle;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;
public class MainActivity extends AppCompatActivity {
public static final String FRAGMENT_TAG_ARG = "tag";
private CustomPagerAdapter mCustomPagerAdapter;
private ViewPager mViewPager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mCustomPagerAdapter = new CustomPagerAdapter(getSupportFragmentManager());
mCustomPagerAdapter.addPage(MainFragment.newInstance("Main_Title"));
mCustomPagerAdapter.addPage(SecondaryFragment.newInstance("Secondary_Title"));
mViewPager = (ViewPager) findViewById(R.id.container);
mViewPager.setAdapter(mCustomPagerAdapter);
}
}
删除页面:
mCustomPagerAdapter.removePage(1);
<强> MainFragment 强>:
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
public class MainFragment extends Fragment {
public static final String FRAGMENT_TAG = "MainFragment";
public static MainFragment newInstance(String text) {
return newInstance(text, FRAGMENT_TAG);
}
public static MainFragment newInstance(String text, String tag) {
MainFragment fragment = new MainFragment();
Bundle args = new Bundle();
args.putString("text", text);
args.putString(MainActivity.FRAGMENT_TAG_ARG, tag + "_" + fragment.hashCode());
fragment.setArguments(args);
return fragment;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_main, container, false);
TextView textView = (TextView) rootView.findViewById(R.id.section_label);
textView.setText(getArguments().getString("text"));
return rootView;
}
}
SecondaryFragment 具有相同的代码。
布局是简单的ViewPager / Fragment布局,android.support.v4.view.ViewPager
标识为container
,片段TextView
标识为section_label
。
<强>资源:强>
答案 9 :(得分:0)
您必须再次将适配器设置为viewpager,然后它将刷新内容。
我的PagerAdaper中的removeView(int pos)
public void removeView(int index) {
imageFileNames.remove(index);
notifyDataSetChanged();
}
无论我在哪里删除文件,我都必须这样做
imagePagerAdapter.removeView(currentPosition);
viewPager.setAdapter(imagePagerAdapter);
编辑:
以下方法有效,您可以应用以下方法。
public void updateView(int pos){
viewPager.setAdapter(null);
imagePagerAdapter =new ImagePagerAdapter(YOUR_CONTEXT,YOUR_CONTENT);
viewPager.setAdapter(imagePagerAdapter);
viewPager.setCurrentItem(pos);
}
将YOUR_CONTEXT替换为上下文,将内容替换为内容名称,即更新列表或其他内容。