我有一个活动
与 ViewPager
。我也有一个对话框
,将检索与该用户会选择一些项目的列表。现在,我怎么可以更新片段
,其中的项目都应该显示连接到该片段为新的看法?
下面是我的 ViewPager
的适配器:
公共静态类MyAdapter扩展FragmentPagerAdapter {
公共MyAdapter(FragmentManager FM){
超(FM);
}
@覆盖
公众诠释getCount将(){
返回1;
}
@覆盖
公共android.support.v4.app.Fragment的getItem(INT位置){
开关(位置){
情况下0:
返回新片段1();
默认:
返回null;
}
}
}
现在,这里是片段
:
公共类片段1扩展片段{
@覆盖
公共无效onActivityCreated(包savedInstanceState){
// TODO自动生成方法存根
super.onActivityCreated(savedInstanceState);
}
@覆盖
公共无效的onCreate(包savedInstanceState){
// TODO自动生成方法存根
super.onCreate(savedInstanceState);
}
@覆盖
公众的ViewGroup onCreateView(LayoutInflater充气,容器的ViewGroup,
捆绑savedInstanceState){
// TODO自动生成方法存根
ViewGroup中查看=(ViewGroup中)inflater.inflate(R.layout.screen1,集装箱,假);
}
返回查看;
}
}
这是我想用来项添加到我的方法片段
私人无效的addItem(){
//实例化一个新的行的看法。
最后的ViewGroup [] newViews =新的ViewGroup [selectedItems.length]
的for(int i = 0; I< selectedItems.length;我++){
newViews [I] =(ViewGroup中)LayoutInflater.from(本).inflate(
R.layout.animated_layout_item,mContainerView,假);
//设置在每个新行的文本。
((TextView中)newViews [I] .findViewById(android.R.id.text1))的setText(selectedItems [I]);
//因为mContainerView有安卓animateLayoutChanges设置为true,
//添加此视图自动动画。
mContainerView.addView(newViews [I],0);
//该行,将删除该行中的X按钮,设定一个点击监听器。
OnClickListener听者=新MyAddItemListener(newViews [I],mContainerView,本);
newViews [I] .findViewById(R.id.delete_button).setOnClickListener(听众);
}
}
解决方案
从ViewPager更新片段
您需要执行 getItemPosition(obj对象)
方法。
在调用此方法称为
notifyDataSetChanged()
在 ViewPagerAdaper
。隐此方法返回 POSITION_UNCHANGED
值,这意味着这样的事情:
片段就是应该这样改变什么。的
所以,如果你需要更新的片段你可以做到这一点:
总是返回 POSITION_NONE
从 getItemPosition()
方法。这其中
意思是:片段必须始终重新创建的
您可以创建一些update()方法,将更新
片段(片段将处理自我更新)
的第二个办法示例:
公共接口可更新{
公共无效更新();
}
公共类MyFragment扩展片段实现可更新{
...
公共无效更新(){
//做你的东西
}
}
而在FragmentPagerAdapter你会做这样的事情:
@覆盖
公众诠释getItemPosition(Object对象){
MyFragment F =(MyFragment)对象;
如果(F!= NULL){
f.update();
}
返回super.getItemPosition(对象);
}
如果你选择第一种方法它可以是这样的:
@覆盖
公众诠释getItemPosition(Object对象){
返回POSITION_NONE;
}
注意:这是值得我们去思考关于哪种方法,你会拿起
I have an Activity
with a ViewPager
. I also have a Dialog
that will retrieve a list with some items that the user will choose. Now, how can I update the Fragment
where the Items are supposed to display as new views attached to this Fragment?
Here is my ViewPager
's adapter:
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;
}
}
}
Now, here is the 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;
}
}
This is the method that I want to use to add Items to my 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);
}
}
解决方案
Update Fragment from ViewPager
You need to implement getItemPosition(Object obj)
method.
This method is called when you call
notifyDataSetChanged()
on your ViewPagerAdaper
. Implicitly this method returns POSITION_UNCHANGED
value that means something like this:
"Fragment is where it should be so change anything."
So if you need to update Fragment you can do it with:
Always returnPOSITION_NONE
from getItemPosition()
method. It which
means: "Fragment must be always recreated"
You can create some update() method that will update your
Fragment(fragment will handle updates itself)
Example of second approach:
public interface Updateable {
public void update();
}
public class MyFragment extends Fragment implements Updateable {
...
public void update() {
// do your stuff
}
}
And in FragmentPagerAdapter you'll do something like this:
@Override
public int getItemPosition(Object object) {
MyFragment f = (MyFragment ) object;
if (f != null) {
f.update();
}
return super.getItemPosition(object);
}
And if you'll choose first approach it can looks like:
@Override
public int getItemPosition(Object object) {
return POSITION_NONE;
}
Note: It's worth to think a about which approach you'll pick up.