Advertisement
Guest User

Untitled

a guest
May 24th, 2016
58
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.94 KB | None | 0 0
  1. public class MainActivity extends AppCompatActivity {
  2. ItemTouchHelper itemTouchHelper;
  3. RecyclerView recyclerView;
  4. TagsAdapter adapter;
  5. Realm realm;
  6.  
  7. @Override
  8. protected void onCreate(Bundle savedInstanceState) {
  9. super.onCreate(savedInstanceState);
  10. setContentView(R.layout.activity_main);
  11.  
  12. RealmConfiguration config = new RealmConfiguration.Builder(this).build();
  13. Realm.setDefaultConfiguration(config);
  14. realm = Realm.getDefaultInstance();
  15.  
  16. adapter = new TagsAdapter(realm, new OnDragStartListener() {
  17. @Override
  18. public void onDragStart(RecyclerView.ViewHolder viewHolder) {
  19. itemTouchHelper.startDrag(viewHolder);
  20. }
  21. });
  22. itemTouchHelper = new ItemTouchHelper(new TagTouchHelperCallback(adapter));
  23. recyclerView = (RecyclerView) findViewById(R.id.rv);
  24. recyclerView.setAdapter(adapter);
  25. itemTouchHelper.attachToRecyclerView(recyclerView);
  26. }
  27.  
  28. @Override
  29. public boolean onCreateOptionsMenu(Menu menu) {
  30. super.onCreateOptionsMenu(menu);
  31. getMenuInflater().inflate(R.menu.main, menu);
  32. return true;
  33. }
  34.  
  35. @Override
  36. public boolean onOptionsItemSelected(MenuItem item) {
  37. switch(item.getItemId()) {
  38. case R.id.action_add:
  39. Tag tag = new Tag();
  40. tag.setTag("#tag" + tag.getTagId());
  41. realm.beginTransaction();
  42. realm.copyToRealmOrUpdate(tag);
  43. realm.commitTransaction();
  44. adapter.notifyItemInserted(1);
  45. default:
  46. return super.onOptionsItemSelected(item);
  47. }
  48. }
  49. }
  50.  
  51. public class TagsAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> implements ItemTouchHelperAdapter {
  52. private static final int TYPE_TAG = 0;
  53. private static final int TYPE_HEADER = 1;
  54.  
  55. private Realm realm;
  56. private RealmResults<Tag> tags;
  57. private OnDragStartListener dragStartListener;
  58.  
  59. public TagsAdapter(Realm realm, OnDragStartListener dragStartListener) {
  60. this.realm = realm;
  61. this.tags = realm.where(Tag.class).findAllSorted("order", Sort.DESCENDING);
  62. this.dragStartListener = dragStartListener;
  63.  
  64. setHasStableIds(true);
  65. }
  66.  
  67. @Override
  68. public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
  69. switch(viewType) {
  70. case TYPE_TAG:
  71. View taskView = LayoutInflater.from(parent.getContext()).inflate(R.layout.item, parent, false);
  72. return new TagViewHolder(taskView);
  73. case TYPE_HEADER:
  74. View headerView = LayoutInflater.from(parent.getContext()).inflate(R.layout.item, parent, false);
  75. return new HeaderViewHolder(headerView);
  76. default:
  77. return null;
  78. }
  79. }
  80.  
  81. @Override
  82. public void onBindViewHolder(final RecyclerView.ViewHolder holder, int adapterPosition) {
  83. switch(holder.getItemViewType()) {
  84. case TYPE_TAG:
  85. onBindViewHolderTag((TagViewHolder) holder, adapterPosition);
  86. break;
  87. case TYPE_HEADER:
  88. onBindViewHolderHeader((HeaderViewHolder) holder, adapterPosition);
  89. break;
  90. default:
  91. }
  92. }
  93.  
  94. private void onBindViewHolderTag(final TagViewHolder holder, final int adapterPosition) {
  95. final Tag tag = tags.get(getDataSetPosition(adapterPosition));
  96. holder.title.setText(tag.getTag());
  97. holder.itemView.setOnClickListener(new View.OnClickListener() {
  98. @Override
  99. public void onClick(View v) {
  100. Log.d("TAGS", "item clicked: id=" + tag.getTagId() + " ; adapterPosition=" + adapterPosition + " ; datasetPosition=" + getDataSetPosition(adapterPosition));
  101. }
  102. });
  103. holder.itemView.setOnTouchListener(new View.OnTouchListener() {
  104. @Override
  105. public boolean onTouch(View v, MotionEvent event) {
  106. if(MotionEventCompat.getActionMasked(event) == MotionEvent.ACTION_DOWN) {
  107. dragStartListener.onDragStart(holder);
  108. }
  109. return false;
  110. }
  111. });
  112. }
  113.  
  114. private void onBindViewHolderHeader(HeaderViewHolder holder, int adapterPosition) {
  115. holder.header.setText("TITLE");
  116. }
  117.  
  118. private int getDataSetPosition(int adapterPosition) {
  119. switch(getItemViewType(adapterPosition)) {
  120. case TYPE_TAG:
  121. return adapterPosition - 1;
  122. case TYPE_HEADER:
  123. default:
  124. return RecyclerView.NO_POSITION;
  125. }
  126. }
  127.  
  128. @Override
  129. public int getItemCount() {
  130. return tags.size() + 1;
  131. }
  132.  
  133. @Override
  134. public long getItemId(int adapterPosition) {
  135. switch(getItemViewType(adapterPosition)) {
  136. case TYPE_TAG:
  137. return tags.get(getDataSetPosition(adapterPosition)).getTagId();
  138. case TYPE_HEADER:
  139. default:
  140. return RecyclerView.NO_ID;
  141. }
  142. }
  143.  
  144. @Override
  145. public int getItemViewType(int adapterPosition) {
  146. if(adapterPosition == 0) {
  147. return TYPE_HEADER;
  148. }
  149. return TYPE_TAG;
  150. }
  151.  
  152. @Override
  153. public boolean onItemMoved(final int fromAdapterPosition, final int toAdapterPosition) {
  154. Log.i("TAGS", "move from " + fromAdapterPosition + " to " + toAdapterPosition);
  155. if(getItemViewType(toAdapterPosition) != TYPE_TAG) {
  156. return false;
  157. }
  158.  
  159. Tag task1 = tags.get(getDataSetPosition(fromAdapterPosition));
  160. Tag task2 = tags.get(getDataSetPosition(toAdapterPosition));
  161. Log.i("TAGS", "realm pos from=" + getDataSetPosition(fromAdapterPosition) + " ; to=" + getDataSetPosition(toAdapterPosition));
  162. int order1 = task1.getOrder();
  163. realm.beginTransaction();
  164. task1.setOrder(task2.getOrder());
  165. task2.setOrder(order1);
  166. realm.copyToRealmOrUpdate(task1);
  167. realm.copyToRealmOrUpdate(task2);
  168. realm.commitTransaction();
  169. notifyItemMoved(fromAdapterPosition, toAdapterPosition);
  170. return true;
  171. }
  172.  
  173. @Override
  174. public void onItemSwiped(RecyclerView.ViewHolder holder, int direction) {}
  175.  
  176. public class TagViewHolder extends RecyclerView.ViewHolder {
  177. public final TextView title;
  178.  
  179. public TagViewHolder(View itemView) {
  180. super(itemView);
  181. this.title = (TextView) itemView.findViewById(R.id.label);
  182. }
  183. }
  184.  
  185. public class HeaderViewHolder extends RecyclerView.ViewHolder {
  186. public final TextView header;
  187.  
  188. public HeaderViewHolder(View itemView) {
  189. super(itemView);
  190. this.header = (TextView) itemView.findViewById(R.id.label);
  191. }
  192. }
  193. }
  194.  
  195. public class Tag extends RealmObject {
  196. @Ignore
  197. private final static Object nextIdLock = new Object();
  198. @Ignore
  199. private static Integer nextId;
  200.  
  201. @PrimaryKey
  202. @Required
  203. private Integer tagId;
  204. @Required
  205. private Integer order;
  206. @Required
  207. private String tag;
  208.  
  209. public Tag() {
  210. synchronized(nextIdLock) {
  211. if(nextId == null) {
  212. Realm realm = Realm.getDefaultInstance();
  213. RealmResults<Tag> tags = realm.where(Tag.class).findAll();
  214. if(tags.size() != 0) {
  215. nextId = tags.max("tagId").intValue() + 1;
  216. } else {
  217. nextId = 0;
  218. }
  219. realm.close();
  220. }
  221. order = tagId = nextId++;
  222. }
  223. }
  224.  
  225. public Integer getTagId() {
  226. return tagId;
  227. }
  228.  
  229. public Tag setTagId(Integer tagId) {
  230. this.tagId = tagId;
  231. return this;
  232. }
  233.  
  234. public Integer getOrder() {
  235. return order;
  236. }
  237.  
  238. public Tag setOrder(Integer order) {
  239. this.order = order;
  240. return this;
  241. }
  242.  
  243. public String getTag() {
  244. return tag;
  245. }
  246.  
  247. public Tag setTag(String tag) {
  248. this.tag = tag;
  249. return this;
  250. }
  251. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement