Обновление фрагмента Android внутри события

Я делаю приложение для локализации в помещении, которое основано на маяках. В моем приложении я загрузил 3 вкладки в ViewPager. Вторая вкладка представляет собой фрагмент карты, который должен отображать карту местоположения, в котором находится пользователь, на основе сигнала маяка.

public class Shop extends AppCompatActivity implements IndoorsLocationListener, ProximityManager.ProximityListener {

    private static final String TAG = Shop.class.getSimpleName();
    private IndoorsSurfaceFragment indoorsFragment;
    private ProximityManagerContract proximityManager;
    private ScanContext scanContext;
    TabPagerAdapter adapter;
    ViewPager viewPager;


    // TODO : Add more event types like devices updated
    private List<EventType> eventTypes = new ArrayList<EventType>() {{
//        add(EventType.DEVICES_UPDATE);
        add(EventType.DEVICE_DISCOVERED);
    }};

    private IBeaconScanContext beaconScanContext = new IBeaconScanContext.Builder()
            .setEventTypes(eventTypes) //only specified events we be called on callback
            .setRssiCalculator(RssiCalculators.newLimitedMeanRssiCalculator(5))
            .build();

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

        proximityManager = new KontaktProximityManager(this);

        setContentView(R.layout.activity_shop);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
        setTitle("Shopping");

        DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
        ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
                this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
        drawer.setDrawerListener(toggle);
        toggle.syncState();


        viewPager = (ViewPager) findViewById(R.id.tab_content);

        MapTabContentFragment mtcf = new MapTabContentFragment();
        adapter = new TabPagerAdapter(getSupportFragmentManager());

        IndoorsFactory.Builder indoorsBuilder = new IndoorsFactory.Builder();
        IndoorsSurfaceFactory.Builder surfaceBuilder = new IndoorsSurfaceFactory.Builder();
        indoorsBuilder.setContext(this);

        // Set the API Key for Indoo.rs
        indoorsBuilder.setApiKey(getResources().getString(R.string.indoors_api_key));

        // Set the building's ID
        indoorsBuilder.setBuildingId((long)762751544);
        // Log.d(TAG+ " Building ID: ", Long.toString(pBuildingID));

        // callback for indoo.rs-events
        indoorsBuilder.setUserInteractionListener(this);
        surfaceBuilder.setIndoorsBuilder(indoorsBuilder);
        indoorsFragment = surfaceBuilder.build();

        adapter.addFragment(new ListTabContentFragment(), "LIST");
        adapter.addFragment(indoorsFragment, "MAP");
        adapter.addFragment(new ARTabContentFragment(), "AR");

        viewPager.setAdapter(adapter);
  }
}

Этот сегмент кода загружает сразу все вкладки при создании действия. Теперь мне нужен 2-й фрагмент (mtcf, "MAP") для загрузки только при получении сигнала маяка.

@Override
public void onEvent(BluetoothDeviceEvent bluetoothDeviceEvent) {
    List<? extends RemoteBluetoothDevice> deviceList = bluetoothDeviceEvent.getDeviceList();
    long timestamp = bluetoothDeviceEvent.getTimestamp();
    DeviceProfile deviceProfile = bluetoothDeviceEvent.getDeviceProfile();
    switch (bluetoothDeviceEvent.getEventType()) {
        case SPACE_ENTERED:
            Log.d(TAG, "namespace or region entered");
            break;
        case DEVICE_DISCOVERED:
            Log.d(TAG, "found new beacon");
            Log.d(TAG, ((Integer.toString(deviceList.size()))));

            String nameOfBeacon = deviceList.get(0).getName();

            if(nameOfBeacon.equals("Entrance")) {
                long buildingMapID = lookupBuilding(deviceList.get(0).getName());
                IndoorsSurfaceFragment indoorsSurfaceFragment = createIndoorFragment(buildingMapID);

                getSupportFragmentManager().beginTransaction().replace(R.id.indoorslayout,indoorsSurfaceFragment).commit();
            }
            break;

MapFragment.xml

<android.support.v4.widget.NestedScrollView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="fill_vertical"
app:layout_behavior="@string/appbar_scrolling_view_behavior">

<FrameLayout
    android:id="@+id/indoorslayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"></FrameLayout>

</android.support.v4.widget.NestedScrollView>`

Как я могу реализовать это?? Мне нужен фрагмент карты для загрузки только после получения события маяка Bluetooth.

Благодарю.

2 ответа

Решение

Вы должны справиться с этим вашим TabPagerAdapter:

1, в TabPagerAdapter добавьте параметр, например: List<Fragment> mItemsСначала вы добавляете два фрагмента в элементы.

переопределение TabPagerAdapterФункция getItem выглядит так:

 public Fragment getItem(int position){
     return mItems.get(position);
}

2, когда вы хотите показать MapFragment, просто TabPagerAdapter Функция addItem, затем элементы имеют три фрагмента. Вы можете вручную сортировать фрагменты.

Когда вы используете addItemне забудьте позвонить notifyDataSetChanged(), Надеюсь помочь вам!

Вам нужно вызвать notifyDataSetChanged внутри "OnEvent" и реализовать getItemPosition(Object map) в Viewpager.

Это будет обновлять страницу карты каждый раз, когда вы вызываете notifyDatasetChanged Обновить фрагмент из ViewPager

Другие вопросы по тегам