Adapter


Adapterとは?


Adapterは、表示されたビューとそのビューにアップロードするデータを接続するブリッジです.
これは、データ・ソースを受信および管理できることを意味します. 中間オブジェクトとして機能します.
アダプターにはArrayAdapter、CursorAdapter、SimpleAdapterなどがあります.
すなわち、アダプタビューは、アダプタビューが出力できるデータの空間であり、アダプタビューはこのデータを出力する役割を果たす.
アダプタに接続された 元のデータが変更された場合は、notifyDataSetChangedメソッドを呼び出して、アダプタビューが再描画されるようにアダプタビューソースに変更されたことを通知します.

アダプタビューとは?

  • 画面の小さいモバイルデバイス上のビュー
  • は、複数の情報を一度に表示する機能を提供する.
  • は、ビューに直接情報を追加することなく、大量の情報を効率的に処理する.  Adapterという中間媒体が使われていることから名付けられた.
  • AdapterView  ViewGroup을 상속を受け取り、内部には多くのビューを収容することができます.
  • AdapterViewの代表サブクラス:ListView、GridView、Spiner、Gallery

  • onCharded()ステップでは、各ビューが自分のLayoutを要求すると、listviewは自分のサブアイテムが一緒に貼り付けられているかどうかを確認し、getviewのアイテム数を呼び出します.
    notifydatasetInvalidate()もnotifydatasetChangedと同様の方法である.ただし、notifyDataSetInvalidateを行うと、childの数、初期データ設定の数のみが保持され、追加または削除の数は反映されません.(つまり、itemのデータが変化しているのをユーザーに見せるだけのようです)

    Adapter Viewの例

    public class MainActivity extends AppCompatActivity {
    		@Override protected void onCreate(Bundle savedInstanceState) {
    				super.onCreate(savedInstanceState);
    				setContentView(R.layout.activity_main);
    				ListView listView = findViewById(R.id.lv_comment_view);
    		}
    		class MyAdapter extends BaseAdapter {
    		
    		}
    
    }
    /*
    	메인 액티비티에서는 ListView listview = findViewById를 통해 리스트뷰를 가리키도록 해주고
    	이제 이 리스트 뷰(어댑터 뷰)를 이용할 어댑터를 만들어야 하므로
    	어댑터 클래스인 MyAdapter을 하나 만들어준다.(이때 BaseAdapter을 상속하여 만들도록 한다.)
    */
    public class MyItem { 
    		String id;
    		String phone;
    
    		public MyItem(String id, String phone) {
    				this.id = id;
    				this.phone = phone;
    		}
    
    		public MyItem() {
    		
    		}
    
    		public String getId() {
    				return id;
    		}
    
    		public void setId(String id) { 
    				this.id = id;
    		} 
    
    		public String getPhone() { 
    				return phone;
    		} 
    
    		public void setPhone(String phone) {
    				this.phone = phone;
    		}
    }
    // 해당 클래스는 item에 들어갈 항목인 id, phone를 가지며, get, set 함수를 기본적으로 정의
    
    // 뷰를 생성할 때는 필수 생성자가 2개이다.
    public class MyItemView extends LinearLayout { 
    		TextView textView, textView2;
    
    		public MyItemView(Context context) { 
    				super(context);
    				init(context);
    		} 
    
    		public MyItemView(Context context, @Nullable AttributeSet attrs) {
    				super(context, attrs); 
    				init(context); 
    		} 
    
    		private void init(Context context) {
    				LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    				inflater.inflate(R.layout.my_item, this, true);
    
    				textView = findViewById(R.id.tv_id);
    				textView2 = findViewById(R.id.tv_phone);
    		}
    
    		public void setId(String id){
    				textView.setText(id);
    		} 
    
    		public void setPhone(String phone){
    				textView2.setText(phone);
    		}
    }
    
    /*
    	MyItemView 클래스에서 인플레이션을 통해 메모리 객체화를 해야한다.
    	LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    	를 해주면 시스템 서비스를 통해 LayoutInflater를 가져다 쓴다고 정의해주고, 이를 캐스팅해서 받아준다.
    	그 뒤 inflate를 해주는데 my_item을 인플레이션 하고
    
    	현재 이 객체가 LinearLayout를 상속받았기에 최상위 레이아웃이 LinearLayout이니 this를 넣어준다.
    */
    public class MainActivity extends AppCompatActivity {
    
    		@Override
    		protected void onCreate(Bundle savedInstanceState) {
    				super.onCreate(savedInstanceState);
    				setContentView(R.layout.activity_main);
    
    				ListView listView = findViewById(R.id.lv_comment_view);
    
    				MyAdapter adapter = new MyAdapter();
    
    				adapter.addItem(new MyItem("a","123"));
    				adapter.addItem(new MyItem("bb","010-123"));
    				adapter.addItem(new MyItem("ccc","010-123-234"));
    
    				listView.setAdapter(adapter);
    		}
    		class MyAdapter extends BaseAdapter {
    				private ArrayList<MyItem> items = new ArrayList<>();
    				public void addItem(MyItem item){
    						items.add(item);
    				}
    				@Override
    				public int getCount() {
    						return items.size();
    				}
    				@Override
    				public MyItem getItem(int position) {
    						return items.get(position);
    				}
    				@Override
    				public long getItemId(int position) {
    						return position;
    				}
    				@Override
    				public View getView(final int position, final View convertView, ViewGroup parent) {
    						MyItemView view = new MyItemView(getApplicationContext());
    						MyItem item = items.get(position);
    						view.setId(item.getId());
    						view.setPhone(item.getPhone());
    						return view;
    				}
    		}
    }