Main Activity의 기본 (Recycler view 편)

Main Activity의 기본 (Recycler view 편)



Recycler view를 이용하여 여러 리스트가 표시될 때 어떻게 생성되어 화면에 출력되는지를 정리해 보았다.

이번에 만든 view


  • 각 목록에 사진과 텍스트가 표시됩니다.
  • 우기수의 아이템마다 view가 다르다(보기 힘들지만 text의 색이 바뀌어 있습니다)
  • 스크롤 할 수 있게 되어 있다



  • onCreate()



    액티비티가 생성되었을 때 행해지므로, activity 당 1번 밖에 읽혀지지 않는다.
  • setContentView 메소드로 xml 파일로부터 메인이 되는 화면의 레이아웃을 호출해, 설치한다.
  •     @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_recycler_view);
        }
    

    온레스메()



    화면에 비추어졌을 때 onResume이 로드된다.
    onCreate()와 달리 activity가 생성된 후 다른 화면에서 다시 맨 위 화면이 되었을 때 다시 로드되므로, 화면이 바뀔 때마다 다시 읽어주고 싶은 것은 onResume에 쓰고 activity 생성 된 시점에서 한 번만 읽어야하는 것은 onCreate ()에 씁니다.
  • Recycle view를 호출하고 layoutManager를 설정합니다.
  • Adapter를 생성해, addItems() 메소드에 의해 데이터를 삽입한다
  •     @Override
        protected void onResume() {
            super.onResume();
            RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recycler_view);
            recyclerView.setHasFixedSize(true);
            recyclerView.setLayoutManager(new LinearLayoutManager(this));
            RecyclerViewAdapter adapter = new RecyclerViewAdapter(this);
            recyclerView.setAdapter(adapter);
            adapter.addItems(createData());
        }
    

    createData()


  • ArrayList의 인스턴스를 생성해, 실제의 데이터를 취득해 와 userInfo 에 격납한다
  •     @NonNull
        private List<UserInfo> createData() {
            List<UserInfo> userInfos = new ArrayList<>();
    
            UserInfo userInfo1 = new UserInfo(getString(R.string.sweets1), R.drawable.one);
            UserInfo userInfo2 = new UserInfo(getString(R.string.sweets2), R.drawable.two);
            UserInfo userInfo3 = new UserInfo(getString(R.string.sweets3), R.drawable.three);
            UserInfo userInfo4 = new UserInfo(getString(R.string.sweets4), R.drawable.four);
            UserInfo userInfo5 = new UserInfo(getString(R.string.sweets5), R.drawable.five);
            UserInfo userInfo6 = new UserInfo(getString(R.string.sweets6), R.drawable.six);
            UserInfo userInfo7 = new UserInfo(getString(R.string.sweets1), R.drawable.one);
            UserInfo userInfo8 = new UserInfo(getString(R.string.sweets1), R.drawable.one);
            UserInfo userInfo9 = new UserInfo(getString(R.string.sweets1), R.drawable.one);
            UserInfo userInfo10 = new UserInfo(getString(R.string.sweets1), R.drawable.one);
            UserInfo userInfo11 = new UserInfo(getString(R.string.sweets1), R.drawable.one);
            UserInfo userInfo12 = new UserInfo(getString(R.string.sweets1), R.drawable.one);
            userInfos.add(userInfo1);
            userInfos.add(userInfo2);
            userInfos.add(userInfo3);
            userInfos.add(userInfo4);
            userInfos.add(userInfo5);
            userInfos.add(userInfo6);
            userInfos.add(userInfo7);
            userInfos.add(userInfo8);
            userInfos.add(userInfo9);
            userInfos.add(userInfo10);
            userInfos.add(userInfo11);
            userInfos.add(userInfo12);
            return userInfos;
        }
    
        static class UserInfo {
            final String name;
            //final String timeStamp;
            @IdRes
            final Integer icon;
    
            UserInfo(String name, Integer icon) {
                this.name = name;
                //this.timeStamp = timeStamp;
                this.icon = icon;
            }
        }
    

    RecyclerViewAdapter


  • 어댑터가 데이터 (목록에 표시 할 정보) 및 레이아웃 (예 : 목록)을 출력하도록합니다.

    RecyclerViewAdapter()


            // 0番目
            public RecyclerViewAdapter(@NonNull Context context) {
                this.inflater = LayoutInflater.from(context);
                this.data = new ArrayList<>();
            }
    

    CustomViewHolder


  • CustomViewHolder 내에는 리스트에 넣고 싶은 ImageView나 TextView등을 저장하고 있다
  • 정의 된 변수 (iconView, nameView)는 각각의 레이아웃을 저장합니다
  •         static class CustomViewHolder extends RecyclerView.ViewHolder {
                ImageView iconView;
                TextView nameView;
    //            TextView timeStampView;
    
                public CustomViewHolder(View itemView) {
                    super(itemView);
                    iconView = (ImageView) itemView.findViewById(R.id.photo);
                    nameView = (TextView) itemView.findViewById(R.id.name);
    //                timeStampView = (TextView) itemView.findViewById(R.id.time_stamp);
                }
            }
    

    onCreateViewHolder



    리스트의 position을 viewType으로 취득해, 리스트 마다 레이아웃을 삽입한다(이 경우에서는 우기로 레이아웃을 나누고 있으므로 우기 마다 조건 분기로 별개의 레이아웃을 삽입하고 있다)
            // 2番目
            @Override
            public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
                View recyclerViewListItem = null;
                if (viewType == VIEW_TYPE1) {
                    recyclerViewListItem = inflater.inflate(R.layout.recycler_view_list_item, parent, false);
                } else {
                    recyclerViewListItem = inflater.inflate(R.layout.recycler_view_list_item2, parent, false);
                }
                CustomViewHolder customViewHolder = new CustomViewHolder(recyclerViewListItem);
                return customViewHolder;
            }
    

    onBindViewHolder


  • CustomViewholder의 인스턴스를 만들고 각 목록의 각 항목에 대한 뷰를 연 다음 데이터를 삽입합니다.
            // 3番目
            @Override
            public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
                CustomViewHolder customViewHolder = (CustomViewHolder) holder;
                customViewHolder.nameView.setText(data.get(position).name);
                customViewHolder.iconView.setImageResource(data.get(position).icon);
            }
    

    getItemViewType


  • position의 위치의 우기에 의해 돌려주는 값을 나누고 있다
  •         @Override
            public int getItemViewType(int position) {
                if (position % 2 == 0) {
                    return VIEW_TYPE1;
                }
                return VIEW_TYPE2;
            }
    

    getItemCount


  • Item의 개수를 세는 method
  •         // 1番目
            @Override
            public int getItemCount() {
                return data.size();
            }
    

    addItems


  • data 에 들어있는 데이터를 name 변수에 저장하는 메소드
  • adapter.addItems(createData()) 의 method로 사용되고 있다
  • adapter.addItems(createData()); 때 사용하는 어댑터에 데이터를 삽입하는 방법
  •         public void addItems(@NonNull List<UserInfo> name) {
                this.data.addAll(name);
                notifyDataSetChanged();
            }
    

    @override 란 무엇입니까?


  • override 주석 (annotation)
  • compile 했을 때, super class에 정의되어 있지 않은 경우는 에러를 출력해 준다.

  • @NonNull 은 method의 앞에 붙여 놓는 것으로, 이 method는 null를 돌려주지 않는다고 하는 것을 어노테이션 해 준다.

  • getIndentifier()를 사용하여 단순화


  • 방금 전의 createData() 메소드가 이상하게 길어져 버렸으므로, getIdentifier를 사용해 간략화했습니다.
  • 취득하고 싶은 복수 데이터가 숫자의 일련번호가 되어 있을 때 편리(data1, data2, data3... 등)

  • 이 부분을 ....
            List<UserInfo> userInfos = new ArrayList<>();
    
            UserInfo userInfo1 = new UserInfo(getString(R.string.sweets1), R.drawable.view1);
            UserInfo userInfo2 = new UserInfo(getString(R.string.sweets2), R.drawable.view2);
            UserInfo userInfo3 = new UserInfo(getString(R.string.sweets3), R.drawable.view3);
            UserInfo userInfo4 = new UserInfo(getString(R.string.sweets4), R.drawable.view4);
            UserInfo userInfo5 = new UserInfo(getString(R.string.sweets5), R.drawable.view5);
            UserInfo userInfo6 = new UserInfo(getString(R.string.sweets6), R.drawable.view6);
            UserInfo userInfo7 = new UserInfo(getString(R.string.sweets1), R.drawable.view1);
            UserInfo userInfo8 = new UserInfo(getString(R.string.sweets2), R.drawable.view2);
            UserInfo userInfo9 = new UserInfo(getString(R.string.sweets3), R.drawable.view3);
            UserInfo userInfo10 = new UserInfo(getString(R.string.sweets4), R.drawable.view4);
            UserInfo userInfo11 = new UserInfo(getString(R.string.sweets5), R.drawable.view5);
            UserInfo userInfo12 = new UserInfo(getString(R.string.sweets6), R.drawable.view6);
            userInfos.add(userInfo1);
            userInfos.add(userInfo2);
            userInfos.add(userInfo3);
            userInfos.add(userInfo4);
            userInfos.add(userInfo5);
            userInfos.add(userInfo6);
            userInfos.add(userInfo7);
            userInfos.add(userInfo8);
            userInfos.add(userInfo9);
            userInfos.add(userInfo10);
            userInfos.add(userInfo11);
            userInfos.add(userInfo12);
            return userInfos;
    

    이렇게 다시 쓰기
    
    List<UserInfo> userInfos = new ArrayList<>();
    int strId, viewId;
    String resViewName, resStrName;
    
    Resources res = getResources()
    for(int i = 1, i < 13; i++){ 
    if(i > 6){
    resStrName = "sweets" + i - 6;
    resViewName = "view" + i - 6;
    } else {
    resStrName = "sweets" + i;
    resViewName = "view" + i;
    }
    strId = res.getIdentifier(resStrName, "string", getPackageName());
    viewId = res.getIdentifier(resViewName, "id", getPackageName());
    UserInfo "userInfo" + i = new UserInfo(getString(strId), viewId)
    
    resStrName = "userInfo" + i
    userInfos.add(resStrName);
    }
    return userInfos;
    

    모든 소스 코드

    좋은 웹페이지 즐겨찾기