[英]ViewPager: Refresh fragment views on user swipe
我的MainActivity
使用viewPager
并在用户滑动手势上实例化两个fragment
视图。 其中一个片段从服务器获取一些数据并更新其视图。
问题:
在没有互联网连接的情况下启动应用程序, fragment
A 使用一些虚拟数据更新,但是在应用程序运行时切换 Wi-Fi 并滑动到该片段不会使用接收到的数据更新片段。
请建议如何在实例化后更新fragment
视图。
主活动.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 并在doInBackground()
方法中更新 fragmentA 的list
,然后在其onPostExecute()
方法onPostExecute()
适配器设置为 fragmentA 的列表View
。
首先创建一个方法来检查您的互联网连接。 对我来说,我创建了一个名为 Utils 的类,并且在该类中有一个方法将返回 true ,如果互联网可用
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;
}
}
}
现在创建一个Broadcast Receiver
,它会在互联网连接状态改变时通知您。 如果它更改为互联网可用,那么它将通过本地broadcast manager
发送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
注册并在onPause
取消注册
@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();
}
}
};
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.