Skip to content
This repository has been archived by the owner on Aug 8, 2023. It is now read-only.

Commit

Permalink
[android] - add example of showing a MapView inside a ViewPager insid…
Browse files Browse the repository at this point in the history
…e RecyclerView
  • Loading branch information
tobrun committed Nov 14, 2018
1 parent bb5b558 commit 6ea511b
Show file tree
Hide file tree
Showing 7 changed files with 199 additions and 7 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -89,7 +89,7 @@ public class MapView extends FrameLayout implements NativeMapView.ViewCallback {
private MapKeyListener mapKeyListener;
@Nullable
private Bundle savedInstanceState;
private boolean isActivated;
private boolean isStarted;

@UiThread
public MapView(@NonNull Context context) {
Expand Down Expand Up @@ -346,10 +346,10 @@ public void onSaveInstanceState(@NonNull Bundle outState) {
*/
@UiThread
public void onStart() {
if (!isActivated) {
if (!isStarted) {
ConnectivityReceiver.instance(getContext()).activate();
FileSource.getInstance(getContext()).activate();
isActivated = true;
isStarted = true;
}
if (mapboxMap != null) {
mapboxMap.onStart();
Expand Down Expand Up @@ -395,10 +395,10 @@ public void onStop() {
mapRenderer.onStop();
}

if (isActivated) {
if (isStarted) {
ConnectivityReceiver.instance(getContext()).deactivate();
FileSource.getInstance(getContext()).deactivate();
isActivated = false;
isStarted = false;
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -872,7 +872,6 @@
android:name="android.support.PARENT_ACTIVITY"
android:value=".activity.FeatureOverviewActivity" />
</activity>

<activity
android:name=".activity.maplayout.RecyclerViewActivity"
android:description="@string/description_recyclerview"
Expand All @@ -884,6 +883,17 @@
android:name="android.support.PARENT_ACTIVITY"
android:value=".activity.FeatureOverviewActivity" />
</activity>
<activity
android:name=".activity.fragment.NestedViewPagerActivity"
android:description="@string/description_recyclerview"
android:label="@string/activity_nested_viewpager">
<meta-data
android:name="@string/category"
android:value="@string/category_fragment" />
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value=".activity.FeatureOverviewActivity" />
</activity>
<!-- For Instrumentation tests -->
<activity
android:name=".activity.style.RuntimeStyleTestActivity"
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,162 @@
package com.mapbox.mapboxsdk.testapp.activity.fragment

import android.annotation.SuppressLint
import android.os.Bundle
import android.support.v4.app.Fragment
import android.support.v4.app.FragmentManager
import android.support.v4.app.FragmentStatePagerAdapter
import android.support.v4.view.ViewPager
import android.support.v7.app.AppCompatActivity
import android.support.v7.widget.LinearLayoutManager
import android.support.v7.widget.RecyclerView
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.TextView
import com.mapbox.mapboxsdk.camera.CameraPosition
import com.mapbox.mapboxsdk.constants.Style
import com.mapbox.mapboxsdk.geometry.LatLng
import com.mapbox.mapboxsdk.maps.MapboxMapOptions
import com.mapbox.mapboxsdk.maps.SupportMapFragment
import com.mapbox.mapboxsdk.testapp.R
import kotlinx.android.synthetic.main.activity_recyclerview.*

/**
* TestActivity showcasing how to integrate a MapView in a RecyclerView.
* <p>
* It requires calling the correct lifecycle methods when detaching and attaching the View to
* the RecyclerView with onViewAttachedToWindow and onViewDetachedFromWindow.
* </p>
*/
@SuppressLint("ClickableViewAccessibility")
class NestedViewPagerActivity : AppCompatActivity() {

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_recyclerview)
recyclerView.layoutManager = LinearLayoutManager(this)
recyclerView.adapter = ItemAdapter(LayoutInflater.from(this), supportFragmentManager)
}

class ItemAdapter(private val inflater: LayoutInflater, private val fragmentManager: FragmentManager) : RecyclerView.Adapter<RecyclerView.ViewHolder>() {

private val items = listOf(
"one", "two", "three", ViewPagerItem(), "four", "five", "six", "seven", "eight", "nine", "ten",
"eleven", "twelve", "thirteen", "fourteen", "fifteen", "sixteen", "seventeen", "eighteen",
"nineteen", "twenty", "twenty-one"
)

private var mapHolder: ViewPagerHolder? = null

companion object {
const val TYPE_VIEWPAGER = 0
const val TYPE_TEXT = 1
}

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
return if (viewType == TYPE_VIEWPAGER) {
val viewPager = inflater.inflate(R.layout.item_viewpager, parent, false) as ViewPager
mapHolder = ViewPagerHolder(viewPager, fragmentManager)
return mapHolder as ViewPagerHolder
} else {
TextHolder(inflater.inflate(android.R.layout.simple_list_item_1, parent, false) as TextView)
}
}

override fun getItemCount(): Int {
return items.count()
}

override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
if (holder.itemViewType == TYPE_TEXT) {
val textHolder = holder as TextHolder
textHolder.bind(items[position] as String)
}
}

override fun getItemViewType(position: Int): Int {
return if (items[position] is ViewPagerItem) {
TYPE_VIEWPAGER
} else {
TYPE_TEXT
}
}

class TextHolder(val textView: TextView) : RecyclerView.ViewHolder(textView) {
fun bind(item: String) {
textView.text = item
}
}

class ViewPagerItem
class ViewPagerHolder(private val viewPager: ViewPager, fragmentManager: FragmentManager) : RecyclerView.ViewHolder(viewPager) {
init {
viewPager.adapter = MapPagerAdapter(fragmentManager)
viewPager.setOnTouchListener { view, motionEvent ->
// Disallow the touch request for recyclerView scroll
view.parent.requestDisallowInterceptTouchEvent(true)
viewPager.onTouchEvent(motionEvent)
false
}
}
}

class MapPagerAdapter(fm: FragmentManager?) : FragmentStatePagerAdapter(fm) {

override fun getItem(position: Int): Fragment {
val options = MapboxMapOptions()
options.textureMode(true)
options.doubleTapGesturesEnabled(false)
options.rotateGesturesEnabled(false)
options.tiltGesturesEnabled(false)
options.scrollGesturesEnabled(false)
options.zoomGesturesEnabled(false)
when (position) {
0 -> {
options.styleUrl(Style.MAPBOX_STREETS)
options.camera(CameraPosition.Builder().target(LatLng(34.920526, 102.634774)).zoom(3.0).build())
return SupportMapFragment.newInstance(options)
}
1 -> {
return EmptyFragment.newInstance()
}
2 -> {
options.styleUrl(Style.DARK)
options.camera(CameraPosition.Builder().target(LatLng(62.326440, 92.764913)).zoom(3.0).build())
return SupportMapFragment.newInstance(options)
}
3 -> {
return EmptyFragment.newInstance()
}
4 -> {
options.styleUrl(Style.SATELLITE)
options.camera(CameraPosition.Builder().target(LatLng(-25.007786, 133.623852)).zoom(3.0).build())
return SupportMapFragment.newInstance(options)
}
5 -> {
return EmptyFragment.newInstance()
}
}
throw IllegalAccessError()
}

override fun getCount(): Int {
return 6
}
}

class EmptyFragment : Fragment() {
companion object {
fun newInstance(): EmptyFragment {
return EmptyFragment()
}
}

override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View {
val textView = TextView(inflater.context)
textView.text = "This is an empty Fragment"
return textView
}
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
<?xml version="1.0" encoding="utf-8"?>
<com.mapbox.mapboxsdk.testapp.view.MapViewPager
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/viewpager"
android:layout_width="match_parent"
android:layout_height="256dp">

<android.support.v4.view.PagerTabStrip
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="top"
android:paddingBottom="4dp"
android:paddingTop="4dp"/>

</com.mapbox.mapboxsdk.testapp.view.MapViewPager>

Original file line number Diff line number Diff line change
Expand Up @@ -77,4 +77,5 @@
<string name="description_location_fragment">Uses LocationComponent in a Fragment</string>
<string name="description_location_manual">Force location updates and don\'t rely on the engine</string>
<string name="description_recyclerview">Show a MapView as a recyclerView item</string>
<string name="description_nested_viewpager">Show a MapView inside a viewpager inside a recyclerView</string>
</resources>
Original file line number Diff line number Diff line change
Expand Up @@ -77,4 +77,5 @@
<string name="activity_location_fragment">Location Fragment</string>
<string name="activity_location_manual">Manual Location updates</string>
<string name="activity_recyclerview">RecyclerView</string>
<string name="activity_nested_viewpager">Nested ViewPager</string>
</resources>
3 changes: 2 additions & 1 deletion platform/android/scripts/exclude-activity-gen.json
Original file line number Diff line number Diff line change
Expand Up @@ -38,5 +38,6 @@
"RenderTestActivity",
"SymbolLayerActivity",
"LocationFragmentActivity",
"MergeOfflineRegionsActivity"
"MergeOfflineRegionsActivity",
"NestedViewPagerActivity"
]

0 comments on commit 6ea511b

Please sign in to comment.