2016-10-17 7 views
0

親アクティビティ:アンドロイド - Viewpager、特殊なアダプタのgetItem nullオブジェクト

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

} 

私がクリックしたときに、私はその後、私のフラグメント内のボタンを持っていますこのようなインターフェースを呼び出すボタンです。

public void onFriendListChanged() 

そして、このイベントは私のフラグメントでイベントを呼び出しますが、このswiperefreshは仮想メソッド」を呼び出すため

試みnullの場合:

onListChanged.EventListChanged(); 

は、その後のイベントは私の親アクティビティに呼び出されますvoid android.support.v4.widget.SwipeRefreshLayout.setRefreshing(boolean) 'NULLオブジェクトリファレンスの

私は4つのフラグメントのタブを持っていますが、フラグメントは同じ "MyFragment"ですが、リストは異なります。 viewpager(3)のリストが変更されたら、私はviewpager(1)に通知してリストを更新する必要があります。

答えて

0

onListChanged()が呼び出されたとき、またはgetItem()メソッドが実際のフラグメントをインスタンス化する必要がないように戻ってこなかったときに、フラグメントはアクティビティにまだ添付されません。

あなたの活動の上書きonAttachFragment()、そこからインターフェイスメソッドを呼び出します。

@Override 
public void onAttachFragment(Fragment fragment) { 
    super.onAttachFragment(fragment); 
    ((FriendsFragment) tabAdapter.instantiateItem(viewPager, viewPager.getCurrentItem())).OnEventEditedAction(5, 5); 
} 

代わりのviewPager.getCurrentItems()あなたは、インデックスを希望渡すことができます。

0

フラグメントライフサイクルでは、onAttach()の後にonViewCreated()が呼び出されます。そのため、_swipeRefreshLayoutをnullにする機会があります。

_swipeRefreshLayoutの初期化後にonListChangedを返します。

フラグメントライフサイクルを使用して、コードを次の順序で入力します。以下の順序に従ってください。それを同じライフサイクルメソッドコールに入れます。それ以外の場合はシーケンス順に並べます。

_swipeRefreshLayout = (SwipeRefreshLayout) view.findViewById(R.id.swipeRefresh); 
    _swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { 
     @Override 
     public void onRefresh() { 
     } 
    }); 
    try 
    { 
     onListChanged = (FriendsActivity) context; 
    } 
    catch (ClassCastException e) 
    { 
    } 
関連する問題