RecyclerView의 다양한 레이아웃

11281 단어 android 학습

개념


RecyclerView는 서로 다른 보기 유형을 불러오는 데 사용할 수 있으며, 서버의 피드백을 바탕으로 서로 다른 레이아웃을 불러오는 것을 요구할 수 있습니다.어댑터에서 다시 쓰는 방법이 필요합니다. getItemViewType(),onCreatViewHolder(),onBindViewHolder()

실현


먼저 이전 절에서 기초 SimpleItemRecyclerViewAdapter 를 대체하는 대신 ComplexRecyclerViewAdapter 를 사용해야 합니다. 다음 예는 두 가지 레이아웃 Layout_viewHolder1.xml 을 포함하여 User 대상을 저장하고 layout_viewHolder2.xml 는 String 대상을 저장합니다.
  • 주 활동에서 문자와 이미지로 데이터 집합을 만듭니다
  •  private ArrayList getSampleArrayList() {
          ArrayList items = new ArrayList<>();
          items.add(new User("Dany Targaryen", "Valyria"));
          items.add(new User("Rob Stark", "Winterfell"));
          items.add("image");
          items.add(new User("Jon Snow", "Castle Black"));
          items.add("image");
          items.add(new User("Tyrion Lanister", "King's Landing"));
          return items;
      }
  • 데이터를 보여주기 위해 두 가지viewHolder 설정
  • public class ViewHolder1 extends RecyclerView.ViewHolder {
    
        private TextView label1, label2;
    
        public ViewHolder1(View v) {
            super(v);
            label1 = (TextView) v.findViewById(R.id.text1);
            label2 = (TextView) v.findViewById(R.id.text2);
        }
    
        public TextView getLabel1() {
            return label1;
        }
    
        public void setLabel1(TextView label1) {
            this.label1 = label1;
        }
    
        public TextView getLabel2() {
            return label2;
        }
    
        public void setLabel2(TextView label2) {
            this.label2 = label2;
        }
    }
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/llContainer"
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:padding="5dp">
    
        <TextView
            android:id="@+id/text1"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:textStyle="bold"
            android:textAppearance="?android:attr/textAppearanceListItemSmall"
            android:gravity="center_vertical"/>
    
        <TextView
            android:id="@+id/text2"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:textAppearance="?android:attr/textAppearanceListItemSmall"
            android:gravity="center_vertical" />
    
    LinearLayout>

    3. 복잡한 어댑터 만들기ComplexRecyclerViewAdapter
    public class ComplexRecyclerViewAdapter extends RecyclerView.Adapter {
        // RecyclerView 
        private List items;
        // 
        private final int USER = 0 , IMAGE = 1;
    
        public ComplexRecyclerViewAdapter(List items) {
            this.items = items;
        }
        // 
    
        @Override
        public int getItemCount() {
            return this.items.size();
        }
    // 
        @Override
        public int getItemViewType(int position) {
            if (items.get(position) instanceof User) {
                return USER;
            } else if (items.get(position) instanceof String) {
                return IMAGE;
            }
            return -1;
        }
    // viewHolder 
        @Override
        public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
            switch (RecyclerView.ViewHolder.getItemViewType()) {
                case USER:
                    ViewHolder1 vh1 = (ViewHolder1) holder;// 
                    configureViewHolder1(vh1, position);
                    break;
                case IMAGE:
                    ViewHolder2 vh2 = (ViewHolder2) holder;
                    configureViewHolder2(vh2);
                    break;
                default:
                    RecyclerViewSimpleTextViewHolder vh = (RecyclerViewSimpleTextViewHolder) holder;
                    confgureDefaultViewHolder(vh, position);
                    break;
            }
    
        }
    
        // viewholder,
    
        @Override
        public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
            RecyclerView.ViewHolder viewHolder;
            LayoutInflater inflater = LayoutInflater.from(parent.getContext());
            switch (viewType) {
                case USER:
                    View v1 =inflater.inflate(R.layout.layout_viewholder1, parent, false);
                    viewHolder = new ViewHolder1(v1);
                    break;
                case IMAGE:
                    View v2 = inflater.inflate(R.layout.layout_viewholder2, parent, false);
                    break;
                default:
                    View v = inflater.inflate(android.R.layout.simple_list_item_1, parent, false);
                    viewHolder = new RecyclerViewSimpleTextViewHolder(v);
                    break;
            }
            return viewHolder;
        }
        // viewHolder 
        private void configureDefaultViewHolder(RecyclerViewSimpleTextViewHolder vh, int position) {
            vh.getlabel().setText((CharSequence) items.get(position));
        }
        private void configureViewHolder1(ViewHolder1 vh1, int position) {
            User user = (User) items.get(position);
            if (user != null) {
                vh1.getLabel1().setText("Name:" + user.name);
                vh1.getLabel2().setText("Hometown" + user.hometown);
            }
        }
        private void configureViewHolder2(ViewHolder2 vh2) {
            vh2.getImagView().setImageResource(R.mipmap.ic_launcher);
        }
    
    }

    마지막 주 활동recyclerView.setAdapter(new ComplexRecyclerViewAdapter(getSampleArrayList()));

    좋은 웹페이지 즐겨찾기