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