从 activity 更新 viewpager 片段中的列表视图
update a listview in a fragment in a viewpager from activity
我知道这是一个很常见的问题,我已经提到了许多不同的其他问题,但我仍然无法解决这个问题。
我的 activity 实现了一个带有两个选项卡的视图寻呼机,每个选项卡中都有一个列表视图。我有一个用于我的视图寻呼机的适配器,它 link 是两个片段,在每个片段中,一个适配器 link 数据到列表视图。
在我的 activity 菜单中,我有一个菜单,它在警报对话框中创建一个编辑文本,以便我将新字段输入到片段之一的列表视图之一中。
我的 activity(包含一个 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
{ ... }
正如我之前提到的,我可以从 activity 操作栏按钮向任一列表视图输入新条目。但是,列表视图没有得到更新,我无法引用列表视图适配器从 activity.
调用 notifydatasetchanged()
我可以从这里开始的最佳方式是什么?非常感谢!
我已经尝试使用接口、标签进行探索,但目前无法正常工作。
您应该做的是为 Fragment1 和 Fragment2 创建一个 public 方法,如下所示:
在你的 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();
}
}
从您的 activity 电话中:
if(frag1 != null){
frag1.updateFragment1ListView();
}
显然更改适配器的名称,如果它不叫适配器...
Fragment2.java也一样
我建议创建一个界面。这是一个例子:
public interface UpdateListFragmentInterface {
void updateList();
}
然后在 Activity 中,将委托添加为 属性:
UpdateListFragmentInterface yourDelegate;
无论您在 Activity 中的哪个位置创建片段,都将片段指定为委托:
// 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();
编辑:
抱歉,我认为您实际上需要在 activity 中创建一个 public 方法,类似于:
public void setUpdateListFragmentDelegate(UpdateListFragmentDelegate delegate) {
this.delegate = delegate
}
然后在 List Fragment 的 on attach 中将其分配到那里:
if (context instance of YourActivity) {
((YourActivity)context.setUpdateListFragmentDelegate(this);
}
我知道这是一个很常见的问题,我已经提到了许多不同的其他问题,但我仍然无法解决这个问题。
我的 activity 实现了一个带有两个选项卡的视图寻呼机,每个选项卡中都有一个列表视图。我有一个用于我的视图寻呼机的适配器,它 link 是两个片段,在每个片段中,一个适配器 link 数据到列表视图。
在我的 activity 菜单中,我有一个菜单,它在警报对话框中创建一个编辑文本,以便我将新字段输入到片段之一的列表视图之一中。
我的 activity(包含一个 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
{ ... }
正如我之前提到的,我可以从 activity 操作栏按钮向任一列表视图输入新条目。但是,列表视图没有得到更新,我无法引用列表视图适配器从 activity.
调用 notifydatasetchanged()我可以从这里开始的最佳方式是什么?非常感谢!
我已经尝试使用接口、标签进行探索,但目前无法正常工作。
您应该做的是为 Fragment1 和 Fragment2 创建一个 public 方法,如下所示:
在你的 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();
}
}
从您的 activity 电话中:
if(frag1 != null){
frag1.updateFragment1ListView();
}
显然更改适配器的名称,如果它不叫适配器...
Fragment2.java也一样
我建议创建一个界面。这是一个例子:
public interface UpdateListFragmentInterface {
void updateList();
}
然后在 Activity 中,将委托添加为 属性:
UpdateListFragmentInterface yourDelegate;
无论您在 Activity 中的哪个位置创建片段,都将片段指定为委托:
// 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();
编辑:
抱歉,我认为您实际上需要在 activity 中创建一个 public 方法,类似于:
public void setUpdateListFragmentDelegate(UpdateListFragmentDelegate delegate) {
this.delegate = delegate
}
然后在 List Fragment 的 on attach 中将其分配到那里:
if (context instance of YourActivity) {
((YourActivity)context.setUpdateListFragmentDelegate(this);
}