[android] - add example of showing a MapView inside a ViewPager inside RecyclerView

This commit is contained in:
Tobrun
2018-10-19 12:21:58 +02:00
committed by Tobrun
parent bb5b558f21
commit 6ea511b65b
7 changed files with 199 additions and 7 deletions

View File

@@ -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;
}
}

View File

@@ -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"

View File

@@ -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
}
}
}
}

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -38,5 +38,6 @@
"RenderTestActivity",
"SymbolLayerActivity",
"LocationFragmentActivity",
"MergeOfflineRegionsActivity"
"MergeOfflineRegionsActivity",
"NestedViewPagerActivity"
]