从活动中更新ViewPager中片段中的ListView

3
我知道这是一个常见的问题,我已经参考了许多其他问题,但我仍然无法让它工作。
我的活动实现了一个带有两个选项卡的视图页面,在每个选项卡中都有一个列表视图。我为我的视图页面创建了一个适配器,将两个片段链接起来,并在每个片段中使用适配器将数据链接到列表视图。
在我的活动菜单中,我有一个菜单,可以为我创建一个alertdialog中的edittext,以便将新字段输入到一个片段中的一个列表视图中。
我的活动(包含一个viewpager)。
protected void onCreate(Bundle savedInstanceState)
{
    ...
    subAdapter = new SubAdapter(getSupportFragmentManager(), data);
    ((ViewPager) findViewById(R.id.viewPager)).setAdapter(subGroupAdapter);
}

我的ViewPager适配器。
public class SubAdapter extends FragmentPagerAdapter
{
    public SubGroupAdapter(FragmentManager fm, data data)
    {
        super(fm);
    }

@Override
public Fragment getItem(int position)
{
    Bundle bundle = new Bundle();
    bundle.putString("data", data);

    switch (position)
    {
        case 0:
            Fragment1 frag1 = new Fragment1();
            frag1.setArguments(bundle);
            return frag1;

        case 1:
            Fragment2 frag2 = new Fragment2();
            frag2.setArguments(bundle);
            return frag2;
    }

    return null;
}//some other methods below

Fragment1 / Fragment2(两个片段都有一个列表视图)

public void onActivityCreated(Bundle savedInstanceState)
{
    super.onActivityCreated(savedInstanceState);

    frag1Adapter = new frag1Adapter(this, data);
    ((ListView) getView().findViewById(R.id.listView)).setAdapter(frag1Adapter);
}

为两个片段中的两个列表视图编写自定义的列表视图适配器

public class ExpenseAdapter extends BaseAdapter implements OnClickListener
{ ... }

正如我之前提到的,我可以从活动操作栏按钮向任何一个列表视图中输入新条目。但是,列表视图不会得到更新,并且我无法引用列表视图适配器从活动中调用notifydatasetchanged()方法。

从这里开始,我应该采取哪种最好的方式?非常感谢!

我尝试过使用接口、标签等方式,但目前无法使其工作。


请查看下面的更新,它应该解决您的问题。 - kandroidj
2个回答

1
你应该为Fragment1和Fragment2创建一个公共方法,如下所示:
在你的Activity中定义: Fragment1 frag1; Fragment2 frag2; 然后是你的ViewPager:
public class SubAdapter extends FragmentPagerAdapter
 {
    public SubGroupAdapter(FragmentManager fm, data data)
   {
      super(fm);
   }

 @Override
 public Fragment getItem(int position)
 {
    Bundle bundle = new Bundle();
    bundle.putString("data", data);

    switch (position)
    {
       case 0:
           frag1 = new Fragment1();
           frag1.setArguments(bundle);
           return frag1;

       case 1:
           frag2 = new Fragment2();
           frag2.setArguments(bundle);
           return frag2;
       }

     return null;
     }
}

把这个方法放在Fragment1.java文件中:

public void updateFragment1ListView(){
   if(adapter != null){
       adapter.notifyDataSetChanged();
   }
}

并从您的活动中调用:

  if(frag1 != null){
     frag1.updateFragment1ListView();
  }

如果您的适配器名称不叫做adapter,显然需要更改名称...

Fragment2.java也要做同样的操作。


我的片段是在ViewPager适配器中创建的。我如何进一步将调用从ViewPager适配器扩展到活动? - BOOnZ
将你的Fragment1命名为frag1,Fragment2命名为frag2,并将它们作为成员变量实例化在ViewPager中。 - kandroidj
我之前尝试过这种方法,结果发现我没有得到正确的片段引用,因此无法从活动中调用该方法。谢谢你的帮助! - BOOnZ
无论如何,我也通过方法传递了在主活动中插入的新数据,然后重新创建适配器并将其再次设置为listview。 notifyDataSetChanged() 方法可以省略。希望这有所帮助! - BOOnZ
@user776914 是的,那是个好主意。我只是不知道你需要传递什么数据,所以我尽可能地让这个方法简单化了,因为我并不是很了解。 - kandroidj

0
我建议创建一个接口。这是一个例子:
public interface UpdateListFragmentInterface {

    void updateList();
}

然后在Activity中将delegate添加为属性:

UpdateListFragmentInterface yourDelegate;


无论您在 Activity 中创建 Fragment 的位置,都将 Fragment 分配为委托:
// Set up and create your fragment.

(if yourFragment instanceof UpdateListFragmentInterface) {

    yourDelegate = yourFragment;
}

然后在Fragment中实现接口:

public class YourListFragment extends android.support.v4.app.ListFragment implements UpdateListFragmentInterface {

    // Constructors and other methods for the ListFragment up here.

    // Override the interface method
    public void updateList() {

        //Update the list here.
    }
}

最后,在您的Activity中,当您需要更新列表时,只需调用委托:

yourDelegate.updateList();

编辑:

抱歉,我认为您实际上需要在您的活动中创建一个公共方法,例如:

public void setUpdateListFragmentDelegate(UpdateListFragmentDelegate delegate) {

    this.delegate = delegate
}

然后在列表片段的onAttach方法中,您将在那里分配它:

if (context instance of YourActivity) {

    ((YourActivity)context.setUpdateListFragmentDelegate(this);
}

一个BroadcastIntent和BroadcastReceiver也可以解决问题: https://developer.android.com/reference/android/content/BroadcastReceiverhttps://www.youtube.com/watch?v=X69q01TY1ic - TJ Olsen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接