package com.android.example.bindingdemo;
import android.databinding.Bindable;
import android.databinding.DataBindingUtil;
import android.databinding.Observable;
import android.databinding.Observable.OnPropertyChangedCallback;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.databinding.PropertyChangeRegistry;
import com.android.example.bindingdemo.databinding.ListItemBinding;
import com.android.example.bindingdemo.databinding.MainActivityBinding;
import com.android.example.bindingdemo.vo.User;
import com.android.example.bindingdemo.vo.Users;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import com.android.example.bindingdemo.BR;
public class MainActivity extends ActionBarActivity implements Observable {
@Bindable
UserAdapter tkAdapter;
@Bindable
UserAdapter robotAdapter;
@Bindable
MainActivityBinding dataBinder;
@Bindable
User selected;
private final PropertyChangeRegistry mListeners = new PropertyChangeRegistry();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
dataBinder = DataBindingUtil.setContentView(this, R.layout.main_activity);
dataBinder.robotList.setHasFixedSize(true);
dataBinder.toolkittyList.setHasFixedSize(true);
tkAdapter = new UserAdapter(Users.toolkities);
robotAdapter = new UserAdapter(Users.robots);
dataBinder.toolkittyList.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false));
dataBinder.robotList.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false));
dataBinder.setActivity(this);
dataBinder.executePendingBindings();
}
public UserAdapter getTkAdapter() {
return tkAdapter;
}
public UserAdapter getRobotAdapter() {
return robotAdapter;
}
public User getSelected() {
return selected;
}
private void setSelected(User selected) {
if (selected == this.selected) {
return;
}
this.selected = selected;
mListeners.notifyChange(this, BR.selected);
}
@Bindable
public View.OnClickListener onSave = new View.OnClickListener() {
@Override
public void onClick(View v) {
if (selected == null) {
return;
}
selected.setName(dataBinder.selectedName.getText().toString());
selected.setLastName(dataBinder.selectedLastname.getText().toString());
}
};
@Bindable
public View.OnClickListener onUnselect = new View.OnClickListener() {
@Override
public void onClick(View v) {
setSelected(null);
}
};
@Bindable
public View.OnClickListener onDelete = new View.OnClickListener() {
@Override
public void onClick(View v) {
if (selected == null) {
return;
}
if (selected.getGroup() == User.KITTEN) {
tkAdapter.remove(selected);
selected.setGroup(User.ROBOT);
robotAdapter.add(selected);
dataBinder.robotList.smoothScrollToPosition(robotAdapter.getItemCount() - 1);
} else {
tkAdapter.add(selected);
dataBinder.toolkittyList.smoothScrollToPosition(tkAdapter.getItemCount() - 1);
selected.setGroup(User.KITTEN);
robotAdapter.remove(selected);
}
}
};
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
@Override
public void addOnPropertyChangedCallback(OnPropertyChangedCallback listener) {
mListeners.add(listener);
}
@Override
public void removeOnPropertyChangedCallback(OnPropertyChangedCallback listener) {
mListeners.remove(listener);
}
public class UserAdapter extends DataBoundAdapter<ListItemBinding> implements View.OnClickListener, Observable {
final private List<User> userList = new ArrayList<>();
final private PropertyChangeRegistry mListeners = new PropertyChangeRegistry();
public UserAdapter(User[] toolkities) {
super(R.layout.list_item, ListItemBinding.class);
userList.addAll(Arrays.asList(toolkities));
}
@Override
public DataBoundViewHolder<ListItemBinding> onCreateViewHolder(ViewGroup viewGroup, int type) {
DataBoundViewHolder<ListItemBinding> vh = super.onCreateViewHolder(viewGroup, type);
vh.dataBinder.setClickListener(this);
return vh;
}
@Override
public void onBindViewHolder(DataBoundViewHolder<ListItemBinding> vh, int index) {
vh.dataBinder.setUser(userList.get(index));
vh.dataBinder.executePendingBindings();
}
@Bindable
@Override
public int getItemCount() {
return userList.size();
}
public void add(User user) {
if (userList.contains(user)) {
return;
}
userList.add(user);
notifyItemInserted(userList.size() - 1);
mListeners.notifyChange(this, BR.itemCount);
}
public void remove(User user) {
int i = userList.indexOf(user);
if (i < 0) {
return;
}
userList.remove(i);
notifyItemRemoved(i);
mListeners.notifyChange(this, BR.itemCount);
}
@Override
public void onClick(View v) {
RecyclerView.LayoutParams lp = (RecyclerView.LayoutParams) v.getLayoutParams();
final int pos = lp.getViewAdapterPosition();
if (pos > -1 && pos < userList.size()) {
v.requestFocus();
setSelected(userList.get(pos));
} else {
setSelected(null);
}
}
@Override
public void addOnPropertyChangedCallback(OnPropertyChangedCallback listener) {
mListeners.add(listener);
}
@Override
public void removeOnPropertyChangedCallback(OnPropertyChangedCallback listener) {
mListeners.remove(listener);
}
}
}