MainActivity.java revision af516f3f11ae36cb2c5e3dfcbaad7e3f2db174cd
1package com.android.example.bindingdemo; 2 3import android.databinding.Bindable; 4import android.databinding.DataBindingUtil; 5import android.databinding.Observable; 6import android.databinding.Observable.OnPropertyChangedCallback; 7import android.support.v7.app.ActionBarActivity; 8import android.os.Bundle; 9import android.support.v7.widget.LinearLayoutManager; 10import android.support.v7.widget.RecyclerView; 11import android.view.Menu; 12import android.view.MenuItem; 13import android.view.View; 14import android.view.ViewGroup; 15 16import android.databinding.PropertyChangeRegistry; 17import com.android.example.bindingdemo.databinding.ListItemBinding; 18import com.android.example.bindingdemo.databinding.MainActivityBinding; 19import com.android.example.bindingdemo.vo.User; 20import com.android.example.bindingdemo.vo.Users; 21 22import java.util.ArrayList; 23import java.util.Arrays; 24import java.util.List; 25 26import com.android.example.bindingdemo.BR; 27public class MainActivity extends ActionBarActivity implements Observable { 28 @Bindable 29 UserAdapter tkAdapter; 30 @Bindable 31 UserAdapter robotAdapter; 32 @Bindable 33 MainActivityBinding dataBinder; 34 @Bindable 35 User selected; 36 37 private final PropertyChangeRegistry mListeners = new PropertyChangeRegistry(); 38 @Override 39 protected void onCreate(Bundle savedInstanceState) { 40 super.onCreate(savedInstanceState); 41 dataBinder = DataBindingUtil.setContentView(this, R.layout.main_activity); 42 dataBinder.robotList.setHasFixedSize(true); 43 dataBinder.toolkittyList.setHasFixedSize(true); 44 tkAdapter = new UserAdapter(Users.toolkities); 45 robotAdapter = new UserAdapter(Users.robots); 46 dataBinder.toolkittyList.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false)); 47 dataBinder.robotList.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false)); 48 dataBinder.setActivity(this); 49 dataBinder.executePendingBindings(); 50 } 51 52 public UserAdapter getTkAdapter() { 53 return tkAdapter; 54 } 55 56 public UserAdapter getRobotAdapter() { 57 return robotAdapter; 58 } 59 60 public User getSelected() { 61 return selected; 62 } 63 64 private void setSelected(User selected) { 65 if (selected == this.selected) { 66 return; 67 } 68 this.selected = selected; 69 mListeners.notifyChange(this, BR.selected); 70 } 71 72 @Bindable 73 public View.OnClickListener onSave = new View.OnClickListener() { 74 @Override 75 public void onClick(View v) { 76 if (selected == null) { 77 return; 78 } 79 selected.setName(dataBinder.selectedName.getText().toString()); 80 selected.setLastName(dataBinder.selectedLastname.getText().toString()); 81 } 82 }; 83 84 @Bindable 85 public View.OnClickListener onUnselect = new View.OnClickListener() { 86 87 @Override 88 public void onClick(View v) { 89 setSelected(null); 90 } 91 }; 92 93 @Bindable 94 public View.OnClickListener onDelete = new View.OnClickListener() { 95 @Override 96 public void onClick(View v) { 97 if (selected == null) { 98 return; 99 } 100 if (selected.getGroup() == User.KITTEN) { 101 tkAdapter.remove(selected); 102 selected.setGroup(User.ROBOT); 103 robotAdapter.add(selected); 104 dataBinder.robotList.smoothScrollToPosition(robotAdapter.getItemCount() - 1); 105 } else { 106 tkAdapter.add(selected); 107 dataBinder.toolkittyList.smoothScrollToPosition(tkAdapter.getItemCount() - 1); 108 selected.setGroup(User.KITTEN); 109 robotAdapter.remove(selected); 110 } 111 } 112 }; 113 114 115 @Override 116 public boolean onCreateOptionsMenu(Menu menu) { 117 // Inflate the menu; this adds items to the action bar if it is present. 118 getMenuInflater().inflate(R.menu.menu_main, menu); 119 return true; 120 } 121 122 @Override 123 public boolean onOptionsItemSelected(MenuItem item) { 124 // Handle action bar item clicks here. The action bar will 125 // automatically handle clicks on the Home/Up button, so long 126 // as you specify a parent activity in AndroidManifest.xml. 127 int id = item.getItemId(); 128 129 //noinspection SimplifiableIfStatement 130 if (id == R.id.action_settings) { 131 return true; 132 } 133 134 return super.onOptionsItemSelected(item); 135 } 136 137 @Override 138 public void addOnPropertyChangedCallback(OnPropertyChangedCallback listener) { 139 mListeners.add(listener); 140 } 141 142 @Override 143 public void removeOnPropertyChangedCallback(OnPropertyChangedCallback listener) { 144 mListeners.remove(listener); 145 } 146 147 public class UserAdapter extends DataBoundAdapter<ListItemBinding> implements View.OnClickListener, Observable { 148 final private List<User> userList = new ArrayList<>(); 149 final private PropertyChangeRegistry mListeners = new PropertyChangeRegistry(); 150 151 public UserAdapter(User[] toolkities) { 152 super(R.layout.list_item, ListItemBinding.class); 153 userList.addAll(Arrays.asList(toolkities)); 154 } 155 156 @Override 157 public DataBoundViewHolder<ListItemBinding> onCreateViewHolder(ViewGroup viewGroup, int type) { 158 DataBoundViewHolder<ListItemBinding> vh = super.onCreateViewHolder(viewGroup, type); 159 vh.dataBinder.setClickListener(this); 160 return vh; 161 } 162 163 @Override 164 public void onBindViewHolder(DataBoundViewHolder<ListItemBinding> vh, int index) { 165 vh.dataBinder.setUser(userList.get(index)); 166 vh.dataBinder.executePendingBindings(); 167 } 168 169 @Bindable 170 @Override 171 public int getItemCount() { 172 return userList.size(); 173 } 174 175 public void add(User user) { 176 if (userList.contains(user)) { 177 return; 178 } 179 userList.add(user); 180 notifyItemInserted(userList.size() - 1); 181 mListeners.notifyChange(this, BR.itemCount); 182 } 183 184 public void remove(User user) { 185 int i = userList.indexOf(user); 186 if (i < 0) { 187 return; 188 } 189 userList.remove(i); 190 notifyItemRemoved(i); 191 mListeners.notifyChange(this, BR.itemCount); 192 } 193 194 @Override 195 public void onClick(View v) { 196 RecyclerView.LayoutParams lp = (RecyclerView.LayoutParams) v.getLayoutParams(); 197 final int pos = lp.getViewAdapterPosition(); 198 if (pos > -1 && pos < userList.size()) { 199 v.requestFocus(); 200 setSelected(userList.get(pos)); 201 } else { 202 setSelected(null); 203 } 204 } 205 206 @Override 207 public void addOnPropertyChangedCallback(OnPropertyChangedCallback listener) { 208 mListeners.add(listener); 209 } 210 211 @Override 212 public void removeOnPropertyChangedCallback(OnPropertyChangedCallback listener) { 213 mListeners.remove(listener); 214 } 215 } 216} 217