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