Lui*_*eri 52 android android-fragments android-viewpager
我有Activity一个ViewPager.我还有一个Dialog将检索列表,其中包含用户将选择的一些项目.现在,如何更新Fragment项目应显示的位置作为附加到此片段的新视图?
这是我ViewPager的适配器:
public static class MyAdapter extends FragmentPagerAdapter {
public MyAdapter(FragmentManager fm) {
super(fm);
}
@Override
public int getCount() {
return 1;
}
@Override
public android.support.v4.app.Fragment getItem(int position) {
switch (position) {
case 0:
return new Fragment1();
default:
return null;
}
}
}
Run Code Online (Sandbox Code Playgroud)
现在,这是Fragment:
public class Fragment1 extends Fragment{
@Override
public void onActivityCreated(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onActivityCreated(savedInstanceState);
}
@Override
public void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
}
@Override
public ViewGroup onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// TODO Auto-generated method stub
ViewGroup view = (ViewGroup)inflater.inflate(R.layout.screen1, container, false);
}
return view;
}
}
Run Code Online (Sandbox Code Playgroud)
这是我想用来向我添加项目的方法 Fragment
private void addItem() {
// Instantiate a new "row" view.
final ViewGroup[] newViews = new ViewGroup[selectedItems.length];
for(int i = 0; i < selectedItems.length; i++){
newViews[i] = (ViewGroup) LayoutInflater.from(this).inflate(
R.layout.animated_layout_item, mContainerView, false);
// Set the text in each new row.
((TextView) newViews[i].findViewById(android.R.id.text1)).setText(selectedItems[i]);
// Because mContainerView has android:animateLayoutChanges set to true,
// adding this view is automatically animated.
mContainerView.addView(newViews[i], 0);
// Set a click listener for the "X" button in the row that will remove the row.
OnClickListener listener = new MyAddItemListener(newViews[i], mContainerView, this);
newViews[i].findViewById(R.id.delete_button).setOnClickListener(listener);
}
}
Run Code Online (Sandbox Code Playgroud)
Sim*_*iak 124
从ViewPager更新片段
你需要实现getItemPosition(Object obj)方法.
调用时会调用此方法
notifyDataSetChanged()
Run Code Online (Sandbox Code Playgroud)
在你的ViewPagerAdaper.隐含地,这个方法返回的POSITION_UNCHANGED值意味着类似这样的东西:
"片段应该是它应该在哪里,所以不要改变任何东西."
因此,如果您需要更新Fragment,您可以执行以下操作:
POSITION_NONE从getItemPosition()方法返回.它意味着:"片段必须始终重新创建"第二种方法的例子:
public interface Updateable {
public void update();
}
public class MyFragment extends Fragment implements Updateable {
...
public void update() {
// do your stuff
}
}
Run Code Online (Sandbox Code Playgroud)
在FragmentPagerAdapter中你会做这样的事情:
@Override
public int getItemPosition(Object object) {
MyFragment f = (MyFragment ) object;
if (f != null) {
f.update();
}
return super.getItemPosition(object);
}
Run Code Online (Sandbox Code Playgroud)
如果您选择第一种方法,它可能看起来像:
@Override
public int getItemPosition(Object object) {
return POSITION_NONE;
}
Run Code Online (Sandbox Code Playgroud)
注意:值得考虑一下你会选择哪种方法.
Yog*_*dra 28
我有时会遇到问题所以在这种情况下总是避免使用FragmentPagerAdapter并使用FragmentStatePagerAdapter.
它对我有用.我希望它也适合你.
mad*_*527 12
在PagerAdapter中覆盖getItemPosition
@Override
public int getItemPosition(Object object) {
// POSITION_NONE makes it possible to reload the PagerAdapter
return POSITION_NONE;
}
Run Code Online (Sandbox Code Playgroud)
之后添加viewPager.getAdapter().notifyDataSetChanged(); 这段代码如下
viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
}
@Override
public void onPageSelected(int position) {
viewPager.getAdapter().notifyDataSetChanged();
}
@Override
public void onPageScrollStateChanged(int state) {
}
});
Run Code Online (Sandbox Code Playgroud)
应该管用.
您可以通过两种不同的方式更新片段,
第一种方式
像@Sajmon
你需要实现getItemPosition(Object obj)方法。
调用时会调用此方法
notifyDataSetChanged()
Run Code Online (Sandbox Code Playgroud)
您可以在Github 中找到一个示例,并在这篇文章中找到更多信息。
第二种方式
我在 viewpager 中更新片段的setTag()方法是将该方法用于方法中的任何实例化视图instantiateItem()。因此,当您想要更改数据或使您需要的视图无效时,您可以调用findViewWithTag()ViewPager 上的方法来检索先前实例化的视图并根据需要修改/使用它,而无需每次删除/创建新视图想要更新一些值。
@Override
public Object instantiateItem(ViewGroup container, int position) {
Object object = super.instantiateItem(container, position);
if (object instanceof Fragment) {
Fragment fragment = (Fragment) object;
String tag = fragment.getTag();
mFragmentTags.put(position, tag);
}
return object;
}
public Fragment getFragment(int position) {
Fragment fragment = null;
String tag = mFragmentTags.get(position);
if (tag != null) {
fragment = mFragmentManager.findFragmentByTag(tag);
}
return fragment;
}
Run Code Online (Sandbox Code Playgroud)
你可以在Github 中找到一个例子,或者在这篇文章中找到更多信息:
| 归档时间: |
|
| 查看次数: |
89970 次 |
| 最近记录: |