kyoungjoosin / Capston-Design

0 stars 0 forks source link

RecyclerView를 이용해 뷰 표현(1) #6

Open kyoungjoosin opened 2 years ago

kyoungjoosin commented 2 years ago

content.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
<LinearLayout
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    tools:ignore="MissingConstraints">

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

        <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="60dp">

            <TextView
                android:id="@+id/tv_username"
                android:layout_centerVertical="true"
                android:layout_marginLeft="10dp"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:textStyle="bold"
                android:textSize="17sp"
                android:textColor="@color/black"
                android:text="merrygoround"/>

            <ImageView
                android:layout_centerVertical="true"
                android:layout_alignParentRight="true"
                android:layout_width="30dp"
                android:layout_height="30dp"
                android:scaleType="fitXY"
                android:src="@drawable/mego"/>

        </RelativeLayout>
        <ImageView
            android:id="@+id/img_main"
            android:layout_width="match_parent"
            android:layout_height="300dp"
            android:src="@drawable/mego"
            android:scaleType="centerCrop"/>

        <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="60dp">

            <ImageView
                android:id="@+id/ic_like"
                android:layout_width="100dp"
                android:layout_height="100dp"
                android:layout_centerVertical="true"
                android:layout_marginLeft="7dp"
                android:scaleType="fitXY"
                android:src="@drawable/like_icon" />
            <TextView
                android:layout_toRightOf="@id/ic_like"
                android:layout_marginLeft="10dp"
                android:layout_centerVertical="true"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:textColor="@color/black"
                android:textStyle="normal"
                android:textSize="15sp"
                android:text="View More"/>

        </RelativeLayout>

    </LinearLayout>

</LinearLayout>

</androidx.constraintlayout.widget.ConstraintLayout>

image

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

    xmlns:card_view="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity"
    android:orientation="vertical">

    <LinearLayout
        android:orientation="horizontal"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <androidx.recyclerview.widget.RecyclerView
            android:id="@+id/rc_mainProfile"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:scrollbars="vertical"/>

    </LinearLayout>
    <androidx.fragment.app.FragmentContainerView
        android:id="@+id/map"
        android:name="com.naver.maps.map.MapFragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:layout="@layout/item" />

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="horizontal">

        <androidx.cardview.widget.CardView
            android:id="@+id/card_view"
            android:layout_width="338dp"
            android:layout_height="383dp"
            android:layout_gravity="center"
            card_view:cardCornerRadius="4dp">

        </androidx.cardview.widget.CardView>

        <Button
            android:id="@+id/btnOrder"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginStart="3dp"
            android:layout_marginTop="580dp"
            android:background="@drawable/mego"
            android:paddingLeft="30dp"
            android:paddingRight="30dp"
            android:text="카페와 음식점"
            android:textColor="#ff0" />
    </RelativeLayout>

</LinearLayout>

image

ImageMainAdapter.java

package com.test.navermap;

import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;

import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;

import java.util.ArrayList;
import java.util.List;

public class ImageMainAdapter extends RecyclerView.Adapter<ImageMainAdapter.MainImageHolder> {
    List<Integer> mainImageSources=new ArrayList<>();

    public void addMainImage(int img){
        mainImageSources.add(img);
    }

    //껍데기 생성
    @NonNull
    @Override
    public ImageMainAdapter.MainImageHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {

        LayoutInflater inflater=LayoutInflater.from(parent.getContext());
        View view=inflater.inflate(R.layout.content,parent,false);
        return new MainImageHolder(view);
    }

    //데이터 바인딩
    @Override
    public void onBindViewHolder(@NonNull ImageMainAdapter.MainImageHolder holder, int position) {

        int mainImage=mainImageSources.get(position);
        holder.setMainImgView(mainImage);
    }

    //크기 지정
    @Override
    public int getItemCount() {
        return mainImageSources.size();
    }

    public static class MainImageHolder extends RecyclerView.ViewHolder{
        //규칙1 : 레이아웃 내부의 뷰 모두 변수화
        private ImageView mainImgView;

        public MainImageHolder(@NonNull View itemView){
            super(itemView);

            //규칙2 : id를 통해 뷰 찾기
            mainImgView=itemView.findViewById(R.id.img_main);
        }
        //규칙3 : 함수를 통해 아이템 넣기
        public void setMainImgView(int img){
            mainImgView.setImageResource(img);
        }
    }
}

MainActivity.java

package com.test.navermap;

import android.Manifest;
import android.content.Context;
import android.os.Bundle;
import android.view.View;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.FragmentManager;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import com.naver.maps.geometry.LatLng;
import com.naver.maps.map.CameraPosition;
import com.naver.maps.map.LocationTrackingMode;
import com.naver.maps.map.MapFragment;
import com.naver.maps.map.NaverMap;
import com.naver.maps.map.NaverMapOptions;
import com.naver.maps.map.OnMapReadyCallback;
import com.naver.maps.map.UiSettings;
import com.naver.maps.map.overlay.InfoWindow;
import com.naver.maps.map.overlay.Marker;
import com.naver.maps.map.overlay.Overlay;
import com.naver.maps.map.overlay.OverlayImage;
import com.naver.maps.map.util.FusedLocationSource;
import com.test.navermap.databinding.ActivityMainBinding;

import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity implements OnMapReadyCallback {

    //뷰
    private Context mContext=MainActivity.this;
    private RecyclerView rcMain;
    private ImageMainAdapter imageMainAdapter;

    //지도
    private NaverMap naverMap;
    private FusedLocationSource locationSource;
    private static final int LOCATION_PERMISSION_REQUEST_CODE = 1000;
    private static final String[] PERMISSIONS = {
            Manifest.permission.ACCESS_FINE_LOCATION,
            Manifest.permission.ACCESS_COARSE_LOCATION
    };
    private ActivityMainBinding binding;
    List<LatLng> lstLatLng = new ArrayList<>();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        binding = ActivityMainBinding.inflate(getLayoutInflater());
        View view = binding.getRoot();
        setContentView(view);
        //setContentView(R.layout.activity_main);
        locationSource = new FusedLocationSource(this,LOCATION_PERMISSION_REQUEST_CODE);

        CameraPosition cameraPosition = new CameraPosition(
                new LatLng(35.1798159, 129.070222), //대상 지점
                16, //줌 레벨
                20, //기울임 각도
                0 //베어링 각도
        );

        NaverMapOptions options = new NaverMapOptions()
                .camera(cameraPosition)
                .mapType(NaverMap.MapType.Terrain)
                .enabledLayerGroups(NaverMap.LAYER_GROUP_BUILDING)
                .compassEnabled(true)
                .scaleBarEnabled(true)
                .locationButtonEnabled(true);

        FragmentManager fm = getSupportFragmentManager();
        MapFragment mapFragment = (MapFragment) fm.findFragmentById(R.id.map);
        if (mapFragment == null) {
            mapFragment = MapFragment.newInstance();
            fm.beginTransaction().add(R.id.map, mapFragment).commit();
        }
        mapFragment.getMapAsync(this);

        //뷰
        rcMain=findViewById(R.id.rc_mainProfile);
        imageMainAdapter=new ImageMainAdapter();

            //이미지 넣기
        imageMainAdapter.addMainImage(R.drawable.mego);
        imageMainAdapter.addMainImage(R.drawable.second_road);

        RecyclerView.LayoutManager layoutManager=new LinearLayoutManager(mContext);
        rcMain.setLayoutManager(layoutManager);
        rcMain.setAdapter(imageMainAdapter);
    }

    @Override
    public void onMapReady(@NonNull NaverMap naverMap) {
        this.naverMap = naverMap;
        //naverMap.setLocationSource(locationSource); //현재위치 표시
        //ActivityCompat.requestPermissions(this, PERMISSIONS, LOCATION_PERMISSION_REQUEST_CODE);

        //디폴트 위치 정하기(메리고라운드)
        CameraPosition cameraPosition = new CameraPosition(
                new LatLng(36.6186031684174, 127.290161851575),
                16
        );
        naverMap.setCameraPosition(cameraPosition);

        //정보창
        InfoWindow infoWindow = new InfoWindow();
        infoWindow.setAdapter(new InfoWindow.DefaultTextAdapter(this) {
            @NonNull
            @Override
            public CharSequence getText(@NonNull InfoWindow infoWindow) {
                return "메리고라운드";
            }
        });

        //마커 표시
        Marker marker1 = new Marker();
        Marker marker2 = new Marker();
        Marker marker3 = new Marker();
        Marker marker4 = new Marker();
        Marker marker5 = new Marker();
        Marker marker6 = new Marker();
        Marker marker7 = new Marker();

        //메리고라운드
        marker1.setPosition(new LatLng(36.6186031684174, 127.290161851575));
        marker1.setCaptionText("메리고라운드");
        marker1.setMap(naverMap);

        //세컨로드
        marker2.setPosition(new LatLng(36.6184830998888, 127.289510234393));
        marker2.setCaptionText("세컨로드");
        marker2.setMap(naverMap);

        //원미
        marker3.setPosition(new LatLng(36.6142536955248, 127.289846536649));
        marker3.setCaptionText("원미");
        marker3.setMap(naverMap);

        //흑룡강
        marker4.setPosition(new LatLng(36.61772340913732, 127.28878077672847));
        marker4.setCaptionText("흑룡강");
        marker4.setMap(naverMap);

        //옛통이모
        marker5.setPosition(new LatLng(36.618577878689955, 127.28851567105625));
        marker5.setCaptionText("옛통이모");
        marker5.setMap(naverMap);

        //서라벌가든
        marker6.setPosition(new LatLng(36.61885647034628, 127.2906826192085));
        marker6.setCaptionText("서라벌가든");
        marker6.setMap(naverMap);

        //요프
        marker7.setPosition(new LatLng(36.617074566435775, 127.2869254983756));
        marker7.setCaptionText("요프");
        marker7.setMap(naverMap);

        //마커 아이콘
        marker1.setIcon(OverlayImage.fromResource(R.drawable.cafe_icon));
        marker2.setIcon(OverlayImage.fromResource(R.drawable.cafe_icon));
        marker7.setIcon(OverlayImage.fromResource(R.drawable.cafe_icon));

        marker3.setIcon(OverlayImage.fromResource(R.drawable.res_icon));
        marker4.setIcon(OverlayImage.fromResource(R.drawable.res_icon));
        marker5.setIcon(OverlayImage.fromResource(R.drawable.res_icon));
        marker6.setIcon(OverlayImage.fromResource(R.drawable.cafe_icon));

        naverMap.setOnMapClickListener(naverMap.getOnMapClickListener());

        //지도를 클릭하면 정보 창을 닫음
        naverMap.setOnMapClickListener((coord,point)->{
            infoWindow.close();
        });

        //마커를 클릭하면:
        Overlay.OnClickListener listener = overlay -> {
            Marker marker = (Marker)overlay;

            if (marker.getInfoWindow()==null){
                //현재 마커에 정보 창이 열려있지 않을 경우 엶
                infoWindow.open(marker);
            }else {
                //이미 현재 마커에 정보 창이 열려있을 경우 닫음
                infoWindow.close();
            }
            return true;
        };

        marker1.setOnClickListener(listener);
        marker2.setOnClickListener(listener);
        marker3.setOnClickListener(listener);
        marker4.setOnClickListener(listener);
        marker5.setOnClickListener(listener);
        marker6.setOnClickListener(listener);
        marker7.setOnClickListener(listener);

        UiSettings uiSettings = naverMap.getUiSettings();
        uiSettings.setLocationButtonEnabled(true);

        naverMap.setLocationTrackingMode(LocationTrackingMode.Follow);

    }

}
kyoungjoosin commented 2 years ago

참고 사이트 https://itstudy-mary.tistory.com/210?category=929375

kyoungjoosin commented 2 years ago

애뮬레이터에서 지도를 열 때 내가 만든 뷰페이지가 나오지 않음 -> 아직 결합을 해주지 않아서인듯

xml파일에서 사진과 텍스트 배치와 사이즈 컬러 결정 등을 어느정도 이해는 했지만 정확히 알지는 못하는 상태.