1eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyarpackage com.android.example.bindingdemo; 2eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar 3fead9ca09b117136b35bc5bf137340a754f9edddGeorge Mountimport android.databinding.Bindable; 46a5e8f49ed279b7ff0fe8097010ba985bf5c5ed6George Mountimport android.databinding.DataBindingUtil; 5fead9ca09b117136b35bc5bf137340a754f9edddGeorge Mountimport android.databinding.Observable; 6af516f3f11ae36cb2c5e3dfcbaad7e3f2db174cdYigit Boyarimport android.databinding.Observable.OnPropertyChangedCallback; 7eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyarimport android.support.v7.app.ActionBarActivity; 8eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyarimport android.os.Bundle; 9eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyarimport android.support.v7.widget.LinearLayoutManager; 10eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyarimport android.support.v7.widget.RecyclerView; 11eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyarimport android.view.Menu; 12eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyarimport android.view.MenuItem; 13eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyarimport android.view.View; 14eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyarimport android.view.ViewGroup; 15eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar 16fead9ca09b117136b35bc5bf137340a754f9edddGeorge Mountimport android.databinding.PropertyChangeRegistry; 172e2043d30f95585de2069e1cbb23e022ab0e71c4George Mountimport com.android.example.bindingdemo.databinding.ListItemBinding; 182e2043d30f95585de2069e1cbb23e022ab0e71c4George Mountimport com.android.example.bindingdemo.databinding.MainActivityBinding; 19eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyarimport com.android.example.bindingdemo.vo.User; 20eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyarimport com.android.example.bindingdemo.vo.Users; 21eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar 22eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyarimport java.util.ArrayList; 23eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyarimport java.util.Arrays; 24eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyarimport java.util.List; 25eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar 26a6e4583962e19e8e93b4ca3f9fe3d34560b6d96cYigit Boyarimport com.android.example.bindingdemo.BR; 27eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyarpublic class MainActivity extends ActionBarActivity implements Observable { 28b617e5da04aa910be70204afb886b1ebebb80618George Mount @Bindable 29eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar UserAdapter tkAdapter; 30b617e5da04aa910be70204afb886b1ebebb80618George Mount @Bindable 31eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar UserAdapter robotAdapter; 32b617e5da04aa910be70204afb886b1ebebb80618George Mount @Bindable 334c5cc009bcbcfb19e33fb19db5ec80f83f7b3326George Mount MainActivityBinding dataBinder; 34b617e5da04aa910be70204afb886b1ebebb80618George Mount @Bindable 35eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar User selected; 36293de28642305ce210e1d2a1cfe0abfa4f737d7aGeorge Mount 375cd681c345db8f606d7d5a8662e20e059f21a86cGeorge Mount private final PropertyChangeRegistry mListeners = new PropertyChangeRegistry(); 38eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar @Override 39eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar protected void onCreate(Bundle savedInstanceState) { 40eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar super.onCreate(savedInstanceState); 416a5e8f49ed279b7ff0fe8097010ba985bf5c5ed6George Mount dataBinder = DataBindingUtil.setContentView(this, R.layout.main_activity); 4234a18e6a231f3b64726bd93e7e097a0d5a75995dGeorge Mount dataBinder.robotList.setHasFixedSize(true); 4334a18e6a231f3b64726bd93e7e097a0d5a75995dGeorge Mount dataBinder.toolkittyList.setHasFixedSize(true); 44eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar tkAdapter = new UserAdapter(Users.toolkities); 45eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar robotAdapter = new UserAdapter(Users.robots); 4634a18e6a231f3b64726bd93e7e097a0d5a75995dGeorge Mount dataBinder.toolkittyList.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false)); 4734a18e6a231f3b64726bd93e7e097a0d5a75995dGeorge Mount dataBinder.robotList.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false)); 48eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar dataBinder.setActivity(this); 494c5cc009bcbcfb19e33fb19db5ec80f83f7b3326George Mount dataBinder.executePendingBindings(); 50eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar } 51eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar 52eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar public UserAdapter getTkAdapter() { 53eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar return tkAdapter; 54eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar } 55eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar 56eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar public UserAdapter getRobotAdapter() { 57eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar return robotAdapter; 58eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar } 59eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar 60eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar public User getSelected() { 61eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar return selected; 62eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar } 63eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar 64eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar private void setSelected(User selected) { 65eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar if (selected == this.selected) { 66eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar return; 67eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar } 68eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar this.selected = selected; 69a6e4583962e19e8e93b4ca3f9fe3d34560b6d96cYigit Boyar mListeners.notifyChange(this, BR.selected); 70eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar } 71eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar 72793e979f25e190162eacf46d6a4efc3efc1d2f91George Mount public void onSave(View v) { 73793e979f25e190162eacf46d6a4efc3efc1d2f91George Mount if (selected == null) { 74793e979f25e190162eacf46d6a4efc3efc1d2f91George Mount return; 75eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar } 76793e979f25e190162eacf46d6a4efc3efc1d2f91George Mount selected.setName(dataBinder.selectedName.getText().toString()); 77793e979f25e190162eacf46d6a4efc3efc1d2f91George Mount selected.setLastName(dataBinder.selectedLastname.getText().toString()); 78793e979f25e190162eacf46d6a4efc3efc1d2f91George Mount } 79eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar 80793e979f25e190162eacf46d6a4efc3efc1d2f91George Mount public void onUnselect (View v) { 81793e979f25e190162eacf46d6a4efc3efc1d2f91George Mount setSelected(null); 82793e979f25e190162eacf46d6a4efc3efc1d2f91George Mount } 83eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar 84793e979f25e190162eacf46d6a4efc3efc1d2f91George Mount public void onDelete(View v) { 85793e979f25e190162eacf46d6a4efc3efc1d2f91George Mount if (selected == null) { 86793e979f25e190162eacf46d6a4efc3efc1d2f91George Mount return; 87eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar } 88793e979f25e190162eacf46d6a4efc3efc1d2f91George Mount if (selected.getGroup() == User.KITTEN) { 89793e979f25e190162eacf46d6a4efc3efc1d2f91George Mount tkAdapter.remove(selected); 90793e979f25e190162eacf46d6a4efc3efc1d2f91George Mount selected.setGroup(User.ROBOT); 91793e979f25e190162eacf46d6a4efc3efc1d2f91George Mount robotAdapter.add(selected); 92793e979f25e190162eacf46d6a4efc3efc1d2f91George Mount dataBinder.robotList.smoothScrollToPosition(robotAdapter.getItemCount() - 1); 93793e979f25e190162eacf46d6a4efc3efc1d2f91George Mount } else { 94793e979f25e190162eacf46d6a4efc3efc1d2f91George Mount tkAdapter.add(selected); 95793e979f25e190162eacf46d6a4efc3efc1d2f91George Mount dataBinder.toolkittyList.smoothScrollToPosition(tkAdapter.getItemCount() - 1); 96793e979f25e190162eacf46d6a4efc3efc1d2f91George Mount selected.setGroup(User.KITTEN); 97793e979f25e190162eacf46d6a4efc3efc1d2f91George Mount robotAdapter.remove(selected); 98eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar } 99793e979f25e190162eacf46d6a4efc3efc1d2f91George Mount } 100eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar 101eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar 102eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar @Override 103eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar public boolean onCreateOptionsMenu(Menu menu) { 104eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar // Inflate the menu; this adds items to the action bar if it is present. 105eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar getMenuInflater().inflate(R.menu.menu_main, menu); 106eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar return true; 107eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar } 108eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar 109eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar @Override 110eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar public boolean onOptionsItemSelected(MenuItem item) { 111eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar // Handle action bar item clicks here. The action bar will 112eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar // automatically handle clicks on the Home/Up button, so long 113eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar // as you specify a parent activity in AndroidManifest.xml. 114eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar int id = item.getItemId(); 115eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar 116eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar //noinspection SimplifiableIfStatement 117eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar if (id == R.id.action_settings) { 118eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar return true; 119eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar } 120eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar 121eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar return super.onOptionsItemSelected(item); 122eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar } 123eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar 124eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar @Override 125af516f3f11ae36cb2c5e3dfcbaad7e3f2db174cdYigit Boyar public void addOnPropertyChangedCallback(OnPropertyChangedCallback listener) { 126293de28642305ce210e1d2a1cfe0abfa4f737d7aGeorge Mount mListeners.add(listener); 127eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar } 128eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar 129eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar @Override 130af516f3f11ae36cb2c5e3dfcbaad7e3f2db174cdYigit Boyar public void removeOnPropertyChangedCallback(OnPropertyChangedCallback listener) { 131293de28642305ce210e1d2a1cfe0abfa4f737d7aGeorge Mount mListeners.remove(listener); 132eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar } 133eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar 1344c5cc009bcbcfb19e33fb19db5ec80f83f7b3326George Mount public class UserAdapter extends DataBoundAdapter<ListItemBinding> implements View.OnClickListener, Observable { 135293de28642305ce210e1d2a1cfe0abfa4f737d7aGeorge Mount final private List<User> userList = new ArrayList<>(); 1365cd681c345db8f606d7d5a8662e20e059f21a86cGeorge Mount final private PropertyChangeRegistry mListeners = new PropertyChangeRegistry(); 137293de28642305ce210e1d2a1cfe0abfa4f737d7aGeorge Mount 138eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar public UserAdapter(User[] toolkities) { 1394c5cc009bcbcfb19e33fb19db5ec80f83f7b3326George Mount super(R.layout.list_item, ListItemBinding.class); 140eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar userList.addAll(Arrays.asList(toolkities)); 141eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar } 142eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar 143eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar @Override 1444c5cc009bcbcfb19e33fb19db5ec80f83f7b3326George Mount public DataBoundViewHolder<ListItemBinding> onCreateViewHolder(ViewGroup viewGroup, int type) { 1454c5cc009bcbcfb19e33fb19db5ec80f83f7b3326George Mount DataBoundViewHolder<ListItemBinding> vh = super.onCreateViewHolder(viewGroup, type); 146eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar vh.dataBinder.setClickListener(this); 147eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar return vh; 148eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar } 149eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar 150eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar @Override 1514c5cc009bcbcfb19e33fb19db5ec80f83f7b3326George Mount public void onBindViewHolder(DataBoundViewHolder<ListItemBinding> vh, int index) { 152eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar vh.dataBinder.setUser(userList.get(index)); 1534c5cc009bcbcfb19e33fb19db5ec80f83f7b3326George Mount vh.dataBinder.executePendingBindings(); 154eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar } 155eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar 1567bdc3517f998d167a8d2922fbe5b3ee955a75016George Mount @Bindable 157eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar @Override 158eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar public int getItemCount() { 159eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar return userList.size(); 160eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar } 161eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar 162eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar public void add(User user) { 163eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar if (userList.contains(user)) { 164eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar return; 165eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar } 166eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar userList.add(user); 167eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar notifyItemInserted(userList.size() - 1); 168a6e4583962e19e8e93b4ca3f9fe3d34560b6d96cYigit Boyar mListeners.notifyChange(this, BR.itemCount); 169eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar } 170eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar 171eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar public void remove(User user) { 172eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar int i = userList.indexOf(user); 173eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar if (i < 0) { 174eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar return; 175eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar } 176eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar userList.remove(i); 177eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar notifyItemRemoved(i); 178a6e4583962e19e8e93b4ca3f9fe3d34560b6d96cYigit Boyar mListeners.notifyChange(this, BR.itemCount); 179eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar } 180eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar 181eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar @Override 182eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar public void onClick(View v) { 183eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar RecyclerView.LayoutParams lp = (RecyclerView.LayoutParams) v.getLayoutParams(); 184658c71b9ba3211ac5c10f261a8c6f38b1916d3bfYigit Boyar final int pos = lp.getViewAdapterPosition(); 185eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar if (pos > -1 && pos < userList.size()) { 186eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar v.requestFocus(); 187eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar setSelected(userList.get(pos)); 188eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar } else { 189eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar setSelected(null); 190eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar } 191eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar } 192eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar 193eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar @Override 194af516f3f11ae36cb2c5e3dfcbaad7e3f2db174cdYigit Boyar public void addOnPropertyChangedCallback(OnPropertyChangedCallback listener) { 195293de28642305ce210e1d2a1cfe0abfa4f737d7aGeorge Mount mListeners.add(listener); 196eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar } 197eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar 198eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar @Override 199af516f3f11ae36cb2c5e3dfcbaad7e3f2db174cdYigit Boyar public void removeOnPropertyChangedCallback(OnPropertyChangedCallback listener) { 200293de28642305ce210e1d2a1cfe0abfa4f737d7aGeorge Mount mListeners.remove(listener); 201eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar } 202eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar } 203eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar} 204