Viewpager
在Android中使用,是否可以以编程方式将任何页面移动到最后?例如,我有五页并希望将页面#2移动到最后一个位置(第五个位置),因此第3页变为2,4,变为3,5变为4?
谢谢
Rei*_*ier 34
是.我将通过展示我是如何做到的来尝试回答你的案例,我将在我的代码示例下面展示你的案例.
基本上,要实现这一点,您必须跟踪碎片的位置.下面是我用于my的实现FragmentPagerAdapter
,它使用ArrayList作为其数据源.
public class MyFragmentPagerAdapter extends FragmentPagerAdapter {
private HashMap<Long, Fragment> mItems
= new HashMap<Long, Fragment>();
private ArrayList<MyObject> dataset;
public MyFragmentPagerAdapter(ArrayList<MyObject> objects) {
this.dataset = objects;
}
@Override
public int getCount() {
return dataset.size();
}
@Override
public Fragment getItem(int position) {
long id = getItemId(position);
if(mItems.get(id) != null) {
// caching to prevent multiple instances of the same fragment
// for the same position/id
return mItems.get(id);
}
Fragment f = Fragment.newInstance();
mItems.put(id, f);
return f;
}
@Override
public long getItemId(int position) {
// return a unique id
return dataset.get(position).getUniqueId();
}
@Override
public int getItemPosition(Object object) {
/*
* Purpose of this method is to check whether an item in the adapter
* still exists in the dataset and where it should show.
* For each entry in dataset, request its Fragment.
*
* If the Fragment is found, return its (new) position. There's
* no need to return POSITION_UNCHANGED; ViewPager handles it.
*
* If the Fragment passed to this method is not found, remove all
* references and let the ViewPager remove it from display by
* by returning POSITION_NONE;
*/
Fragment f = (Fragment) object;
for(int i = 0; i < getCount(); i++) {
Fragment item = (Fragment) getItem(i);
if(item.equals(f)) {
// item still exists in dataset; return position
return i;
}
}
// if we arrive here, the data-item for which the Fragment was created
// does not exist anymore.
// Also, cleanup: remove reference to Fragment from mItems
for(Map.Entry<Long, MainListFragment> entry : mItems.entrySet()) {
if(entry.getValue().equals(f)) {
mItems.remove(entry.getKey());
break;
}
}
// Let ViewPager remove the Fragment by returning POSITION_NONE.
return POSITION_NONE;
}
}
Run Code Online (Sandbox Code Playgroud)
现在,如果您从数据集(this.dataset
)中删除项目并调用notifyDataSetChanged()
您的实例MyFragmentPagerAdapter
,它将从ViewPager中删除该项目(即使它当前正在查看).
假设this.dataset
包含5个项目,并且您希望将#2移动到ViewPager的末尾.要实现这一点,您必须将项目#2定位到数据源的末尾(通过Collection.Sort
或以其他方式).我只会告诉你简单的方法.
ArrayList<MyObject> list = new ArrayList<>();
MyFragmentPagerAdapter adapter = new MyFragmentPagerAdapter(list);
viewpager.setAdapter(adapter);
...
MyObject item = list.get(2);
list.remove(item);
list.add(item); // now it's positioned at the end of the list
adapter.notifyDataSetChanged(); // voilá, that should do the trick!
Run Code Online (Sandbox Code Playgroud)
adapter.notifyDataSetChanged()
最终调用viewpager.dataSetChanged()
,然后调用adapter.getItemPosition(..)
每个页面.该方法调用的结果确定页面(在这种情况下为片段)将显示的位置和位置.
归档时间: |
|
查看次数: |
8884 次 |
最近记录: |