안드로이드
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));
- cardview + holder + animation
- 사용하는 이유는 모서리 라운드 처리를 해줌.
- xml에 xmlns:card_view = “http://schemas.android.com/apk/res-auto“ 추가
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); } } }
반응형