[android] - add example of showing a MapView inside a ViewPager inside RecyclerView
This commit is contained in:
@@ -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) {
|
||||
@@ -346,10 +346,10 @@ public class MapView extends FrameLayout implements NativeMapView.ViewCallback {
|
||||
*/
|
||||
@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();
|
||||
@@ -395,10 +395,10 @@ public class MapView extends FrameLayout implements NativeMapView.ViewCallback {
|
||||
mapRenderer.onStop();
|
||||
}
|
||||
|
||||
if (isActivated) {
|
||||
if (isStarted) {
|
||||
ConnectivityReceiver.instance(getContext()).deactivate();
|
||||
FileSource.getInstance(getContext()).deactivate();
|
||||
isActivated = false;
|
||||
isStarted = false;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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"
|
||||
@@ -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"
|
||||
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
@@ -38,5 +38,6 @@
|
||||
"RenderTestActivity",
|
||||
"SymbolLayerActivity",
|
||||
"LocationFragmentActivity",
|
||||
"MergeOfflineRegionsActivity"
|
||||
"MergeOfflineRegionsActivity",
|
||||
"NestedViewPagerActivity"
|
||||
]
|
||||
|
||||
Reference in New Issue
Block a user