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