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