4

片段我怎樣才能從RecyclerView.ViewHolderAndroid的谷歌地圖在RecyclerView.ViewHolder

到的GoogleMap

我:

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,而不是地圖片段它的工作原理,但不刷新地圖。點擊地圖幾次後,地圖刷新。 問候,愛爾蘭人

+0

從XML編碼你貼,你用cardview,所以做你mapfragment是不是裏面一個回收者視圖。另外你什麼意思不刷新?您可以在這裏查看recyclerview的文檔:https://developer.android.com/training/material/lists-cards.html – ztan

+0

問題是如何獲取地圖片段。如果我在xml中有TextView(用於行的xml),我可以將它作爲findViewById(R.id.my_text)在RecyclerView.ViewHolder中獲取;然後我可以將值設置爲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); 
    } 
}