4

Как я могу добраться до GoogleMap от RecyclerView.ViewHolderAndroid Google отображает фрагмент в RecyclerView.ViewHolder

У меня есть:

public class MapRowHolder extends RecyclerView.ViewHolder 
{ 
public MapRowHolder(View view) { 
     super(view); 
} 
} 

XML:

<android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:android.support.v7.cardview="http://schemas.android.com/apk/res-auto" 
android:orientation="vertical" 
android:layout_width="fill_parent" 
android:layout_height="wrap_content" 
android.support.v7.cardview:cardBackgroundColor="@color/blue" 
android.support.v7.cardview:cardCornerRadius="@dimen/card_corner" 
android.support.v7.cardview:cardElevation="@dimen/card_elevation"> 

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_height="wrap_content" 
    android:orientation="horizontal" 
    android:layout_gravity="right|center_vertical" 
    android:gravity="center_vertical|right" 
    android:layout_width="fill_parent"> 


    <fragment xmlns:android="http://schemas.android.com/apk/res/android" 
     xmlns:tools="http://schemas.android.com/tools" 
     android:layout_width="match_parent" 
     android:layout_height="250dp" 
     android:tag="maps" 

     android:id="@+id/map_view_fragment" tools:context=".Map" 
     android:name="com.google.android.gms.maps.SupportMapFragment" 
     android:layout_centerInParent="true"/> 

</LinearLayout> 

адаптер:

public class MapAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> 
{ 


public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) { 
     RecyclerView.ViewHolder mh; 


     View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.map_row, viewGroup, false); 
     mh = (RecyclerView.ViewHolder)new PodatkiZaMapRowHolder(v); 

     return mh; 
    } 

public void onBindViewHolder(RecyclerView.ViewHolder RowHolder, int polozaj) { 

     MapRowHolder mapRowHolder = (MapRowHolder)RowHolder; 


    } 


} 

Он отображает карту правильно. И он масштабируется на всю землю. И позиционируется до 0,0 в центре.

Как я могу получить фрагмент карты (в ViewHolder)? Я хотел бы переместить камеру в другое место (я могу сделать это после получения объекта GoogleMap). Как и где я должен получить объект GoogleMap?

Если я использую MapView вместо фрагмента карты, он работает, но не обновляет карту. Карта обновляется после того, как я несколько раз нажимаю на карту. С уважением, Ales

+0

Из XML закодированы вы писали, вы используете cardview, так что ваши MapFragment не внутри переработку. И что вы подразумеваете под не обновлением? Вы можете проверить документацию recyclerview здесь: https://developer.android.com/training/material/lists-cards.html – ztan

+0

Проблема в том, как получить фрагмент карты. Если у меня есть TextView в xml (xml for row), я могу получить его в RecyclerView.ViewHolder как findViewById (R.id.my_text); и тогда я могу установить значение как RowHolder.myText.setText («test»); Как я могу сделать это с помощью фрагмента карты? –

+1

Не обновляясь, я имею в виду, что он в каком-то режиме паузы. Он показывает размытую карту, затем, когда я нажимаю, он обновляет карту до лучшего изображения, после другого щелчка она обновляет некоторые метки, и если я нажимаю больше раз, она обновляется по-другому. –

ответ

4

В итоге я должен динамически добавлять SupportMapFragment в FrameLayout внутри макета элемента. Вам просто нужно создать дополнительный FrameLayout с уникальным идентификатором.

XML:

<?xml version="1.0" encoding="utf-8"?> 

<LinearLayout 
    android:orientation="vertical" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:padding="10dp"> 

    <TextView 
     android:id="@+id/car_name" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:text="Peugeot 407 2.0 HDI" 
     android:textSize="20dp" 
     android:gravity="center_horizontal" 
     android:textColor="?attr/colorPrimary" 
     android:textStyle="bold" 
     android:layout_marginBottom="5dp" 
     /> 

    <include layout="@layout/ride_item_summary" /> 

    <FrameLayout 
     android:id="@+id/map_layout" 
     android:layout_marginTop="10dp" 
     android:layout_width="match_parent" 
     android:layout_height="170dp" 
     android:layout_marginBottom="10dp" 
     /> 
</LinearLayout> 

адаптер:

public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { 
    super.onBindViewHolder(holder, position); 
    switch (getItemViewType(position)) { 
      case 1: 
      if (first) { 
       ... //check if polyline is not null, init other views 

        FrameLayout view = (FrameLayout) ((RideItemHolder) holder).mMapLayout; 
        FrameLayout frame = new FrameLayout(mContext); 
        frame.setId(1010101); //you have to set unique id 

        int height = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 170, mContext.getResources().getDisplayMetrics()); 
        FrameLayout.LayoutParams layoutParams = new FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT, height); 
        frame.setLayoutParams(layoutParams); 

        view.addView(frame); 

        GoogleMapOptions options = new GoogleMapOptions(); 
        options.liteMode(true); 
        SupportMapFragment mapFrag = SupportMapFragment.newInstance(options); 

        //Create the the class that implements OnMapReadyCallback and set up your map 
        mapFrag.getMapAsync(new MapReadyCallback()); 

        FragmentManager fm = fragment.getChildFragmentManager(); 
        fm.beginTransaction().add(frame.getId(), mapFrag).commit(); 

        first = false; 
       } 
      } 
      break; 
     case 2: 
      ... 

private class MapReadyCallback implements OnMapReadyCallback { 
    @Override 
    public void onMapReady(GoogleMap googleMap) { 
     drawMap(googleMap); 
    } 
} 
Смежные вопросы