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