从活动更新视图页面中片段中的列表视图

Posted

技术标签:

【中文标题】从活动更新视图页面中片段中的列表视图【英文标题】:update a listview in a fragment in a viewpager from activity 【发布时间】:2015-05-20 09:02:46 【问题描述】:

我知道这是一个很常见的问题,并且我已经提到了许多不同的其他问题,但我仍然无法解决这个问题。

我的活动实现了一个带有两个选项卡的视图寻呼机,每个选项卡中都有一个列表视图。我的视图寻呼机有一个适配器,它链接两个片段,在每个片段中,一个适配器将数据链接到列表视图。

在我的活动菜单中,我有一个菜单,它在警报对话框中创建一个编辑文本,以便我将新字段输入到片段之一的列表视图之一中。

我的活动(包含浏览器)

protected void onCreate(Bundle savedInstanceState)

    ...
    subAdapter = new SubAdapter(getSupportFragmentManager(), data);
    ((ViewPager) findViewById(R.id.viewPager)).setAdapter(subGroupAdapter);

我的浏览器适配器

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()。

我可以从这里开始的最佳方式是什么?非常感谢!

我尝试过使用接口、标签进行探索,但目前无法使用。

【问题讨论】:

查看下面的更新,应该可以解决您的问题 【参考方案1】:

您应该为 Fragment1 和 Fragment2 创建一个公共方法,如下所示:

在您的活动中定义:

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();
  

如果您的适配器不称为适配器,则显然更改其名称...

对 Fragment2.java 也一样

【讨论】:

我的片段是在 viewpager 适配器中创建的。如何进一步从 viewpager 适配器“扩展调用”到活动? 使您的 Fragment1 frag1 和 Fragment2 frag2 成员变量在 ViewPager 中被实例化 我之前尝试过这个方法,结果我没有得到正确的片段引用,因此无法从活动中调用该方法。感谢您的帮助! 无论如何,我也已经通过方法传入了插入到主Activity中的新数据,然后还重新创建了适配器并再次将其设置为listview。 notifyDataSetChanged() 方法可以省略。希望这会有所帮助! @user776914 是的,这是个好主意,我只是不知道你需要传递什么数据,所以我使方法尽可能简单而不知道很多。【参考方案2】:

我建议创建一个界面。这是一个例子:

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

然后在 List Fragment 的 on attach 中,您将把它分配到那里:

if (context instance of YourActivity) 

    ((YourActivity)context.setUpdateListFragmentDelegate(this);

【讨论】:

BroadcastIntent 和 BroadcastReceiver 也可以解决问题:developer.android.com/reference/android/content/…youtube.com/watch?v=X69q01TY1ic

以上是关于从活动更新视图页面中片段中的列表视图的主要内容,如果未能解决你的问题,请参考以下文章

活动到片段通信:当我尝试从活动更新片段中的文本视图时,出现空指针异常

如何将可扩展列表视图的选定子视图数据从片段发送到父活动?

用另一个列表替换主活动中的列表并从视图中删除旧列表

从RecyclerView适配器更新活动或片段的视图

从广播接收器更新片段中的列表视图

将数据从片段列表视图项传递到活动字符串变量 onitemclicklistener