繁体   English   中英

ViewPager:在用户滑动时刷新片段视图

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM