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