Android - Viewpager,Adpater getItem null对象

时间:2016-10-17 19:20:58

标签: android android-fragments

家长活动:

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)并更新列表。

2 个答案:

答案 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)
    {
    }