2016-10-02 3 views
1

MainActivity을 사용하고 viewPager을 사용하고 사용자가 스 와이프 제스처에서 두 번의 fragment보기를 인스턴스화합니다. 조각 중 하나가 서버에서 일부 데이터를 가져 와서보기를 업데이트합니다.ViewPager : 사용자 스 와이프에서 조각보기 새로 고침

문제 :

인터넷에 연결을 통해 응용 프로그램을 시작,하지만 응용 프로그램을 실행하고 조각이 업데이트되지 않습니다에 보내 주시면 동안 와이파이 전환에 따라 일부 더미 데이터와 fragment 업데이트 수신 된 데이터로 조각화합니다.

fragment보기를 인스턴스화 한 후 업데이트 할 수있는 방법을 제안하십시오. 다음

MainActivity.java

public class MainActivity extends AppCompatActivity { 

private SectionsPagerAdapter mSectionsPagerAdapter; 
private ViewPager mViewPager; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager()); 

    mViewPager = (ViewPager) findViewById(R.id.container); 
    mViewPager.setAdapter(mSectionsPagerAdapter); 
} 

public class SectionsPagerAdapter extends FragmentPagerAdapter { 

    public SectionsPagerAdapter(FragmentManager fm) { 
     super(fm); 
    } 

    @Override 
    public Fragment getItem(int position) { 
     switch (position) { 
      case 0: 
       return fragment1.newInstance(); 
      case 1: 
       return fragment3.newInstance(); 
      default: 
       return fragment1.newInstance(); 
     } 
    } 

    @Override 
    public int getCount() { 
     // Show 2 total pages. 
     return 2; 
    } 
} 

FragmentA 클래스 (코드의 Fragment3)이 주어진다

public class fragment3 extends Fragment implements YourFragmentInterface{ 

    public static ListView mylistView; 
    public static ConfessionsAdapter adapter; 
    public static ArrayList<Confession> confessionList; 

    public static Context context; 

    public static fragment3 newInstance() { 

     fragment3 fragment = new fragment3(); 

     new HttpGetReq().execute("http://example.com"); 

     return fragment; 
    } 

    public fragment3() { 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 

     context = getActivity(); // Getting context to tell async task about it, so it can SET stuff here. 

     if (container == null) { 
      return null; 
     } 
     View view = inflater.inflate(R.layout.list_fragment, container, false); 
     mylistView = (ListView) view.findViewById(android.R.id.list); 

     new HttpGetReq().execute("http://example.com"); 

     return view; 
    } 
} 

HttpGetReq 클래스가 서버로부터 데이터를 취득하는 AsyncTask이며, JSON을 파싱 fragmentA의 listdoInBackground() 방법으로 업데이트 한 다음, 어댑터를 fragmentA의 목록 ViewonPostExecute() 방법으로 설정합니다.

답변

1

먼저 인터넷 연결을 확인할 수있는 방법을 만드십시오. 나를 위해 나는 경우 Utils라는 클래스를 만들었습니다, 그 클래스에 인터넷이 이제 인터넷 연결 상태가 변경 될 때 당신을 통지하는 Broadcast Receiver을 만들

public class Utils { 

    public static boolean isNetworkAvailable(Context context) { 
     try { 
      ConnectivityManager cm = (ConnectivityManager) 
        context.getSystemService(context.CONNECTIVITY_SERVICE); 
      NetworkInfo networkInfo = cm.getActiveNetworkInfo(); 
      // if no network is available networkInfo will be null 
      // otherwise check if we are connected 
      if (networkInfo != null && networkInfo.isConnected()) { 
       return true; 
      } 
      return false; 
     } catch (Exception ex) { 
      return false; 
     } 
    } 

} 

사용할 수있는 경우, true를 돌려줍니다 방법이있다. 그 다음 가능한 인터넷에 변경되는 경우 그리고 그것은 수신기 등록, 여기에 방송 수신기에 대한 코드 지역 broadcast manager

에 의해

public class NetworkChangedReceiver extends BroadcastReceiver { 
    @Override 
    public void onReceive(Context context, Intent intent) { 

     if (Utils.isNetworkAvailable(context)) 
     { 
      //sending local broadcast 
      Intent i = new Intent("net_connected"); 
      i.putExtra("message", true); 
      LocalBroadcastManager.getInstance(context).sendBroadcast(i); 

     } 
    } 
} 

그리고 manifest에를 브로드 캐스트를 보낼 것입니다

<receiver android:name=".NetworkChangedReceiver"> 
      <intent-filter> 
       <action android:name="android.net.conn.CONNECTIVITY_CHANGE"/> 
      </intent-filter> 
    </receiver> 

그리고 그런 다음 귀하의 지역 방송 수신기에 활동 등록을 하시려면 onResume에서 등록을 하시고 에서 등록을 하시려면

@Override 
    public void onResume() { 
     super.onResume(); 

     LocalBroadcastManager.getInstance(this).registerReceiver(mMessageReceiver, 
       new IntentFilter("custom-event-name")); 
    } 

    @Override 
    public void onPause() { 
     super.onPause(); 
     LocalBroadcastManager.getInstance(this).unregisterReceiver(mMessageReceiver); 
    } 

와 조각에서 지역 방송 수신기의 기능을 쓰기

private BroadcastReceiver mMessageReceiver = new BroadcastReceiver() { 
      @Override 
      public void onReceive(Context context, Intent intent) { 
       boolean isConnectTed = intent.getBooleanExtra("net_connected",false); 
       if(isConnectTed){ 
       //if connected then notify to the 
       mSectionsPagerAdapter.notifyDataSetChanged(); 
       } 
      } 
     }; 
관련 문제