MainActivity.java revision 793e979f25e190162eacf46d6a4efc3efc1d2f91
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 public void onSave(View v) { 73 if (selected == null) { 74 return; 75 } 76 selected.setName(dataBinder.selectedName.getText().toString()); 77 selected.setLastName(dataBinder.selectedLastname.getText().toString()); 78 } 79 80 public void onUnselect (View v) { 81 setSelected(null); 82 } 83 84 public void onDelete(View v) { 85 if (selected == null) { 86 return; 87 } 88 if (selected.getGroup() == User.KITTEN) { 89 tkAdapter.remove(selected); 90 selected.setGroup(User.ROBOT); 91 robotAdapter.add(selected); 92 dataBinder.robotList.smoothScrollToPosition(robotAdapter.getItemCount() - 1); 93 } else { 94 tkAdapter.add(selected); 95 dataBinder.toolkittyList.smoothScrollToPosition(tkAdapter.getItemCount() - 1); 96 selected.setGroup(User.KITTEN); 97 robotAdapter.remove(selected); 98 } 99 } 100 101 102 @Override 103 public boolean onCreateOptionsMenu(Menu menu) { 104 // Inflate the menu; this adds items to the action bar if it is present. 105 getMenuInflater().inflate(R.menu.menu_main, menu); 106 return true; 107 } 108 109 @Override 110 public boolean onOptionsItemSelected(MenuItem item) { 111 // Handle action bar item clicks here. The action bar will 112 // automatically handle clicks on the Home/Up button, so long 113 // as you specify a parent activity in AndroidManifest.xml. 114 int id = item.getItemId(); 115 116 //noinspection SimplifiableIfStatement 117 if (id == R.id.action_settings) { 118 return true; 119 } 120 121 return super.onOptionsItemSelected(item); 122 } 123 124 @Override 125 public void addOnPropertyChangedCallback(OnPropertyChangedCallback listener) { 126 mListeners.add(listener); 127 } 128 129 @Override 130 public void removeOnPropertyChangedCallback(OnPropertyChangedCallback listener) { 131 mListeners.remove(listener); 132 } 133 134 public class UserAdapter extends DataBoundAdapter<ListItemBinding> implements View.OnClickListener, Observable { 135 final private List<User> userList = new ArrayList<>(); 136 final private PropertyChangeRegistry mListeners = new PropertyChangeRegistry(); 137 138 public UserAdapter(User[] toolkities) { 139 super(R.layout.list_item, ListItemBinding.class); 140 userList.addAll(Arrays.asList(toolkities)); 141 } 142 143 @Override 144 public DataBoundViewHolder<ListItemBinding> onCreateViewHolder(ViewGroup viewGroup, int type) { 145 DataBoundViewHolder<ListItemBinding> vh = super.onCreateViewHolder(viewGroup, type); 146 vh.dataBinder.setClickListener(this); 147 return vh; 148 } 149 150 @Override 151 public void onBindViewHolder(DataBoundViewHolder<ListItemBinding> vh, int index) { 152 vh.dataBinder.setUser(userList.get(index)); 153 vh.dataBinder.executePendingBindings(); 154 } 155 156 @Bindable 157 @Override 158 public int getItemCount() { 159 return userList.size(); 160 } 161 162 public void add(User user) { 163 if (userList.contains(user)) { 164 return; 165 } 166 userList.add(user); 167 notifyItemInserted(userList.size() - 1); 168 mListeners.notifyChange(this, BR.itemCount); 169 } 170 171 public void remove(User user) { 172 int i = userList.indexOf(user); 173 if (i < 0) { 174 return; 175 } 176 userList.remove(i); 177 notifyItemRemoved(i); 178 mListeners.notifyChange(this, BR.itemCount); 179 } 180 181 @Override 182 public void onClick(View v) { 183 RecyclerView.LayoutParams lp = (RecyclerView.LayoutParams) v.getLayoutParams(); 184 final int pos = lp.getViewAdapterPosition(); 185 if (pos > -1 && pos < userList.size()) { 186 v.requestFocus(); 187 setSelected(userList.get(pos)); 188 } else { 189 setSelected(null); 190 } 191 } 192 193 @Override 194 public void addOnPropertyChangedCallback(OnPropertyChangedCallback listener) { 195 mListeners.add(listener); 196 } 197 198 @Override 199 public void removeOnPropertyChangedCallback(OnPropertyChangedCallback listener) { 200 mListeners.remove(listener); 201 } 202 } 203} 204