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