안드로이드

DAY015. Android(5)

피톤치즈 2017. 1. 31. 20:43
반응형

Android

  • ListView
    • ListView는 화면에 보이는 list만 생성하고 화면의 움직임에 따라 view가 위 혹은 아래 방향에 attach되는 것.
    • xml에 palette -> containers -> ListView
    • listview 사용법 . 선언 -> 아답터 정의 -> 리스트뷰에 아답터 세팅
    • ArrayAdapter나 customize하여 레이아웃, 데이터 등을 이용하여 listview에 setting
    • customize 예
    • class 파일과 xml파일을 각각 만들고 xml파일은 1행에 대한 디자인을 함.
//class 예
public class CustomAdapter extends BaseAdapter {
    LayoutInflater inflater;    //layoutinflter 변수 선언
    String[] datas;        //데이터

    public CustomAdapter(String[] data, Context context ) {
        inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        this.datas = data;
    }

    //데이터 길이
    @Override
    public int getCount() { return datas.length; }

    //position 위치의 data 객체
    @Override
    public Object getItem(int position) { return datas[position]; }

    //위치
    @Override
    public long getItemId(int position) { return position; }

    // 사용자 customize adapter는 한 행단위를 개발자가 직접 만들어서 시스템에 넘겨줘야한다.
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        //1. 한행에 해당하는 레이아웃 xml을 뷰 객체로 만들어준다.
        if ( convertView == null)   //한번 화면에 셋팅되었던 행은 convertView에 담겨져서 돌아온다.
            convertView = inflater.inflate(R.layout.list_item, null);

        //2. inflate된 뷰를 통해서 findViewById 를 사용한다.
        TextView tvNo = (TextView) convertView.findViewById(R.id.tvID);
        TextView tvDay = (TextView) convertView.findViewById(R.id.tvDay);

        //3. inflate된 뷰의 위젯에 값을 셋팅
        tvNo.setText(position + 1 + "");
        tvDay.setText(datas[position]);

        //4. 완성된 한행의 뷰를 시스템을 넘겨준다.
        return convertView;
    }
}
  • 위에서 textview 객체를 계속 생성하므로 holder라는 클래스를 만들어 메모리낭비를 막을 수 있다.
    class CustomHolderAdapter extends BaseAdapter {

        ArrayList<User> datas;
        LayoutInflater inflate;
        public CustomHolderAdapter(ArrayList<User> datas, Context context) {
            this.datas = datas;
            inflate = (LayoutInflater)context.getSystemService(context.LAYOUT_INFLATER_SERVICE);
        }

        @Override
        public int getCount() {
            return datas.size();
        }

        @Override
        public Object getItem(int position) {
            return datas.get(position);
        }

        @Override
        public long getItemId(int position) {
            return position;
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            Holder holder;

            if ( convertView == null) {
                convertView = inflate.inflate(R.layout.list_holder_item, null);

                holder = new Holder();
                holder.tvID = (TextView)convertView.findViewById(R.id.tvID);
                holder.tvName = (TextView)convertView.findViewById(R.id.tvName);
                holder.tvAge = (TextView)convertView.findViewById(R.id.tvAge);

                //값 셋팅해주기.
                convertView.setTag(holder);
            }
            else { //값 가져오기
                holder = (Holder) convertView.getTag();
            }
            User user = datas.get(position);

            holder.tvID.setText(user.id + "");
            holder.tvName.setText(user.name);
            holder.tvAge.setText(user.age + "");

            return convertView;
        }

        // 각행에서 사용되는 위젯을 재사용하기 위한 holder 클래스
        class Holder {
            public TextView tvID;
            public TextView tvName;
            public TextView tvAge;
        }
    }
  • RecyclerView
    • listview에서 향상된 버전
    • xml에 palette -> custom-AppCombat -> RecyclerView
public class RecyclerCustomAdapter extends RecyclerView.Adapter<RecyclerCustomAdapter.CustomViewHolder>{

    ArrayList<User> datas = null;
    //리스트 각행에서 사용되는 레이아웃 xml의 id
    int itemLayout;

    public RecyclerCustomAdapter(ArrayList<User> data, int itemLayout) {
        this.datas = data;
        this.itemLayout = itemLayout;
    }

    //View를 생성해서 홀더에 저장하는 역할
    @Override
    public CustomViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(itemLayout, parent, false); //context.getSystem과 같음.
        return new CustomViewHolder(view);
    }

    //listview에 getView를 대체
    @Override
    public void onBindViewHolder(CustomViewHolder holder, int position) {
        User user = datas.get(position);

        holder.tvID.setText(user.id + "");
        holder.tvName.setText(user.name);
        holder.tvAge.setText(user.age + "");
    }

    //데이터 총 개수
    @Override
    public int getItemCount() { return datas.size(); }

    // 이 뷰홀더를 사용하는 adapter는 generic으로 선언
    public class CustomViewHolder extends RecyclerView.ViewHolder {

        TextView tvID, tvName, tvAge;

        public CustomViewHolder(View itemView) {
            super(itemView);
            tvID = (TextView) itemView.findViewById(R.id.tvID);
            tvName = (TextView) itemView.findViewById(R.id.tvName);
            tvAge = (TextView) itemView.findViewById(R.id.tvAge);
        }
    }
}

/////////////////////////////
//acivity의 onCreate 함수에..

        Data data = new Data();
        datas = data.get();

        //리스트뷰 가져오기
        RecyclerView rv = (RecyclerView)findViewById(R.id.rvView);

        //아답터 생성
        CardAdapter ca = new CardAdapter(datas, this);

        //리스트뷰에 아답터 셋팅
        rv.setAdapter(ca);

        //레이아웃 매니저 세팅
        rv.setLayoutManager(new LinearLayoutManager(this));
public class CardAdapter extends RecyclerView.Adapter<CardAdapter.CustomViewHolder>{
    ArrayList<User> datas;
    Context context; //클릭처리, 애니메이션 등을 위해 시스템 지원 사용이 필요.

    public CardAdapter(ArrayList<User> data, Context context) {
        this.datas = data;
        this.context = context;
    }

    //View를 생성해서 홀더에 저장하는 역할
    @Override
    public CustomViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_card_item, parent, false);
        return new CustomViewHolder(view);
    }

    //listview 의 getView를 대체
    @Override
    public void onBindViewHolder(CustomViewHolder holder, int position) {
        final User user = datas.get(position);

        holder.tvID.setText(user.id + "");
        holder.tvName.setText(user.name);
        holder.tvAge.setText(user.age + "");

        //애니메이션
        Animation animation = AnimationUtils.loadAnimation(context, android.R.anim.slide_in_left);
        //뷰에 정의한 애니메이션을 세팅
        holder.cardView.setAnimation(animation);
    }

    //데이터 총 개수
    @Override
    public int getItemCount() {
        return datas.size();
    }

    //recycler 뷰에서 사용하는 뷰홀더
    // 이 뷰홀더를 사용하는 adapter는 generic으로
    public class CustomViewHolder extends RecyclerView.ViewHolder {

        TextView tvID, tvName, tvAge;
        CardView cardView;

        public CustomViewHolder(View itemView) {
            super(itemView);
            tvID = (TextView) itemView.findViewById(R.id.tvID);
            tvName = (TextView) itemView.findViewById(R.id.tvName);
            tvAge = (TextView) itemView.findViewById(R.id.tvAge);

            cardView = (CardView)itemView.findViewById(R.id.cardView);
        }
    }
}
반응형