├── settings.gradle
├── gradle
└── wrapper
│ └── gradle-wrapper.jar
├── example
├── res
│ ├── drawable-hdpi
│ │ └── ic_launcher.png
│ ├── drawable-ldpi
│ │ └── ic_launcher.png
│ ├── drawable-mdpi
│ │ └── ic_launcher.png
│ ├── drawable-xhdpi
│ │ └── ic_launcher.png
│ ├── values
│ │ ├── integers.xml
│ │ └── strings.xml
│ └── layout
│ │ ├── activity_grid.xml
│ │ └── item_grid.xml
├── build.gradle
├── AndroidManifest.xml
└── src
│ └── org
│ └── askerov
│ └── dynamicgrid
│ └── example
│ ├── CheeseDynamicAdapter.java
│ ├── GridActivity.java
│ └── Cheeses.java
├── dynamicgrid
├── res
│ └── values
│ │ ├── id.xml
│ │ └── dimens.xml
├── AndroidManifest.xml
├── build.gradle
└── src
│ └── org
│ └── askerov
│ └── dynamicgrid
│ ├── DynamicGridAdapterInterface.java
│ ├── DynamicGridUtils.java
│ ├── AbstractDynamicGridAdapter.java
│ ├── BaseDynamicGridAdapter.java
│ └── DynamicGridView.java
├── .gitignore
├── README.md
└── LICENSE
/settings.gradle:
--------------------------------------------------------------------------------
1 | include 'dynamicgrid', 'example'
--------------------------------------------------------------------------------
/gradle/wrapper/gradle-wrapper.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/askerov/DynamicGrid/HEAD/gradle/wrapper/gradle-wrapper.jar
--------------------------------------------------------------------------------
/example/res/drawable-hdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/askerov/DynamicGrid/HEAD/example/res/drawable-hdpi/ic_launcher.png
--------------------------------------------------------------------------------
/example/res/drawable-ldpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/askerov/DynamicGrid/HEAD/example/res/drawable-ldpi/ic_launcher.png
--------------------------------------------------------------------------------
/example/res/drawable-mdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/askerov/DynamicGrid/HEAD/example/res/drawable-mdpi/ic_launcher.png
--------------------------------------------------------------------------------
/example/res/drawable-xhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/askerov/DynamicGrid/HEAD/example/res/drawable-xhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/dynamicgrid/res/values/id.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
--------------------------------------------------------------------------------
/example/res/values/integers.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | 3
4 |
--------------------------------------------------------------------------------
/example/res/values/strings.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | DynamicGridExample
4 |
5 |
--------------------------------------------------------------------------------
/dynamicgrid/res/values/dimens.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | 16dp
4 |
--------------------------------------------------------------------------------
/dynamicgrid/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
6 |
7 |
10 |
11 |
12 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # built application files
2 | *.apk
3 | *.ap_
4 |
5 | # files for the dex VM
6 | *.dex
7 |
8 | # Java class files
9 | *.class
10 |
11 | # generated files
12 | bin/
13 | gen/
14 |
15 | *.properties
16 |
17 | # Eclipse project files
18 | .classpath
19 | .project
20 |
21 | .idea/
22 | build/
23 | *.iml
24 |
25 | dynamicgrid/proguard-project.txt
26 |
27 | dynamicgrid/build.xml
28 |
29 | dynamicgrid/ant.properties
30 |
31 | example/build.xml
32 |
33 | example/proguard-project.txt
34 |
35 | example/modules/
36 |
--------------------------------------------------------------------------------
/example/res/layout/activity_grid.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
7 |
8 |
14 |
15 |
--------------------------------------------------------------------------------
/dynamicgrid/build.gradle:
--------------------------------------------------------------------------------
1 | apply plugin: 'com.android.library'
2 |
3 | android {
4 | compileSdkVersion 21
5 | buildToolsVersion "21.1.1"
6 |
7 | defaultConfig {
8 | minSdkVersion 8
9 | targetSdkVersion 21
10 | }
11 |
12 | sourceSets {
13 | main {
14 | manifest.srcFile 'AndroidManifest.xml'
15 | java.srcDirs = ['src']
16 | resources.srcDirs = ['src']
17 | aidl.srcDirs = ['src']
18 | renderscript.srcDirs = ['src']
19 | res.srcDirs = ['res']
20 | assets.srcDirs = ['assets']
21 | }
22 | }
23 | }
--------------------------------------------------------------------------------
/example/build.gradle:
--------------------------------------------------------------------------------
1 | apply plugin: 'com.android.application'
2 |
3 | dependencies {
4 | compile project(':dynamicgrid')
5 | compile 'com.android.support:support-v4:19.+'
6 | }
7 |
8 | android {
9 | compileSdkVersion 21
10 | buildToolsVersion "21.1.1"
11 |
12 | sourceSets {
13 | main {
14 | manifest.srcFile 'AndroidManifest.xml'
15 | java.srcDirs = ['src']
16 | resources.srcDirs = ['src']
17 | aidl.srcDirs = ['src']
18 | renderscript.srcDirs = ['src']
19 | res.srcDirs = ['res']
20 | assets.srcDirs = ['assets']
21 | }
22 | }
23 | }
--------------------------------------------------------------------------------
/example/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
6 |
7 |
8 |
11 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
--------------------------------------------------------------------------------
/example/res/layout/item_grid.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
11 |
12 |
18 |
19 |
28 |
29 |
--------------------------------------------------------------------------------
/dynamicgrid/src/org/askerov/dynamicgrid/DynamicGridAdapterInterface.java:
--------------------------------------------------------------------------------
1 | package org.askerov.dynamicgrid;
2 |
3 | /**
4 | * Author: alex askerov
5 | * Date: 18/07/14
6 | * Time: 23:44
7 | */
8 |
9 | /**
10 | * Any adapter used with DynamicGridView must implement DynamicGridAdapterInterface.
11 | * Adapter implementation also must has stable items id.
12 | * See {@link org.askerov.dynamicgrid.AbstractDynamicGridAdapter} for stable id implementation example.
13 | */
14 |
15 | public interface DynamicGridAdapterInterface {
16 |
17 | /**
18 | * Determines how to reorder items dragged from originalPosition to newPosition
19 | */
20 | void reorderItems(int originalPosition, int newPosition);
21 |
22 | /**
23 | * @return return columns number for GridView. Need for compatibility
24 | * (@link android.widget.GridView#getNumColumns() requires api 11)
25 | */
26 | int getColumnCount();
27 |
28 | /**
29 | * Determines whether the item in the specified position can be reordered.
30 | */
31 | boolean canReorder(int position);
32 |
33 | }
34 |
--------------------------------------------------------------------------------
/dynamicgrid/src/org/askerov/dynamicgrid/DynamicGridUtils.java:
--------------------------------------------------------------------------------
1 | package org.askerov.dynamicgrid;
2 |
3 | import android.view.View;
4 |
5 | import java.util.ArrayList;
6 | import java.util.List;
7 |
8 | /**
9 | * Author: alex askerov
10 | * Date: 9/7/13
11 | * Time: 10:14 PM
12 | */
13 | public class DynamicGridUtils {
14 | /**
15 | * Delete item in list from position indexFrom and insert it to indexTwo
16 | *
17 | * @param list
18 | * @param indexFrom
19 | * @param indexTwo
20 | */
21 | public static void reorder(List list, int indexFrom, int indexTwo) {
22 | Object obj = list.remove(indexFrom);
23 | list.add(indexTwo, obj);
24 | }
25 |
26 | /**
27 | * Swap item in list at position firstIndex with item at position secondIndex
28 | *
29 | * @param list The list in which to swap the items.
30 | * @param firstIndex The position of the first item in the list.
31 | * @param secondIndex The position of the second item in the list.
32 | */
33 | public static void swap(List list, int firstIndex, int secondIndex) {
34 | Object firstObject = list.get(firstIndex);
35 | Object secondObject = list.get(secondIndex);
36 | list.set(firstIndex, secondObject);
37 | list.set(secondIndex, firstObject);
38 | }
39 |
40 | public static float getViewX(View view) {
41 | return Math.abs((view.getRight() - view.getLeft()) / 2);
42 | }
43 |
44 | public static float getViewY(View view) {
45 | return Math.abs((view.getBottom() - view.getTop()) / 2);
46 | }
47 | }
48 |
--------------------------------------------------------------------------------
/example/src/org/askerov/dynamicgrid/example/CheeseDynamicAdapter.java:
--------------------------------------------------------------------------------
1 | package org.askerov.dynamicgrid.example;
2 |
3 | /**
4 | * Author: alex askerov
5 | * Date: 9/9/13
6 | * Time: 10:52 PM
7 | */
8 |
9 | import android.content.Context;
10 | import android.view.LayoutInflater;
11 | import android.view.View;
12 | import android.view.ViewGroup;
13 | import android.widget.ImageView;
14 | import android.widget.TextView;
15 | import org.askerov.dynamicgrid.BaseDynamicGridAdapter;
16 |
17 | import java.util.List;
18 |
19 | /**
20 | * Author: alex askerov
21 | * Date: 9/7/13
22 | * Time: 10:56 PM
23 | */
24 | public class CheeseDynamicAdapter extends BaseDynamicGridAdapter {
25 | public CheeseDynamicAdapter(Context context, List> items, int columnCount) {
26 | super(context, items, columnCount);
27 | }
28 |
29 | @Override
30 | public View getView(int position, View convertView, ViewGroup parent) {
31 | CheeseViewHolder holder;
32 | if (convertView == null) {
33 | convertView = LayoutInflater.from(getContext()).inflate(R.layout.item_grid, null);
34 | holder = new CheeseViewHolder(convertView);
35 | convertView.setTag(holder);
36 | } else {
37 | holder = (CheeseViewHolder) convertView.getTag();
38 | }
39 | holder.build(getItem(position).toString());
40 | return convertView;
41 | }
42 |
43 | private class CheeseViewHolder {
44 | private TextView titleText;
45 | private ImageView image;
46 |
47 | private CheeseViewHolder(View view) {
48 | titleText = (TextView) view.findViewById(R.id.item_title);
49 | image = (ImageView) view.findViewById(R.id.item_img);
50 | }
51 |
52 | void build(String title) {
53 | titleText.setText(title);
54 | image.setImageResource(R.drawable.ic_launcher);
55 | }
56 | }
57 | }
--------------------------------------------------------------------------------
/dynamicgrid/src/org/askerov/dynamicgrid/AbstractDynamicGridAdapter.java:
--------------------------------------------------------------------------------
1 | package org.askerov.dynamicgrid;
2 |
3 | import android.widget.BaseAdapter;
4 |
5 | import java.util.HashMap;
6 | import java.util.List;
7 |
8 | /**
9 | * Author: alex askerov
10 | * Date: 9/6/13
11 | * Time: 7:43 PM
12 | */
13 |
14 |
15 | /**
16 | * Abstract adapter for {@link org.askerov.dynamicgrid.DynamicGridView} with sable items id;
17 | */
18 |
19 | public abstract class AbstractDynamicGridAdapter extends BaseAdapter implements DynamicGridAdapterInterface {
20 | public static final int INVALID_ID = -1;
21 |
22 | private int nextStableId = 0;
23 |
24 | private HashMap