家长活动:
public class FriendsActivity extends AppCompatActivity implements OnListChanged {
ViewPager viewPager = (ViewPager) findViewById(R.id.viewpager);
viewPager.setOffscreenPageLimit(4);
viewPager.setAdapter(myCustomTabAdapter);
TabLayout tabLayout = (TabLayout) findViewById(R.id.tablayout);
tabLayout.setupWithViewPager(viewPager);
@Override
public void onListChanged()
{
MyFragment fragment = (FriendsFragment) tabAdapter.getItem(flag-1);
fragment.OnEventEditedAction(5, 5); // called
}
}
MyCustomTabAdapter:
@Override
public Fragment getItem(int position)
{
return MyFragment.NewInstance(position + 1);
}
MyFragment:
public class MyFragment extends Fragment implements OnEventEdited{
private OnListChanged onListChanged;
private SwipeRefreshLayout _swipeRefreshLayout;
@Override
public void OnEventEditedAction(int flag, int action)
{
**_swipeRefreshLayout.setRefreshing(true);** // null here
}
@Override
public void onAttach(Context context) {
super.onAttach(context);
try
{
onListChanged = (FriendsActivity) context;
}
catch (ClassCastException e)
{
}
}
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
// Setting swipeRefresh
_swipeRefreshLayout = (SwipeRefreshLayout) view.findViewById(R.id.swipeRefresh);
_swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
@Override
public void onRefresh() {
}
});
}
我的片段中有一个按钮然后当我点击按钮时,我就像这样调用界面。
onListChanged.EventListChanged();
然后在My parent Activity中调用该事件:
public void onFriendListChanged()
此事件在我的片段中调用该事件,但此swiperefresh为空
尝试调用虚方法'void android.support.v4.widget.SwipeRefreshLayout.setRefreshing(布尔值)” 在空对象引用上
我有一个包含4个片段的标签,片段与“MyFragment”相同,但列表不同。当viewpager(3)中的列表发生变化时,我需要通知viewpager(1)并更新列表。
答案 0 :(得分:0)
有两个可能的问题,当调用onListChanged()
或getItem()
方法没有返回实际片段时,我没有附加到活动的片段,因此您需要实例化它。
在您的活动中覆盖onAttachFragment()
并从那里调用接口方法:
@Override
public void onAttachFragment(Fragment fragment) {
super.onAttachFragment(fragment);
((FriendsFragment) tabAdapter.instantiateItem(viewPager, viewPager.getCurrentItem())).OnEventEditedAction(5, 5);
}
而不是viewPager.getCurrentItems()
,您可以传递所需的索引。
答案 1 :(得分:0)
在Fragment生命周期中onViewCreated()将在onAttach()之后调用。所以_swipeRefreshLayout有机会为null。
在_swipeRefreshLayout初始化后返回onListChanged。
使用Fragment Lifecycle按照以下顺序放置代码。应遵循以下顺序。将它放在相同的生命周期方法调用中,否则按顺序排列。
_swipeRefreshLayout = (SwipeRefreshLayout) view.findViewById(R.id.swipeRefresh);
_swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
@Override
public void onRefresh() {
}
});
try
{
onListChanged = (FriendsActivity) context;
}
catch (ClassCastException e)
{
}