Android List에 저장된 xml 파일 화면 출력

조회수 953회

안드로이드를 이용해 알람 앱을 만들고 있습니다.

사용자로부터 알람을 여러 개 받는 건 구현을 했는데 문제는 설정 된 알람들을 화면에 띄어 주려고 하는 과정에서 생겼습니다.

보통 저희가 폰에 알람을 여러 개 맞추면 알람이 위에서 부터 똑같은 형태(레이아웃)로 추가 되는데 이게 프로그래머가 일일이 TextView(알람 울릴 시간을 띄어 줄)를 화면에 직접 추가하는게 아닌

TextView, Button(알람 취소) 등을 포함하는 미리 정의 된 폼(form)을 list 같은 데 저장해 놓았다가 사용자가 알람을 추가함에 따라 list에 서 꺼내 오지 않을까 추측하고 있습니다.

질문1 : ArrayList 나 LinkedList 에 저장 된 xml 파일을 화면에 띄울 방법이 있나요?

질문2: 있다면 화면의 특정 위치에 띄울 수 있나요?

질문 3: 그 xml 파일안의 textview, button 같은 객체들에 접근하려면 어떻게 해야 하나요?

시간들여 읽어주시고 대답해 주셔서 감사합니다.

1 답변

  • 좋아요

    0

    싫어요
    채택 취소하기

    리사이클러뷰를 사용하면 됩니다.

    기존에는 ListView 라는 것이 있었고 이것은 하나의 뷰를 여러번 사용하여 리스트를 띄워줍니다.

    그러나 ListView 에서 특정 패턴을 강제하고 사용하기 더 쉽도록 RecyclerView 가 새로 생겼습니다.

    사용법 .

    app 모듈 그래들에서 아래 코드를 의존성 부분에 넣으세욥

    dependencies {    
        implementation 'com.android.support:recyclerview-v7:27.1.1'
    }
    

    아래 코드는 리스트가 표실될 xml layout 에 넣으시면 됩니다.

    <android.support.v7.widget.RecyclerView
        android:id="@+id/id"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layoutManager="android.support.v7.widget.LinearLayoutManager"
        />
    

    반복할 ui 를 만들어주세요 layout 에 item_information_user_list 를 생성하도록 하겠습니다.

    아래 뷰를 데이터 양에 따라 여러번 불러올 수 있습니다.

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginTop="10dp"
    android:orientation="vertical"
    >
    
    <TextView
        android:id="@+id/category_text_view_information_list_item"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginLeft="12dp"
        android:text="카테고리"
        />
    
    <TextView
        android:id="@+id/content_text_view_information_list_item"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginLeft="8dp"
        android:layout_marginRight="8dp"
        android:layout_marginBottom="10dp"
        android:text="이름,주소,전화번호가 들어갈 곳입니다."
        android:textSize="24sp"
        android:textColor="@color/black"
        />
    
    <View
        android:layout_width="match_parent"
        android:layout_height="1dp"
        android:background="@color/transparencyDark"
        />
    

    프래그먼트든 액티비티든 RecyclerView 를 findViewById 등을 써서 인플레이트 해주세요!

    그 다음 리사이클러 뷰를 사용하기 위한 어댑터를 준비해 보겠습니다. 어댑터는 여러가지 종류와 뜻이 있지만 대용량 데이터를 사용하기 위한 중간다리정도로 이해하시면 됩니다.

    //프래그먼트 안에 이너 클래스로 정의했습니다.
    private class InformationAdapter extends RecyclerView.Adapter<InformationViewHolder> {
        private String[] mItems;
    
        public InformationAdapter(String[] items) {
            mItems = items;
        }
    
        public void updateData(String[] items) {
            mItems = items;
            notifyDataSetChanged();
        }
    
        @Override
        public InformationViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
            View v = LayoutInflater.from(parent.getContext())
                    .inflate(R.layout.item_information_user_list, parent, false);
            return new InformationViewHolder(v);
        }
    
        @Override
        public void onBindViewHolder(InformationViewHolder holder, int position) {
            String category = "카테고리";
            if (position == 0) category = "주소";
            else if (position == 1) category = "전화번호";
            holder.bindViewHolder(category, mItems[position]);
        }
    
        @Override
        public int getItemCount() {
            if (mItems == null) return 0;
            return mItems.length;
        }
    }
    

    하나의 뷰를 정의할 ViewHolder 클래스를 작성해보겠습니다.

    //프래그먼트 안에 이너 클래스로 정의했습니다.
    private class InformationViewHolder extends RecyclerView.ViewHolder {
        final TextView mCategoryText;
        final TextView mContentText;
    
        public InformationViewHolder(View itemView) {
            super(itemView);
            mCategoryText = itemView.findViewById(R.id.category_text_view_information_list_item);
            mContentText = itemView.findViewById(R.id.content_text_view_information_list_item);
        }
    
        public void bindViewHolder(String category, String content) {
            mCategoryText.setText(category);
            mContentText.setText(content);
        }
    }
    

    뷰 홀더 클래스는 리사이클러뷰에 의해 '재사용' 됩니다 재사용에 대한건 따로 검색해보세요!

    이제 해당 어댑터와 뷰홀더를 리사이클러뷰에 할당합니다.

    // 프래그먼트의 onCreateView() 에 작성되었습니다.
        data = new String[2]; <- 알람 관련 데이터로 작성하시면 됩니다. 리스트로 바꾸시면 어댑터쪽도 알맞게 변경해주세요.
        mInformationAdapter = new InformationAdapter(data);
        mList.setAdapter(mInformationAdapter);
    

    바로 적용할 수 있도록 코드를 작성해봤습니다. 코드가 길어지면 어댑터를 분리된 파일로 작성하셔도 괜찮고 리니어 레이아웃, 그리드레이아웃, 뷰홀더 사이에 데코레이션을 넣는등 많은 사용법이 있습니다. 굿바이!

    • (•́ ✖ •̀)
      알 수 없는 사용자
    • LIstView로 해결해 보려 했는데 더 좋은게 있었네요! 사용 예도 보여 주셔서 정말 감사합니다!!! world2026 2018.5.4 21:19

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)