├── .gitignore
├── README.md
├── adapper-example
├── build.gradle
├── proguard-rules.txt
└── src
│ └── main
│ ├── AndroidManifest.xml
│ ├── assets
│ └── databases
│ │ └── example.db
│ ├── java
│ └── com
│ │ └── scopely
│ │ └── adapper
│ │ ├── example
│ │ ├── AdaptersActivity.java
│ │ ├── BaseActivity.java
│ │ ├── BuckWildActivity.java
│ │ ├── DeadSimpleActivity.java
│ │ ├── SelectorsActivity.java
│ │ ├── Utils.java
│ │ ├── fragments
│ │ │ ├── AbstractFragment.java
│ │ │ ├── BuckWildFragment.java
│ │ │ ├── CursorFragment.java
│ │ │ ├── GroupableGridFragment.java
│ │ │ ├── GroupableListFragment.java
│ │ │ ├── HeterogeneousGroupableGridFragment.java
│ │ │ ├── RecursiveFragment.java
│ │ │ ├── SelectCursorFragment.java
│ │ │ ├── SelectGroupableListFragment.java
│ │ │ ├── SelectPopulateableListFragment.java
│ │ │ ├── SelectRecursiveFragment.java
│ │ │ └── SimpleListFragment.java
│ │ ├── objects
│ │ │ └── NameAndMood.java
│ │ └── views
│ │ │ └── NameAndMoodView.java
│ │ ├── impls
│ │ └── PopulatableProvider.java
│ │ └── interfaces
│ │ └── Populatable.java
│ └── res
│ ├── drawable-hdpi
│ └── ic_launcher.png
│ ├── drawable-mdpi
│ └── ic_launcher.png
│ ├── drawable-xhdpi
│ ├── happy.png
│ ├── ic_launcher.png
│ ├── neutral.png
│ └── sad.png
│ ├── drawable-xxhdpi
│ └── ic_launcher.png
│ ├── layout
│ ├── activity_main.xml
│ ├── fragment_list_view.xml
│ ├── fragment_simple_list.xml
│ ├── view_name_and_mood.xml
│ ├── view_single.xml
│ └── view_single_buck_wild.xml
│ ├── menu
│ ├── activity_base.xml
│ ├── fragment_animated_adapter.xml
│ ├── fragment_filterable.xml
│ └── fragment_selector.xml
│ ├── values-w820dp
│ └── dimens.xml
│ └── values
│ ├── dimens.xml
│ ├── strings.xml
│ └── styles.xml
├── adapper
├── build.gradle
├── gradle.properties
├── maven_push.gradle
└── src
│ ├── main
│ ├── AndroidManifest.xml
│ └── java
│ │ └── com
│ │ └── scopely
│ │ └── adapper
│ │ ├── adapters
│ │ ├── BaseAdapper.java
│ │ ├── CursorAdapper.java
│ │ ├── GroupableAdapper.java
│ │ ├── ListAdapper.java
│ │ ├── RecursiveAdapper.java
│ │ └── SingleViewAdapper.java
│ │ ├── extras
│ │ ├── GroupableSpanSizeLookup.java
│ │ └── InvertedSpanSizeLookup.java
│ │ ├── impls
│ │ ├── BidentifierImpl.java
│ │ ├── GroupComparatorImpl.java
│ │ ├── HashCodeIdentifier.java
│ │ ├── NaiveLookup.java
│ │ ├── TypedViewHolder.java
│ │ └── ViewProviderImpl.java
│ │ ├── interfaces
│ │ ├── Bidentifier.java
│ │ ├── FilterFunction.java
│ │ ├── GroupComparator.java
│ │ ├── GroupPositionIdentifier.java
│ │ ├── Identifier.java
│ │ ├── Lookup.java
│ │ ├── MiniOrm.java
│ │ ├── Reorderable.java
│ │ ├── SelectionManager.java
│ │ └── ViewProvider.java
│ │ ├── selection
│ │ ├── MultiSelectManager.java
│ │ └── RadioSelectManager.java
│ │ └── utils
│ │ ├── CompareUtils.java
│ │ ├── CompositeFilter.java
│ │ ├── FunctionList.java
│ │ ├── ListUtils.java
│ │ ├── SetUtils.java
│ │ └── SparseArrayUtils.java
│ └── test
│ └── java
│ └── com
│ └── scopely
│ └── adapper
│ └── utils
│ └── ListUtilsTest.java
├── build.gradle
├── gradle
└── wrapper
│ ├── gradle-wrapper.jar
│ └── gradle-wrapper.properties
├── gradlew
├── gradlew.bat
└── settings.gradle
/.gitignore:
--------------------------------------------------------------------------------
1 | # Built application files
2 | *.apk
3 | *.ap_
4 |
5 | # Files for the Dalvik VM
6 | *.dex
7 |
8 | # Java class files
9 | *.class
10 |
11 | # Generated files
12 | bin/
13 | gen/
14 |
15 | # Gradle files
16 | .gradle/
17 | build/
18 |
19 | # Local configuration file (sdk path, etc)
20 | local.properties
21 |
22 | # Proguard folder generated by Eclipse
23 | proguard/
24 |
25 | #Log Files
26 | *.log
27 |
28 |
29 | #OSX files
30 | .DS_Store
31 | .AppleDouble
32 | .LSOverride
33 |
34 | # Icon must end with two \r
35 | Icon
36 |
37 |
38 | # Thumbnails
39 | ._*
40 |
41 | # Files that might appear on external disk
42 | .Spotlight-V100
43 | .Trashes
44 |
45 | # Directories potentially created on remote AFP share
46 | .AppleDB
47 | .AppleDesktop
48 | Network Trash Folder
49 | Temporary Items
50 | .apdisk
51 |
52 |
53 | # IDEA
54 | .idea
55 | *.iml
56 |
--------------------------------------------------------------------------------
/adapper-example/build.gradle:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright 2017 Scopely, Inc.
3 | *
4 | * Licensed under the Apache License, Version 2.0 (the "License");
5 | * you may not use this file except in compliance with the License.
6 | * You may obtain a copy of the License at
7 | *
8 | * http://www.apache.org/licenses/LICENSE-2.0
9 | *
10 | * Unless required by applicable law or agreed to in writing, software
11 | * distributed under the License is distributed on an "AS IS" BASIS,
12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | * See the License for the specific language governing permissions and
14 | * limitations under the License.
15 | */
16 |
17 | buildscript {
18 | repositories {
19 | jcenter()
20 | }
21 | dependencies {
22 | classpath 'com.android.tools.build:gradle:3.0.0-alpha4'
23 | }
24 | }
25 | apply plugin: 'com.android.application'
26 |
27 | android {
28 | compileSdkVersion 25
29 | buildToolsVersion '25.0.2'
30 |
31 | defaultConfig {
32 | minSdkVersion 14
33 | targetSdkVersion 25
34 | versionCode 1
35 | versionName "1.0.0"
36 | }
37 | }
38 |
39 | dependencies {
40 | compile project(":adapper")
41 | compile 'com.android.support:support-v4:25.3.1'
42 | compile 'com.android.support:support-v13:25.3.1'
43 | compile 'com.viewpagerindicator:library:2.4.1'
44 | compile 'com.readystatesoftware.sqliteasset:sqliteassethelper:2.0.1'
45 | }
46 |
--------------------------------------------------------------------------------
/adapper-example/proguard-rules.txt:
--------------------------------------------------------------------------------
1 | # Add project specific ProGuard rules here.
2 | # By default, the flags in this file are appended to flags specified
3 | # in /Applications/Android Studio.app/sdk/tools/proguard/proguard-android.txt
4 | # You can edit the include path and order by changing the ProGuard
5 | # include property in project.properties.
6 | #
7 | # For more details, see
8 | # http://developer.android.com/guide/developing/tools/proguard.html
9 |
10 | # Add any project specific keep options here:
11 |
12 | # If your project uses WebView with JS, uncomment the following
13 | # and specify the fully qualified class name to the JavaScript interface
14 | # class:
15 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview {
16 | # public *;
17 | #}
--------------------------------------------------------------------------------
/adapper-example/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
17 |
18 |
20 |
21 |
26 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
38 |
41 |
44 |
45 |
46 |
47 |
--------------------------------------------------------------------------------
/adapper-example/src/main/assets/databases/example.db:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/scopely/adapper/edc85882549f1884fcbfa2117c41a698991c243a/adapper-example/src/main/assets/databases/example.db
--------------------------------------------------------------------------------
/adapper-example/src/main/java/com/scopely/adapper/example/AdaptersActivity.java:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright 2017 Scopely, Inc.
3 | *
4 | * Licensed under the Apache License, Version 2.0 (the "License");
5 | * you may not use this file except in compliance with the License.
6 | * You may obtain a copy of the License at
7 | *
8 | * http://www.apache.org/licenses/LICENSE-2.0
9 | *
10 | * Unless required by applicable law or agreed to in writing, software
11 | * distributed under the License is distributed on an "AS IS" BASIS,
12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | * See the License for the specific language governing permissions and
14 | * limitations under the License.
15 | */
16 |
17 | package com.scopely.adapper.example;
18 |
19 | import android.os.Bundle;
20 |
21 | import com.scopely.adapper.example.fragments.CursorFragment;
22 | import com.scopely.adapper.example.fragments.GroupableGridFragment;
23 | import com.scopely.adapper.example.fragments.GroupableListFragment;
24 | import com.scopely.adapper.example.fragments.HeterogeneousGroupableGridFragment;
25 | import com.scopely.adapper.example.fragments.RecursiveFragment;
26 | import com.scopely.adapper.example.fragments.SimpleListFragment;
27 |
28 | import java.util.Arrays;
29 |
30 |
31 | public class AdaptersActivity extends BaseActivity {
32 |
33 | @Override
34 | protected void onCreate(Bundle savedInstanceState) {
35 | fragments = Arrays.asList(new SimpleListFragment(),
36 | new GroupableListFragment(),
37 | new GroupableGridFragment(),
38 | new HeterogeneousGroupableGridFragment(),
39 | new RecursiveFragment(),
40 | new CursorFragment()
41 | );
42 | titles = Arrays.asList(
43 | title(R.string.title_section_simple_list),
44 | title(R.string.title_section_groupable_list),
45 | title(R.string.title_section_groupable_grid),
46 | title(R.string.title_section_heterogenous),
47 | title(R.string.title_section_recursive_list),
48 | title(R.string.title_section_cursor)
49 | );
50 | super.onCreate(savedInstanceState);
51 | }
52 |
53 | @Override
54 | protected int getNavigationItemId() {
55 | return R.id.menu_navigation_adapters;
56 | }
57 | }
58 |
--------------------------------------------------------------------------------
/adapper-example/src/main/java/com/scopely/adapper/example/BaseActivity.java:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright 2017 Scopely, Inc.
3 | *
4 | * Licensed under the Apache License, Version 2.0 (the "License");
5 | * you may not use this file except in compliance with the License.
6 | * You may obtain a copy of the License at
7 | *
8 | * http://www.apache.org/licenses/LICENSE-2.0
9 | *
10 | * Unless required by applicable law or agreed to in writing, software
11 | * distributed under the License is distributed on an "AS IS" BASIS,
12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | * See the License for the specific language governing permissions and
14 | * limitations under the License.
15 | */
16 |
17 | package com.scopely.adapper.example;
18 |
19 | import android.app.Activity;
20 | import android.app.Fragment;
21 | import android.app.FragmentManager;
22 | import android.content.Intent;
23 | import android.os.Bundle;
24 | import android.support.annotation.NonNull;
25 | import android.support.v13.app.FragmentPagerAdapter;
26 | import android.support.v4.view.ViewPager;
27 | import android.view.Menu;
28 | import android.view.MenuInflater;
29 | import android.view.MenuItem;
30 |
31 | import com.viewpagerindicator.TitlePageIndicator;
32 |
33 | import java.util.List;
34 |
35 | public abstract class BaseActivity extends Activity {
36 | SectionsPagerAdapter mSectionsPagerAdapter;
37 | ViewPager mViewPager;
38 | List extends Fragment> fragments;
39 | List extends CharSequence> titles;
40 |
41 | @Override
42 | protected void onCreate(Bundle savedInstanceState) {
43 | super.onCreate(savedInstanceState);
44 | getActionBar().setDisplayShowHomeEnabled(false);
45 | getActionBar().setDisplayShowTitleEnabled(false);
46 | setContentView(R.layout.activity_main);
47 |
48 | // Create the adapter that will return a fragment for each of the three
49 | // primary sections of the activity.
50 | mSectionsPagerAdapter = new SectionsPagerAdapter(getFragmentManager());
51 |
52 | // Set up the ViewPager with the sections adapter.
53 | mViewPager = (ViewPager) findViewById(R.id.pager);
54 | mViewPager.setAdapter(mSectionsPagerAdapter);
55 |
56 | TitlePageIndicator mViewPagerIndicator = (TitlePageIndicator) findViewById(R.id.titles);
57 | mViewPagerIndicator.setViewPager(mViewPager);
58 | mViewPagerIndicator.setTextColor(getResources().getColor(android.R.color.holo_blue_bright));
59 | mViewPagerIndicator.setSelectedColor(getResources().getColor(android.R.color.holo_blue_bright));
60 | }
61 |
62 |
63 | /**
64 | * A {@link android.support.v13.app.FragmentPagerAdapter} that returns a fragment corresponding to
65 | * one of the sections/tabs/pages.
66 | */
67 | public class SectionsPagerAdapter extends FragmentPagerAdapter {
68 |
69 | public SectionsPagerAdapter(FragmentManager fm) {
70 | super(fm);
71 | }
72 |
73 | @Override
74 | public Fragment getItem(int position) {
75 | return fragments.get(position);
76 | }
77 |
78 | @Override
79 | public int getCount() {
80 | return fragments.size();
81 | }
82 |
83 | @Override
84 | public CharSequence getPageTitle(int position) {
85 | return titles.get(position);
86 | }
87 | }
88 |
89 | @Override
90 | public boolean onMenuItemSelected(int featureId, @NonNull MenuItem item) {
91 | if(item.getItemId() == R.id.menu_navigation_adapters) {
92 | startActivity(new Intent(this, AdaptersActivity.class).addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT));
93 | return true;
94 | } else if (item.getItemId() == R.id.menu_navigation_selectors){
95 | startActivity(new Intent(this, SelectorsActivity.class).addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT));
96 | return true;
97 | } else if (item.getItemId() == R.id.menu_navigation_buck_wild){
98 | startActivity(new Intent(this, BuckWildActivity.class).addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT));
99 | return true;
100 | } else if (item.getItemId() == R.id.menu_navigation_dead_simple){
101 | startActivity(new Intent(this, DeadSimpleActivity.class).addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT));
102 | return true;
103 | } else
104 | return super.onMenuItemSelected(featureId, item);
105 | }
106 |
107 | @Override
108 | public boolean onCreateOptionsMenu(Menu menu) {
109 | MenuInflater inflater = getMenuInflater();
110 | inflater.inflate(R.menu.activity_base, menu);
111 | menu.findItem(getNavigationItemId()).setVisible(false);
112 | return true;
113 | }
114 |
115 | protected CharSequence title(int id) {
116 | return getString(id);
117 | }
118 |
119 | protected abstract int getNavigationItemId();
120 | }
121 |
--------------------------------------------------------------------------------
/adapper-example/src/main/java/com/scopely/adapper/example/BuckWildActivity.java:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright 2017 Scopely, Inc.
3 | *
4 | * Licensed under the Apache License, Version 2.0 (the "License");
5 | * you may not use this file except in compliance with the License.
6 | * You may obtain a copy of the License at
7 | *
8 | * http://www.apache.org/licenses/LICENSE-2.0
9 | *
10 | * Unless required by applicable law or agreed to in writing, software
11 | * distributed under the License is distributed on an "AS IS" BASIS,
12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | * See the License for the specific language governing permissions and
14 | * limitations under the License.
15 | */
16 |
17 | package com.scopely.adapper.example;
18 |
19 | import android.os.Bundle;
20 |
21 | import com.scopely.adapper.example.fragments.BuckWildFragment;
22 |
23 | import java.util.Arrays;
24 |
25 |
26 | public class BuckWildActivity extends BaseActivity {
27 |
28 | @Override
29 | protected void onCreate(Bundle savedInstanceState) {
30 | fragments = Arrays.asList(
31 | new BuckWildFragment()
32 | );
33 | titles = Arrays.asList(
34 | title(R.string.title_section_buck_wild)
35 | );
36 | super.onCreate(savedInstanceState);
37 | }
38 |
39 | @Override
40 | protected int getNavigationItemId() {
41 | return R.id.menu_navigation_buck_wild;
42 | }
43 | }
44 |
--------------------------------------------------------------------------------
/adapper-example/src/main/java/com/scopely/adapper/example/DeadSimpleActivity.java:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright 2017 Scopely, Inc.
3 | *
4 | * Licensed under the Apache License, Version 2.0 (the "License");
5 | * you may not use this file except in compliance with the License.
6 | * You may obtain a copy of the License at
7 | *
8 | * http://www.apache.org/licenses/LICENSE-2.0
9 | *
10 | * Unless required by applicable law or agreed to in writing, software
11 | * distributed under the License is distributed on an "AS IS" BASIS,
12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | * See the License for the specific language governing permissions and
14 | * limitations under the License.
15 | */
16 |
17 | package com.scopely.adapper.example;
18 |
19 | import android.app.Activity;
20 | import android.content.Intent;
21 | import android.os.Bundle;
22 | import android.support.annotation.NonNull;
23 | import android.support.annotation.Nullable;
24 | import android.support.v7.widget.LinearLayoutManager;
25 | import android.support.v7.widget.RecyclerView;
26 | import android.view.Menu;
27 | import android.view.MenuInflater;
28 | import android.view.MenuItem;
29 | import android.widget.TextView;
30 |
31 | import com.scopely.adapper.adapters.ListAdapper;
32 | import com.scopely.adapper.impls.ViewProviderImpl;
33 | import com.scopely.adapper.interfaces.SelectionManager;
34 | import com.scopely.adapper.interfaces.ViewProvider;
35 |
36 | import java.util.Arrays;
37 | import java.util.List;
38 |
39 |
40 | public class DeadSimpleActivity extends Activity {
41 | @Override
42 | protected void onCreate(Bundle savedInstanceState) {
43 | super.onCreate(savedInstanceState);
44 |
45 | List list = Arrays.asList("First", "Second", "Third", "Fourth", "Fifth", "Sixth", "Seventh", "Eighth", "Ninth", "Tenth",
46 | "Eleventh", "Twelfth", "Thirteenth", "Fourteenth", "Fifteenth", "Sixteenth", "Seventeenth", "Eighteenth", "Nineteenth", "Twentieth");
47 |
48 | RecyclerView view = new RecyclerView(this);
49 | view.setLayoutManager(new LinearLayoutManager(this));
50 | setContentView(view);
51 |
52 | ViewProvider provider = new ViewProviderImpl(android.R.layout.simple_list_item_1) {
53 | @Override
54 | protected void bind(TextView view, String s, int position, @Nullable SelectionManager selectionManager) {
55 | view.setText(s);
56 | }
57 |
58 | @Override
59 | public int getViewType(String s) {
60 | return android.R.layout.simple_list_item_1;
61 | }
62 | };
63 |
64 | RecyclerView.Adapter adapter = new ListAdapper<>(list, provider);
65 | view.setAdapter(adapter);
66 | }
67 |
68 |
69 |
70 |
71 | //-----------------------------------------Navigation-----------------------------------------
72 | @Override
73 | public boolean onCreateOptionsMenu(Menu menu) {
74 | MenuInflater inflater = getMenuInflater();
75 | inflater.inflate(R.menu.activity_base, menu);
76 | menu.findItem(R.id.menu_navigation_dead_simple).setVisible(false);
77 | return true;
78 | }
79 |
80 | @Override
81 | public boolean onMenuItemSelected(int featureId, @NonNull MenuItem item) {
82 | if(item.getItemId() == R.id.menu_navigation_adapters) {
83 | startActivity(new Intent(this, AdaptersActivity.class).addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT));
84 | return true;
85 | } else if (item.getItemId() == R.id.menu_navigation_selectors){
86 | startActivity(new Intent(this, SelectorsActivity.class).addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT));
87 | return true;
88 | } else if (item.getItemId() == R.id.menu_navigation_buck_wild){
89 | startActivity(new Intent(this, BuckWildActivity.class).addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT));
90 | return true;
91 | } else
92 | return super.onMenuItemSelected(featureId, item);
93 | }
94 | //---------------------------------------End Navigation---------------------------------------
95 | }
96 |
--------------------------------------------------------------------------------
/adapper-example/src/main/java/com/scopely/adapper/example/SelectorsActivity.java:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright 2017 Scopely, Inc.
3 | *
4 | * Licensed under the Apache License, Version 2.0 (the "License");
5 | * you may not use this file except in compliance with the License.
6 | * You may obtain a copy of the License at
7 | *
8 | * http://www.apache.org/licenses/LICENSE-2.0
9 | *
10 | * Unless required by applicable law or agreed to in writing, software
11 | * distributed under the License is distributed on an "AS IS" BASIS,
12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | * See the License for the specific language governing permissions and
14 | * limitations under the License.
15 | */
16 |
17 | package com.scopely.adapper.example;
18 |
19 | import android.os.Bundle;
20 |
21 | import com.scopely.adapper.example.fragments.SelectCursorFragment;
22 | import com.scopely.adapper.example.fragments.SelectGroupableListFragment;
23 | import com.scopely.adapper.example.fragments.SelectPopulateableListFragment;
24 | import com.scopely.adapper.example.fragments.SelectRecursiveFragment;
25 |
26 | import java.util.Arrays;
27 |
28 |
29 | public class SelectorsActivity extends BaseActivity {
30 |
31 | @Override
32 | protected void onCreate(Bundle savedInstanceState) {
33 | fragments = Arrays.asList(
34 | new SelectPopulateableListFragment(),
35 | new SelectGroupableListFragment(),
36 | new SelectRecursiveFragment(),
37 | new SelectCursorFragment()
38 | );
39 | titles = Arrays.asList(
40 | title(R.string.title_section_radio_selection),
41 | title(R.string.title_section_multi_selection),
42 | title(R.string.title_section_limited_selection),
43 | title(R.string.title_section_cursor)
44 | );
45 | super.onCreate(savedInstanceState);
46 | }
47 |
48 | @Override
49 | protected int getNavigationItemId() {
50 | return R.id.menu_navigation_selectors;
51 | }
52 | }
53 |
--------------------------------------------------------------------------------
/adapper-example/src/main/java/com/scopely/adapper/example/Utils.java:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright 2017 Scopely, Inc.
3 | *
4 | * Licensed under the Apache License, Version 2.0 (the "License");
5 | * you may not use this file except in compliance with the License.
6 | * You may obtain a copy of the License at
7 | *
8 | * http://www.apache.org/licenses/LICENSE-2.0
9 | *
10 | * Unless required by applicable law or agreed to in writing, software
11 | * distributed under the License is distributed on an "AS IS" BASIS,
12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | * See the License for the specific language governing permissions and
14 | * limitations under the License.
15 | */
16 |
17 | package com.scopely.adapper.example;
18 |
19 | import com.scopely.adapper.example.objects.NameAndMood;
20 |
21 | import java.util.ArrayList;
22 | import java.util.List;
23 |
24 | public class Utils {
25 | public static List generateNameAndMoodList(int size) {
26 | List list = new ArrayList<>();
27 | for(int i = 0; i < size; i++) {
28 | String name = "Unique Name #" + i;
29 | NameAndMood.Mood[] moods = NameAndMood.Mood.values();
30 | NameAndMood.Mood mood = moods[i % moods.length];
31 | list.add(new NameAndMood(mood, name));
32 | }
33 | return list;
34 | }
35 |
36 | public static List generateStringList(int size) {
37 | List list = new ArrayList<>();
38 | for(int i = 0; i < size; i++) {
39 | list.add("Item #" + i);
40 | }
41 | return list;
42 | }
43 | }
44 |
--------------------------------------------------------------------------------
/adapper-example/src/main/java/com/scopely/adapper/example/fragments/AbstractFragment.java:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright 2017 Scopely, Inc.
3 | *
4 | * Licensed under the Apache License, Version 2.0 (the "License");
5 | * you may not use this file except in compliance with the License.
6 | * You may obtain a copy of the License at
7 | *
8 | * http://www.apache.org/licenses/LICENSE-2.0
9 | *
10 | * Unless required by applicable law or agreed to in writing, software
11 | * distributed under the License is distributed on an "AS IS" BASIS,
12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | * See the License for the specific language governing permissions and
14 | * limitations under the License.
15 | */
16 |
17 | package com.scopely.adapper.example.fragments;
18 |
19 |
20 | import android.app.Fragment;
21 | import android.os.Bundle;
22 | import android.support.v7.widget.LinearLayoutManager;
23 | import android.support.v7.widget.RecyclerView;
24 | import android.view.LayoutInflater;
25 | import android.view.Menu;
26 | import android.view.MenuInflater;
27 | import android.view.MenuItem;
28 | import android.view.View;
29 | import android.view.ViewGroup;
30 | import android.widget.Filterable;
31 | import android.widget.SearchView;
32 | import android.widget.Toast;
33 |
34 | import com.scopely.adapper.adapters.BaseAdapper;
35 | import com.scopely.adapper.example.R;
36 |
37 | import java.util.Arrays;
38 | import java.util.HashSet;
39 | import java.util.Set;
40 |
41 | /**
42 | * A simple {@link Fragment} subclass.
43 | *
44 | */
45 | public abstract class AbstractFragment extends Fragment {
46 | protected final static Set MENU_ITEMS_ANIMATION = new HashSet<>(Arrays.asList(R.id.menu_add, R.id.menu_subtract, R.id.menu_reorder));
47 | protected final static Set MENU_ITEMS_SELECT = new HashSet<>(Arrays.asList(R.id.action_clear, R.id.action_describe));
48 | protected final static Set MENU_ITEMS_SEARCH = new HashSet<>(Arrays.asList(R.id.action_search));
49 | private final Set MENU_ITEMS = new HashSet<>(combine(getActionSets()));
50 |
51 | protected abstract Set[] getActionSets();
52 |
53 | protected RecyclerView recyclerView;
54 | protected T adapter;
55 |
56 | public AbstractFragment() {
57 | // Required empty public constructor
58 | }
59 |
60 | @Override
61 | public void onCreate(Bundle savedInstanceState) {
62 | super.onCreate(savedInstanceState);
63 | setHasOptionsMenu(true);
64 | }
65 |
66 |
67 | @Override
68 | public View onCreateView(LayoutInflater inflater, ViewGroup container,
69 | Bundle savedInstanceState) {
70 | View root = inflater.inflate(R.layout.fragment_simple_list, container, false);
71 | recyclerView = (RecyclerView) root.findViewById(R.id.listView);
72 | recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
73 | adapter = createAdapter();
74 | recyclerView.setAdapter(adapter);
75 | return root;
76 | }
77 |
78 | protected abstract T createAdapter();
79 |
80 | @Override
81 | public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
82 | super.onCreateOptionsMenu(menu, inflater);
83 | inflater.inflate(R.menu.fragment_filterable, menu);
84 | final MenuItem item = menu.findItem(R.id.action_search);
85 | final SearchView searchItem = (SearchView) item.getActionView();
86 | searchItem.setQueryHint(getActivity().getString(R.string.filter));
87 | searchItem.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
88 | @Override
89 | public boolean onQueryTextSubmit(String s) {
90 | return false;
91 | }
92 |
93 | @Override
94 | public boolean onQueryTextChange(String s) {
95 | if(adapter != null && adapter instanceof Filterable){
96 | ((Filterable) adapter).getFilter().filter(s);
97 | }
98 | return true;
99 | }
100 | });
101 |
102 | inflater.inflate(R.menu.fragment_selector, menu);
103 | inflater.inflate(R.menu.fragment_animated_adapter, menu);
104 |
105 | for(Set set : new Set[]{MENU_ITEMS_ANIMATION, MENU_ITEMS_SEARCH, MENU_ITEMS_SELECT}) {
106 | for (int integer : set) {
107 | if (!MENU_ITEMS.contains(integer)) {
108 | menu.findItem(integer).setVisible(false);
109 | }
110 | }
111 | }
112 | }
113 |
114 | @Override
115 | public boolean onOptionsItemSelected(MenuItem item) {
116 | if(item.getItemId() == R.id.action_clear){
117 | clear();
118 | return true;
119 | }
120 | if(item.getItemId() == R.id.action_describe){
121 | describe();
122 | return true;
123 | }
124 | if(item.getItemId() == R.id.menu_add){
125 | add();
126 | adapter.update();
127 | return true;
128 | }
129 | if(item.getItemId() == R.id.menu_subtract){
130 | remove();
131 | adapter.update();
132 | return true;
133 | }
134 | if(item.getItemId() == R.id.menu_reorder){
135 | reorder();
136 | adapter.update();
137 | return true;
138 | }
139 | return super.onOptionsItemSelected(item);
140 | }
141 |
142 | protected void describe(){
143 | Set set = adapter.getSelections();
144 | StringBuilder builder = new StringBuilder();
145 | if(!set.isEmpty()) {
146 | builder.append("Currently selected: \n");
147 | boolean first = true;
148 | for (Object object : set) {
149 | if (!first) {
150 | builder.append(",\n");
151 | }
152 | first = false;
153 | builder.append(object.toString());
154 | }
155 | } else {
156 | builder.append("None selected");
157 | }
158 | Toast.makeText(getActivity(), builder, Toast.LENGTH_LONG).show();
159 | }
160 |
161 | private void clear() {
162 | adapter.clearSelections();
163 | adapter.notifyDataSetChanged();
164 | }
165 |
166 | private Set combine(Set... sets) {
167 | HashSet combined = new HashSet<>();
168 | for(Set set : sets) {
169 | combined.addAll(set);
170 | }
171 | return combined;
172 | }
173 |
174 | protected void reorder(){};
175 |
176 | protected void add(){};
177 |
178 | protected void remove(){};
179 |
180 | }
181 |
--------------------------------------------------------------------------------
/adapper-example/src/main/java/com/scopely/adapper/example/fragments/CursorFragment.java:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright 2017 Scopely, Inc.
3 | *
4 | * Licensed under the Apache License, Version 2.0 (the "License");
5 | * you may not use this file except in compliance with the License.
6 | * You may obtain a copy of the License at
7 | *
8 | * http://www.apache.org/licenses/LICENSE-2.0
9 | *
10 | * Unless required by applicable law or agreed to in writing, software
11 | * distributed under the License is distributed on an "AS IS" BASIS,
12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | * See the License for the specific language governing permissions and
14 | * limitations under the License.
15 | */
16 |
17 | package com.scopely.adapper.example.fragments;
18 |
19 | import android.database.Cursor;
20 | import android.database.sqlite.SQLiteDatabase;
21 | import android.os.Bundle;
22 | import android.support.annotation.Nullable;
23 | import android.widget.FilterQueryProvider;
24 |
25 | import com.readystatesoftware.sqliteasset.SQLiteAssetHelper;
26 | import com.scopely.adapper.adapters.CursorAdapper;
27 | import com.scopely.adapper.example.R;
28 | import com.scopely.adapper.example.objects.NameAndMood;
29 | import com.scopely.adapper.example.views.NameAndMoodView;
30 | import com.scopely.adapper.impls.PopulatableProvider;
31 | import com.scopely.adapper.interfaces.MiniOrm;
32 | import com.scopely.adapper.interfaces.ViewProvider;
33 |
34 | import java.util.Set;
35 |
36 | public class CursorFragment extends AbstractFragment {
37 |
38 | public static final String TABLE_NAME = "name";
39 | public static final String COLUMN_NAME_ID = "_id";
40 | private SQLiteDatabase db;
41 |
42 | @Override
43 | public void onCreate(Bundle savedInstanceState) {
44 | super.onCreate(savedInstanceState);
45 | db = new SQLiteAssetHelper(getActivity(), "example.db", null, 1) {}
46 | .getReadableDatabase();
47 | }
48 |
49 | @Override
50 | public void onDestroy() {
51 | db.close();
52 | super.onDestroy();
53 | }
54 |
55 | @Override
56 | protected CursorAdapper createAdapter() {
57 | ViewProvider provider = new PopulatableProvider(R.layout.view_name_and_mood) {
58 | @Override
59 | public int getViewType(NameAndMood s) {
60 | return R.layout.view_name_and_mood;
61 | }
62 | };
63 |
64 | final Cursor cursor = query(db, null);
65 |
66 | MiniOrm miniOrm = new MiniOrm() {
67 | @Override
68 | public NameAndMood getObject(Cursor c) {
69 | NameAndMood.Mood mood = NameAndMood.Mood.valueOf(c.getString(c.getColumnIndex("mood")));
70 | String name = c.getString(c.getColumnIndex("name"));
71 | return new NameAndMood(mood, name);
72 | }
73 | };
74 | CursorAdapper.CursorIdentifier identifier = new CursorAdapper.ColumnIdentifier(COLUMN_NAME_ID);
75 | CursorAdapper.CursorLookup lookup = new CursorAdapper.ColumnLookup<>(db, TABLE_NAME, COLUMN_NAME_ID);
76 | final CursorAdapper adapter = new CursorAdapper<>(cursor, identifier, lookup, miniOrm, provider);
77 | adapter.setFilterQueryProvider(new FilterQueryProvider() {
78 | @Override
79 | public Cursor runQuery(CharSequence constraint) {
80 | return query(db, constraint);
81 | }
82 | });
83 | return adapter;
84 | }
85 |
86 | private Cursor query(SQLiteDatabase db, @Nullable CharSequence constraint) {
87 | String selection = constraint != null && constraint.length() > 0 ? "name LIKE '%" + constraint.toString() + "%'" : null;
88 | return db.query(TABLE_NAME, null, selection, null, null, null, null);
89 | }
90 |
91 | @Override
92 | protected Set[] getActionSets() {
93 | return new Set[]{MENU_ITEMS_SEARCH};
94 | }
95 |
96 | }
97 |
--------------------------------------------------------------------------------
/adapper-example/src/main/java/com/scopely/adapper/example/fragments/GroupableGridFragment.java:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright 2017 Scopely, Inc.
3 | *
4 | * Licensed under the Apache License, Version 2.0 (the "License");
5 | * you may not use this file except in compliance with the License.
6 | * You may obtain a copy of the License at
7 | *
8 | * http://www.apache.org/licenses/LICENSE-2.0
9 | *
10 | * Unless required by applicable law or agreed to in writing, software
11 | * distributed under the License is distributed on an "AS IS" BASIS,
12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | * See the License for the specific language governing permissions and
14 | * limitations under the License.
15 | */
16 |
17 | package com.scopely.adapper.example.fragments;
18 |
19 |
20 | import android.app.Fragment;
21 | import android.os.Bundle;
22 | import android.support.annotation.Nullable;
23 | import android.support.v7.widget.GridLayoutManager;
24 | import android.view.Gravity;
25 | import android.view.LayoutInflater;
26 | import android.view.View;
27 | import android.view.ViewGroup;
28 | import android.widget.TextView;
29 | import android.widget.Toast;
30 |
31 | import com.scopely.adapper.adapters.GroupableAdapper;
32 | import com.scopely.adapper.example.R;
33 | import com.scopely.adapper.example.Utils;
34 | import com.scopely.adapper.example.objects.NameAndMood;
35 | import com.scopely.adapper.example.views.NameAndMoodView;
36 | import com.scopely.adapper.extras.GroupableSpanSizeLookup;
37 | import com.scopely.adapper.impls.GroupComparatorImpl;
38 | import com.scopely.adapper.impls.PopulatableProvider;
39 | import com.scopely.adapper.impls.ViewProviderImpl;
40 | import com.scopely.adapper.interfaces.FilterFunction;
41 | import com.scopely.adapper.interfaces.GroupComparator;
42 | import com.scopely.adapper.interfaces.ViewProvider;
43 | import com.scopely.adapper.interfaces.SelectionManager;
44 |
45 | import java.util.List;
46 | import java.util.Set;
47 |
48 | /**
49 | * A simple {@link Fragment} subclass.
50 | *
51 | */
52 | public class GroupableGridFragment extends AbstractFragment {
53 | public static final int ITEMS_PER_ROW = 3;
54 | private int count = 21;
55 | private List list = Utils.generateNameAndMoodList(count);
56 |
57 | @Override
58 | protected GroupableAdapper createAdapter() {
59 | ViewProvider provider = new PopulatableProvider(R.layout.view_name_and_mood) {
60 | @Override
61 | public int getViewType(NameAndMood s) {
62 | return R.layout.view_name_and_mood;
63 | }
64 |
65 | };
66 |
67 | GroupComparator comparator = new GroupComparatorImpl() {
68 | @Override
69 | public NameAndMood.Mood getGroup(NameAndMood nameAndMood) {
70 | return nameAndMood.mood;
71 | }
72 |
73 | @Override
74 | protected int groupCompare(NameAndMood.Mood lhs, NameAndMood.Mood rhs) {
75 | return lhs.compareTo(rhs);
76 | }
77 |
78 | @Override
79 | protected int itemCompare(NameAndMood lhs, NameAndMood rhs) {
80 | return lhs.name.compareTo(rhs.name);
81 | }
82 | };
83 |
84 | ViewProvider groupProvider = new ViewProviderImpl(android.R.layout.simple_list_item_1) {
85 | @Override
86 | public int getViewType(NameAndMood.Mood mood) {
87 | return android.R.layout.simple_list_item_1;
88 | }
89 |
90 | @Override
91 | protected void bind(TextView view, NameAndMood.Mood mood, int position, @Nullable SelectionManager selectionManager) {
92 | view.setGravity(Gravity.CENTER_HORIZONTAL);
93 | view.setText(mood.toString());
94 | }
95 | };
96 |
97 |
98 | GroupableAdapper groupableAdapter = new GroupableAdapper<>(list, provider, comparator, groupProvider);
99 | groupableAdapter.setFilterFunction(new FilterFunction() {
100 | @Override
101 | public boolean filter(NameAndMood item, @Nullable CharSequence constraint) {
102 | return constraint != null && item.name.contains(constraint);
103 | }
104 | });
105 | return groupableAdapter;
106 | }
107 |
108 | @Override
109 | public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
110 | View view = super.onCreateView(inflater, container, savedInstanceState);
111 | GroupableSpanSizeLookup spanSizeLookup = new GroupableSpanSizeLookup(adapter, ITEMS_PER_ROW);
112 | GridLayoutManager manager = new GridLayoutManager(inflater.getContext(), spanSizeLookup.getRequiredSpans());
113 | manager.setSpanSizeLookup(spanSizeLookup);
114 | recyclerView.setLayoutManager(manager);
115 | return view;
116 | }
117 |
118 | @Override
119 | protected void reorder() {
120 | Toast.makeText(getActivity(), "Groupables are naturally sorted, reordering is not possible", Toast.LENGTH_LONG).show();
121 | }
122 |
123 | @Override
124 | protected void add() {
125 | list.add(getFirstVisibleItemPosition(), new NameAndMood(NameAndMood.Mood.random(), "Just added #" + count));
126 | count++;
127 | }
128 |
129 | @Override
130 | protected void remove() {
131 | if(list.isEmpty()){
132 | Toast.makeText(getActivity(), "List is empty", Toast.LENGTH_SHORT).show();
133 | return;
134 | }
135 | list.remove(getFirstVisibleItemPosition());
136 | }
137 |
138 | private int getFirstVisibleItemPosition() {
139 | return ((GridLayoutManager)recyclerView.getLayoutManager()).findFirstCompletelyVisibleItemPosition();
140 | }
141 |
142 | private int getLastVisibleItemPosition() {
143 | return ((GridLayoutManager)recyclerView.getLayoutManager()).findLastCompletelyVisibleItemPosition();
144 | }
145 |
146 | @Override
147 | protected Set[] getActionSets() {
148 | return new Set[]{MENU_ITEMS_SEARCH, MENU_ITEMS_ANIMATION};
149 | }
150 | }
151 |
--------------------------------------------------------------------------------
/adapper-example/src/main/java/com/scopely/adapper/example/fragments/GroupableListFragment.java:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright 2017 Scopely, Inc.
3 | *
4 | * Licensed under the Apache License, Version 2.0 (the "License");
5 | * you may not use this file except in compliance with the License.
6 | * You may obtain a copy of the License at
7 | *
8 | * http://www.apache.org/licenses/LICENSE-2.0
9 | *
10 | * Unless required by applicable law or agreed to in writing, software
11 | * distributed under the License is distributed on an "AS IS" BASIS,
12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | * See the License for the specific language governing permissions and
14 | * limitations under the License.
15 | */
16 |
17 | package com.scopely.adapper.example.fragments;
18 |
19 |
20 | import android.app.Fragment;
21 | import android.support.annotation.Nullable;
22 | import android.support.v7.widget.LinearLayoutManager;
23 | import android.widget.TextView;
24 | import android.widget.Toast;
25 |
26 | import com.scopely.adapper.adapters.GroupableAdapper;
27 | import com.scopely.adapper.example.R;
28 | import com.scopely.adapper.example.Utils;
29 | import com.scopely.adapper.example.objects.NameAndMood;
30 | import com.scopely.adapper.example.views.NameAndMoodView;
31 | import com.scopely.adapper.impls.GroupComparatorImpl;
32 | import com.scopely.adapper.impls.PopulatableProvider;
33 | import com.scopely.adapper.impls.ViewProviderImpl;
34 | import com.scopely.adapper.interfaces.FilterFunction;
35 | import com.scopely.adapper.interfaces.GroupComparator;
36 | import com.scopely.adapper.interfaces.ViewProvider;
37 | import com.scopely.adapper.interfaces.SelectionManager;
38 |
39 | import java.util.List;
40 | import java.util.Set;
41 |
42 | /**
43 | * A simple {@link Fragment} subclass.
44 | *
45 | */
46 | public class GroupableListFragment extends AbstractFragment {
47 |
48 | private int count = 9;
49 | private List list = Utils.generateNameAndMoodList(count);
50 |
51 | @Override
52 | protected GroupableAdapper createAdapter() {
53 | ViewProvider provider = new PopulatableProvider(R.layout.view_name_and_mood) {
54 | @Override
55 | public int getViewType(NameAndMood s) {
56 | return R.layout.view_name_and_mood;
57 | }
58 |
59 | };
60 |
61 | GroupComparator comparator = new GroupComparatorImpl() {
62 | @Override
63 | public NameAndMood.Mood getGroup(NameAndMood nameAndMood) {
64 | return nameAndMood.mood;
65 | }
66 |
67 | @Override
68 | protected int groupCompare(NameAndMood.Mood lhs, NameAndMood.Mood rhs) {
69 | return lhs.compareTo(rhs);
70 | }
71 |
72 | @Override
73 | protected int itemCompare(NameAndMood lhs, NameAndMood rhs) {
74 | return lhs.name.compareTo(rhs.name);
75 | }
76 | };
77 |
78 | ViewProvider groupProvider = new ViewProviderImpl(android.R.layout.simple_list_item_1) {
79 | @Override
80 | public int getViewType(NameAndMood.Mood mood) {
81 | return android.R.layout.simple_list_item_1;
82 | }
83 |
84 | @Override
85 | protected void bind(TextView view, NameAndMood.Mood mood, int position, SelectionManager selectionManager) {
86 | view.setText(mood.toString());
87 | }
88 | };
89 |
90 |
91 | GroupableAdapper groupableAdapter = new GroupableAdapper<>(list, provider, comparator, groupProvider);
92 | groupableAdapter.setFilterFunction(new FilterFunction() {
93 | @Override
94 | public boolean filter(NameAndMood item, @Nullable CharSequence constraint) {
95 | return constraint != null && item.name.contains(constraint);
96 | }
97 | });
98 | return groupableAdapter;
99 | }
100 |
101 | @Override
102 | protected void reorder() {
103 | Toast.makeText(getActivity(), "Groupables are naturally sorted, reordering is not possible", Toast.LENGTH_LONG).show();
104 | }
105 |
106 | @Override
107 | protected void add() {
108 | list.add(getFirstVisibleItemPosition(), new NameAndMood(NameAndMood.Mood.random(), "Just added #" + count));
109 | count++;
110 | }
111 |
112 | @Override
113 | protected void remove() {
114 | if(list.isEmpty()){
115 | Toast.makeText(getActivity(), "List is empty", Toast.LENGTH_SHORT).show();
116 | return;
117 | }
118 | list.remove(getFirstVisibleItemPosition());
119 | }
120 |
121 | private int getFirstVisibleItemPosition() {
122 | return Math.max(0, ((LinearLayoutManager)recyclerView.getLayoutManager()).findFirstCompletelyVisibleItemPosition());
123 | }
124 |
125 | private int getLastVisibleItemPosition() {
126 | return Math.max(((LinearLayoutManager)recyclerView.getLayoutManager()).findLastCompletelyVisibleItemPosition(), 0);
127 | }
128 |
129 | @Override
130 | protected Set[] getActionSets() {
131 | return new Set[]{MENU_ITEMS_SEARCH, MENU_ITEMS_ANIMATION};
132 | }
133 | }
134 |
--------------------------------------------------------------------------------
/adapper-example/src/main/java/com/scopely/adapper/example/fragments/HeterogeneousGroupableGridFragment.java:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright 2017 Scopely, Inc.
3 | *
4 | * Licensed under the Apache License, Version 2.0 (the "License");
5 | * you may not use this file except in compliance with the License.
6 | * You may obtain a copy of the License at
7 | *
8 | * http://www.apache.org/licenses/LICENSE-2.0
9 | *
10 | * Unless required by applicable law or agreed to in writing, software
11 | * distributed under the License is distributed on an "AS IS" BASIS,
12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | * See the License for the specific language governing permissions and
14 | * limitations under the License.
15 | */
16 |
17 | package com.scopely.adapper.example.fragments;
18 |
19 |
20 | import android.app.Fragment;
21 | import android.os.Bundle;
22 | import android.support.annotation.Nullable;
23 | import android.support.v7.widget.GridLayoutManager;
24 | import android.view.Gravity;
25 | import android.view.LayoutInflater;
26 | import android.view.View;
27 | import android.view.ViewGroup;
28 | import android.widget.ImageView;
29 | import android.widget.LinearLayout;
30 | import android.widget.TextView;
31 | import android.widget.Toast;
32 |
33 | import com.scopely.adapper.impls.TypedViewHolder;
34 | import com.scopely.adapper.adapters.GroupableAdapper;
35 | import com.scopely.adapper.example.R;
36 | import com.scopely.adapper.example.Utils;
37 | import com.scopely.adapper.example.objects.NameAndMood;
38 | import com.scopely.adapper.example.views.NameAndMoodView;
39 | import com.scopely.adapper.extras.InvertedSpanSizeLookup;
40 | import com.scopely.adapper.impls.GroupComparatorImpl;
41 | import com.scopely.adapper.impls.PopulatableProvider;
42 | import com.scopely.adapper.impls.ViewProviderImpl;
43 | import com.scopely.adapper.interfaces.FilterFunction;
44 | import com.scopely.adapper.interfaces.GroupComparator;
45 | import com.scopely.adapper.interfaces.ViewProvider;
46 | import com.scopely.adapper.interfaces.SelectionManager;
47 |
48 | import java.util.List;
49 | import java.util.Set;
50 |
51 | /**
52 | * A simple {@link Fragment} subclass.
53 | *
54 | */
55 | public class HeterogeneousGroupableGridFragment extends AbstractFragment> {
56 | private List list = Utils.generateNameAndMoodList(12);
57 | private GridLayoutManager manager;
58 |
59 | @Override
60 | protected GroupableAdapper createAdapter() {
61 | ViewProvider provider = new PopulatableProvider(R.layout.view_name_and_mood) {
62 | @Override
63 | public int getViewType(NameAndMood s) {
64 | return R.layout.view_name_and_mood;
65 | }
66 |
67 | @Override
68 | public TypedViewHolder create(LayoutInflater inflater, ViewGroup parent, int viewType) {
69 | TypedViewHolder holder = super.create(inflater, parent, viewType);
70 | holder.getView().textView.setVisibility(View.GONE);
71 | ImageView imageView = holder.getView().imageView;
72 | imageView.setLayoutParams(new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT));
73 | imageView.setScaleType(ImageView.ScaleType.CENTER_INSIDE);
74 | imageView.setAdjustViewBounds(true);
75 | return holder;
76 | }
77 | };
78 |
79 | GroupComparator comparator = new GroupComparatorImpl() {
80 | @Override
81 | public NameAndMood.Mood getGroup(NameAndMood nameAndMood) {
82 | return nameAndMood.mood;
83 | }
84 |
85 | @Override
86 | protected int groupCompare(NameAndMood.Mood lhs, NameAndMood.Mood rhs) {
87 | return lhs.compareTo(rhs);
88 | }
89 |
90 | @Override
91 | protected int itemCompare(NameAndMood lhs, NameAndMood rhs) {
92 | return lhs.name.compareTo(rhs.name);
93 | }
94 | };
95 |
96 | ViewProvider groupProvider = new ViewProviderImpl(android.R.layout.simple_list_item_1) {
97 | @Override
98 | public int getViewType(NameAndMood.Mood mood) {
99 | return android.R.layout.simple_list_item_1;
100 | }
101 |
102 | @Override
103 | protected void bind(TextView view, NameAndMood.Mood mood, int position, SelectionManager selectionManager) {
104 | view.setGravity(Gravity.CENTER_HORIZONTAL);
105 | view.setText(mood.toString());
106 | }
107 | };
108 |
109 | FilterFunction filterFunction = new FilterFunction() {
110 | @Override
111 | public boolean filter(NameAndMood item, @Nullable CharSequence constraint) {
112 | return constraint != null && item.name.contains(constraint);
113 | }
114 | };
115 |
116 | GroupableAdapper groupableAdapter = new GroupableAdapper<>(list, provider, comparator, groupProvider);
117 | groupableAdapter.setFilterFunction(filterFunction);
118 | return groupableAdapter;
119 | }
120 |
121 | @Override
122 | public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
123 | View view = super.onCreateView(inflater, container, savedInstanceState);
124 |
125 | InvertedSpanSizeLookup spanSizeLookup = new InvertedSpanSizeLookup(1, 5, 10) {
126 | @Override
127 | public int getItemsPerRow(int position) {
128 | if (adapter.isGroup(position)) {
129 | return 1;
130 | } else {
131 | NameAndMood nameAndMood = adapter.getModel(position);
132 | if (nameAndMood.mood == NameAndMood.Mood.HAPPY) {
133 | return 5;
134 | } else {
135 | return 10;
136 | }
137 | }
138 | }
139 | };
140 | manager = new GridLayoutManager(inflater.getContext(), spanSizeLookup.getRequiredSpans());
141 | manager.setSpanSizeLookup(spanSizeLookup);
142 | recyclerView.setLayoutManager(manager);
143 | return view;
144 | }
145 |
146 | @Override
147 | protected void reorder() {
148 | Toast.makeText(getActivity(), "Groupables are naturally sorted, reordering is not possible", Toast.LENGTH_LONG).show();
149 | }
150 |
151 | @Override
152 | protected void add() {
153 | list.add(getFirstVisibleItemPosition(), new NameAndMood(NameAndMood.Mood.random(), "Just added"));
154 | }
155 |
156 | @Override
157 | protected void remove() {
158 | if(list.isEmpty()){
159 | Toast.makeText(getActivity(), "List is empty", Toast.LENGTH_SHORT).show();
160 | return;
161 | }
162 | list.remove(getFirstVisibleItemPosition());
163 | }
164 |
165 | private int getFirstVisibleItemPosition() {
166 | return manager.findFirstCompletelyVisibleItemPosition();
167 | }
168 |
169 | private int getLastVisibleItemPosition() {
170 | return manager.findLastCompletelyVisibleItemPosition();
171 | }
172 |
173 | @Override
174 | protected Set[] getActionSets() {
175 | return new Set[]{MENU_ITEMS_SEARCH, MENU_ITEMS_ANIMATION};
176 | }
177 | }
178 |
--------------------------------------------------------------------------------
/adapper-example/src/main/java/com/scopely/adapper/example/fragments/RecursiveFragment.java:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright 2017 Scopely, Inc.
3 | *
4 | * Licensed under the Apache License, Version 2.0 (the "License");
5 | * you may not use this file except in compliance with the License.
6 | * You may obtain a copy of the License at
7 | *
8 | * http://www.apache.org/licenses/LICENSE-2.0
9 | *
10 | * Unless required by applicable law or agreed to in writing, software
11 | * distributed under the License is distributed on an "AS IS" BASIS,
12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | * See the License for the specific language governing permissions and
14 | * limitations under the License.
15 | */
16 |
17 | package com.scopely.adapper.example.fragments;
18 |
19 | import android.support.annotation.Nullable;
20 | import android.view.LayoutInflater;
21 | import android.widget.TextView;
22 |
23 | import com.scopely.adapper.adapters.BaseAdapper;
24 | import com.scopely.adapper.adapters.ListAdapper;
25 | import com.scopely.adapper.adapters.RecursiveAdapper;
26 | import com.scopely.adapper.adapters.SingleViewAdapper;
27 | import com.scopely.adapper.example.R;
28 | import com.scopely.adapper.example.Utils;
29 | import com.scopely.adapper.example.objects.NameAndMood;
30 | import com.scopely.adapper.example.views.NameAndMoodView;
31 | import com.scopely.adapper.impls.PopulatableProvider;
32 | import com.scopely.adapper.impls.ViewProviderImpl;
33 | import com.scopely.adapper.interfaces.FilterFunction;
34 | import com.scopely.adapper.interfaces.ViewProvider;
35 | import com.scopely.adapper.interfaces.SelectionManager;
36 |
37 | import java.util.List;
38 | import java.util.Set;
39 |
40 | public class RecursiveFragment extends AbstractFragment {
41 |
42 | private List list = Utils.generateStringList(5);
43 | private List list2 = Utils.generateNameAndMoodList(5);
44 |
45 | @Override
46 | protected BaseAdapper createAdapter() {
47 | ViewProvider provider = new ViewProviderImpl(android.R.layout.simple_list_item_1) {
48 | @Override
49 | public int getViewType(String s) {
50 | return android.R.layout.simple_list_item_1;
51 | }
52 |
53 | @Override
54 | protected void bind(TextView view, String s, int position, SelectionManager selectionManager) {
55 | view.setText(s);
56 | }
57 | };
58 |
59 | ListAdapper adapter1 = new ListAdapper<>(list, provider);
60 | adapter1.setFilterFunction(new FilterFunction() {
61 | @Override
62 | public boolean filter(String item, @Nullable CharSequence constraint) {
63 | return constraint == null || item.contains(constraint);
64 | }
65 | });
66 |
67 | ViewProvider provider2 = new PopulatableProvider(R.layout.view_name_and_mood) {
68 | @Override
69 | public int getViewType(NameAndMood s) {
70 | return R.layout.view_name_and_mood;
71 | }
72 |
73 | };
74 |
75 | ListAdapper adapter2 = new ListAdapper<>(list2, provider2);
76 | adapter2.setFilterFunction(new FilterFunction() {
77 | @Override
78 | public boolean filter(NameAndMood item, @Nullable CharSequence constraint) {
79 | return constraint == null || item.name.contains(constraint);
80 | }
81 | });
82 |
83 | SingleViewAdapper adapter3 = new SingleViewAdapper(LayoutInflater.from(getActivity()).inflate(R.layout.view_single, null));
84 |
85 | return new RecursiveAdapper<>(adapter1, adapter3, adapter2);
86 | }
87 |
88 | @Override
89 | protected Set[] getActionSets() {
90 | return new Set[]{MENU_ITEMS_SEARCH};
91 | }
92 | }
93 |
--------------------------------------------------------------------------------
/adapper-example/src/main/java/com/scopely/adapper/example/fragments/SelectCursorFragment.java:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright 2017 Scopely, Inc.
3 | *
4 | * Licensed under the Apache License, Version 2.0 (the "License");
5 | * you may not use this file except in compliance with the License.
6 | * You may obtain a copy of the License at
7 | *
8 | * http://www.apache.org/licenses/LICENSE-2.0
9 | *
10 | * Unless required by applicable law or agreed to in writing, software
11 | * distributed under the License is distributed on an "AS IS" BASIS,
12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | * See the License for the specific language governing permissions and
14 | * limitations under the License.
15 | */
16 |
17 | package com.scopely.adapper.example.fragments;
18 |
19 | import android.database.Cursor;
20 | import android.database.sqlite.SQLiteDatabase;
21 | import android.os.Bundle;
22 | import android.support.annotation.Nullable;
23 | import android.view.View;
24 | import android.widget.FilterQueryProvider;
25 |
26 | import com.readystatesoftware.sqliteasset.SQLiteAssetHelper;
27 | import com.scopely.adapper.adapters.CursorAdapper;
28 | import com.scopely.adapper.example.R;
29 | import com.scopely.adapper.example.objects.NameAndMood;
30 | import com.scopely.adapper.example.views.NameAndMoodView;
31 | import com.scopely.adapper.impls.PopulatableProvider;
32 | import com.scopely.adapper.interfaces.MiniOrm;
33 | import com.scopely.adapper.interfaces.SelectionManager;
34 | import com.scopely.adapper.interfaces.ViewProvider;
35 | import com.scopely.adapper.selection.MultiSelectManager;
36 |
37 | import java.util.Set;
38 |
39 | public class SelectCursorFragment extends AbstractFragment {
40 |
41 | public static final String TABLE_NAME = "name";
42 | public static final String COLUMN_NAME_ID = "_id";
43 | private SQLiteDatabase db;
44 |
45 | @Override
46 | public void onCreate(Bundle savedInstanceState) {
47 | super.onCreate(savedInstanceState);
48 | db = new SQLiteAssetHelper(getActivity(), "example.db", null, 1) {}
49 | .getReadableDatabase();
50 | }
51 |
52 | @Override
53 | public void onDestroy() {
54 | db.close();
55 | super.onDestroy();
56 | }
57 |
58 | @Override
59 | protected CursorAdapper createAdapter() {
60 | ViewProvider provider = new PopulatableProvider(R.layout.view_name_and_mood) {
61 | @Override
62 | public int getViewType(NameAndMood s) {
63 | return R.layout.view_name_and_mood;
64 | }
65 |
66 | @Override
67 | protected void bind(NameAndMoodView view, NameAndMood nameAndMood, final int position, @Nullable final SelectionManager selectionManager) {
68 | super.bind(view, nameAndMood, position, selectionManager);
69 | if(selectionManager != null) {
70 | final boolean itemSelected = selectionManager.isItemSelected(position);
71 | view.setChecked(itemSelected);
72 | view.setOnClickListener(new View.OnClickListener() {
73 | @Override
74 | public void onClick(View v) {
75 | selectionManager.selectItem(position, !itemSelected);
76 | }
77 | });
78 | }
79 |
80 | }
81 | };
82 |
83 | final Cursor cursor = query(db, null);
84 |
85 | MiniOrm miniOrm = new MiniOrm() {
86 | @Override
87 | public NameAndMood getObject(Cursor c) {
88 | NameAndMood.Mood mood = NameAndMood.Mood.valueOf(c.getString(c.getColumnIndex("mood")));
89 | String name = c.getString(c.getColumnIndex("name"));
90 | return new NameAndMood(mood, name);
91 | }
92 | };
93 | CursorAdapper.CursorIdentifier identifier = new CursorAdapper.ColumnIdentifier(COLUMN_NAME_ID);
94 | CursorAdapper.CursorLookup lookup = new CursorAdapper.ColumnLookup<>(db, TABLE_NAME, COLUMN_NAME_ID);
95 | final CursorAdapper adapter = new CursorAdapper<>(cursor, identifier, lookup, miniOrm, provider);
96 | adapter.setFilterQueryProvider(new FilterQueryProvider() {
97 | @Override
98 | public Cursor runQuery(CharSequence constraint) {
99 | return query(db, constraint);
100 | }
101 | });
102 | adapter.setSelectionManager(new MultiSelectManager<>(adapter));
103 | return adapter;
104 | }
105 |
106 | private Cursor query(SQLiteDatabase db, @Nullable CharSequence constraint) {
107 | return db.query(TABLE_NAME, null, constraint != null && constraint.length() > 0 ? "name LIKE '%"+constraint.toString()+"%'" : null, null, null, null, null);
108 | }
109 |
110 | @Override
111 | protected Set[] getActionSets() {
112 | return new Set[]{MENU_ITEMS_SEARCH, MENU_ITEMS_SELECT};
113 | }
114 | }
115 |
--------------------------------------------------------------------------------
/adapper-example/src/main/java/com/scopely/adapper/example/fragments/SelectGroupableListFragment.java:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright 2017 Scopely, Inc.
3 | *
4 | * Licensed under the Apache License, Version 2.0 (the "License");
5 | * you may not use this file except in compliance with the License.
6 | * You may obtain a copy of the License at
7 | *
8 | * http://www.apache.org/licenses/LICENSE-2.0
9 | *
10 | * Unless required by applicable law or agreed to in writing, software
11 | * distributed under the License is distributed on an "AS IS" BASIS,
12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | * See the License for the specific language governing permissions and
14 | * limitations under the License.
15 | */
16 |
17 | package com.scopely.adapper.example.fragments;
18 |
19 |
20 | import android.app.Fragment;
21 | import android.support.annotation.Nullable;
22 | import android.view.View;
23 | import android.widget.TextView;
24 |
25 | import com.scopely.adapper.adapters.GroupableAdapper;
26 | import com.scopely.adapper.example.R;
27 | import com.scopely.adapper.example.Utils;
28 | import com.scopely.adapper.example.objects.NameAndMood;
29 | import com.scopely.adapper.example.views.NameAndMoodView;
30 | import com.scopely.adapper.impls.GroupComparatorImpl;
31 | import com.scopely.adapper.impls.PopulatableProvider;
32 | import com.scopely.adapper.impls.ViewProviderImpl;
33 | import com.scopely.adapper.interfaces.FilterFunction;
34 | import com.scopely.adapper.interfaces.GroupComparator;
35 | import com.scopely.adapper.interfaces.ViewProvider;
36 | import com.scopely.adapper.interfaces.SelectionManager;
37 | import com.scopely.adapper.selection.MultiSelectManager;
38 |
39 | import java.util.List;
40 | import java.util.Set;
41 |
42 | /**
43 | * A simple {@link Fragment} subclass.
44 | *
45 | */
46 | public class SelectGroupableListFragment extends AbstractFragment {
47 |
48 | private int count = 9;
49 | private List list = Utils.generateNameAndMoodList(count);
50 |
51 | @Override
52 | protected GroupableAdapper createAdapter() {
53 | ViewProvider provider = new PopulatableProvider(R.layout.view_name_and_mood) {
54 | @Override
55 | public int getViewType(NameAndMood s) {
56 | return R.layout.view_name_and_mood;
57 | }
58 |
59 | @Override
60 | protected void bind(NameAndMoodView view, NameAndMood nameAndMood, final int position, @Nullable final SelectionManager selectionManager) {
61 | super.bind(view, nameAndMood, position, selectionManager);
62 | if (selectionManager != null) {
63 | view.setChecked(selectionManager.isItemSelected(position));
64 | view.setOnClickListener(new View.OnClickListener() {
65 | @Override
66 | public void onClick(View v) {
67 | selectionManager.selectItem(position, !selectionManager.isItemSelected(position));
68 | }
69 | });
70 | }
71 | }
72 | };
73 |
74 | GroupComparator comparator = new GroupComparatorImpl() {
75 | @Override
76 | public NameAndMood.Mood getGroup(NameAndMood nameAndMood) {
77 | return nameAndMood.mood;
78 | }
79 |
80 | @Override
81 | protected int groupCompare(NameAndMood.Mood lhs, NameAndMood.Mood rhs) {
82 | return lhs.compareTo(rhs);
83 | }
84 |
85 | @Override
86 | protected int itemCompare(NameAndMood lhs, NameAndMood rhs) {
87 | return lhs.name.compareTo(rhs.name);
88 | }
89 | };
90 |
91 | ViewProvider groupProvider = new ViewProviderImpl(android.R.layout.simple_list_item_1) {
92 | @Override
93 | public int getViewType(NameAndMood.Mood mood) {
94 | return android.R.layout.simple_list_item_1;
95 | }
96 |
97 | @Override
98 | protected void bind(TextView view, NameAndMood.Mood mood, int position, SelectionManager selectionManager) {
99 | view.setText(mood.toString());
100 | }
101 | };
102 |
103 |
104 | GroupableAdapper groupableAdapter = new GroupableAdapper<>(list, provider, comparator, groupProvider);
105 | groupableAdapter.setFilterFunction(new FilterFunction() {
106 | @Override
107 | public boolean filter(NameAndMood item, @Nullable CharSequence constraint) {
108 | return constraint != null && item.name.contains(constraint);
109 | }
110 | });
111 | groupableAdapter.setSelectionManager(new MultiSelectManager<>(groupableAdapter));
112 | return groupableAdapter;
113 | }
114 |
115 | @Override
116 | protected Set[] getActionSets() {
117 | return new Set[]{MENU_ITEMS_SEARCH, MENU_ITEMS_SELECT};
118 | }
119 | }
120 |
--------------------------------------------------------------------------------
/adapper-example/src/main/java/com/scopely/adapper/example/fragments/SelectPopulateableListFragment.java:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright 2017 Scopely, Inc.
3 | *
4 | * Licensed under the Apache License, Version 2.0 (the "License");
5 | * you may not use this file except in compliance with the License.
6 | * You may obtain a copy of the License at
7 | *
8 | * http://www.apache.org/licenses/LICENSE-2.0
9 | *
10 | * Unless required by applicable law or agreed to in writing, software
11 | * distributed under the License is distributed on an "AS IS" BASIS,
12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | * See the License for the specific language governing permissions and
14 | * limitations under the License.
15 | */
16 |
17 | package com.scopely.adapper.example.fragments;
18 |
19 | import android.support.annotation.Nullable;
20 | import android.view.View;
21 |
22 | import com.scopely.adapper.adapters.ListAdapper;
23 | import com.scopely.adapper.example.R;
24 | import com.scopely.adapper.example.Utils;
25 | import com.scopely.adapper.example.objects.NameAndMood;
26 | import com.scopely.adapper.example.views.NameAndMoodView;
27 | import com.scopely.adapper.impls.PopulatableProvider;
28 | import com.scopely.adapper.interfaces.FilterFunction;
29 | import com.scopely.adapper.interfaces.ViewProvider;
30 | import com.scopely.adapper.interfaces.SelectionManager;
31 | import com.scopely.adapper.selection.RadioSelectManager;
32 |
33 | import java.util.List;
34 | import java.util.Set;
35 |
36 | public class SelectPopulateableListFragment extends AbstractFragment {
37 | private int count = 100;
38 | private List list = Utils.generateNameAndMoodList(count);
39 |
40 | protected ListAdapper createAdapter() {
41 | ViewProvider provider = new PopulatableProvider(R.layout.view_name_and_mood) {
42 | @Override
43 | public int getViewType(NameAndMood s) {
44 | return R.layout.view_name_and_mood;
45 | }
46 |
47 | @Override
48 | protected void bind(NameAndMoodView view, NameAndMood nameAndMood, final int position, @Nullable final SelectionManager selectionManager) {
49 | super.bind(view, nameAndMood, position, selectionManager);
50 | if (selectionManager != null) {
51 | view.setChecked(selectionManager.isItemSelected(position));
52 | view.setOnClickListener(new View.OnClickListener() {
53 | @Override
54 | public void onClick(View v) {
55 | selectionManager.selectItem(position, !selectionManager.isItemSelected(position));
56 | }
57 | });
58 | } else {
59 | view.setChecked(false);
60 | view.setOnClickListener(null);
61 | }
62 | }
63 | };
64 |
65 | ListAdapper adapper = new ListAdapper<>(list, provider).setFilterFunction(new FilterFunction() {
66 | @Override
67 | public boolean filter(NameAndMood item, @Nullable CharSequence constraint) {
68 | return constraint == null || item.name.contains(constraint);
69 | }
70 | });
71 | adapper.setSelectionManager(new RadioSelectManager<>(adapper));
72 | return adapper;
73 | }
74 |
75 | @Override
76 | protected Set[] getActionSets() {
77 | return new Set[]{MENU_ITEMS_SEARCH, MENU_ITEMS_SELECT};
78 | }
79 | }
--------------------------------------------------------------------------------
/adapper-example/src/main/java/com/scopely/adapper/example/fragments/SelectRecursiveFragment.java:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright 2017 Scopely, Inc.
3 | *
4 | * Licensed under the Apache License, Version 2.0 (the "License");
5 | * you may not use this file except in compliance with the License.
6 | * You may obtain a copy of the License at
7 | *
8 | * http://www.apache.org/licenses/LICENSE-2.0
9 | *
10 | * Unless required by applicable law or agreed to in writing, software
11 | * distributed under the License is distributed on an "AS IS" BASIS,
12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | * See the License for the specific language governing permissions and
14 | * limitations under the License.
15 | */
16 |
17 | package com.scopely.adapper.example.fragments;
18 |
19 | import android.graphics.Rect;
20 | import android.support.annotation.Nullable;
21 | import android.text.method.TransformationMethod;
22 | import android.view.LayoutInflater;
23 | import android.view.View;
24 | import android.widget.TextView;
25 | import android.widget.Toast;
26 |
27 | import com.scopely.adapper.adapters.BaseAdapper;
28 | import com.scopely.adapper.adapters.ListAdapper;
29 | import com.scopely.adapper.adapters.RecursiveAdapper;
30 | import com.scopely.adapper.adapters.SingleViewAdapper;
31 | import com.scopely.adapper.example.R;
32 | import com.scopely.adapper.example.Utils;
33 | import com.scopely.adapper.example.objects.NameAndMood;
34 | import com.scopely.adapper.example.views.NameAndMoodView;
35 | import com.scopely.adapper.impls.PopulatableProvider;
36 | import com.scopely.adapper.impls.ViewProviderImpl;
37 | import com.scopely.adapper.interfaces.FilterFunction;
38 | import com.scopely.adapper.interfaces.ViewProvider;
39 | import com.scopely.adapper.interfaces.SelectionManager;
40 | import com.scopely.adapper.selection.MultiSelectManager;
41 |
42 | import java.util.List;
43 | import java.util.Set;
44 |
45 | public class SelectRecursiveFragment extends AbstractFragment {
46 |
47 | private List list = Utils.generateStringList(5);
48 | private List list2 = Utils.generateNameAndMoodList(5);
49 |
50 | @Override
51 | protected BaseAdapper createAdapter() {
52 | ViewProvider provider = new ViewProviderImpl(android.R.layout.simple_list_item_1) {
53 | @Override
54 | public int getViewType(String s) {
55 | return android.R.layout.simple_list_item_1;
56 | }
57 |
58 | @Override
59 | protected void bind(TextView view, String s, final int position, final SelectionManager selectionManager) {
60 | view.setText(s);
61 | if (selectionManager != null) {
62 | view.setTransformationMethod(new TransformationMethod() {
63 | @Override
64 | public CharSequence getTransformation(CharSequence source, View view) {
65 | return selectionManager.isItemSelected(position) ? source + " (selected)" : source;
66 | }
67 |
68 | @Override
69 | public void onFocusChanged(View view, CharSequence sourceText, boolean focused, int direction, Rect previouslyFocusedRect) {
70 |
71 | }
72 | });
73 | view.setOnClickListener(new View.OnClickListener() {
74 | @Override
75 | public void onClick(View v) {
76 | selectionManager.selectItem(position, !selectionManager.isItemSelected(position));
77 | }
78 | });
79 | }
80 | }
81 | };
82 |
83 | ListAdapper adapter1 = new ListAdapper<>(list, provider);
84 | adapter1.setFilterFunction(new FilterFunction() {
85 | @Override
86 | public boolean filter(String item, @Nullable CharSequence constraint) {
87 | return constraint == null || item.contains(constraint);
88 | }
89 | });
90 |
91 | ViewProvider provider2 = new PopulatableProvider(R.layout.view_name_and_mood) {
92 | @Override
93 | public int getViewType(NameAndMood s) {
94 | return R.layout.view_name_and_mood;
95 | }
96 |
97 | @Override
98 | protected void bind(NameAndMoodView view, NameAndMood nameAndMood, final int position, @Nullable final SelectionManager selectionManager) {
99 | super.bind(view, nameAndMood, position, selectionManager);
100 | if (selectionManager != null) {
101 | view.setChecked(selectionManager.isItemSelected(position));
102 | view.setOnClickListener(new View.OnClickListener() {
103 | @Override
104 | public void onClick(View v) {
105 | selectionManager.selectItem(position, !selectionManager.isItemSelected(position));
106 | }
107 | });
108 | }
109 | }
110 | };
111 |
112 | ListAdapper adapter2 = new ListAdapper<>(list2, provider2);
113 | adapter2.setFilterFunction(new FilterFunction() {
114 | @Override
115 | public boolean filter(NameAndMood item, @Nullable CharSequence constraint) {
116 | return constraint == null || item.name.contains(constraint);
117 | }
118 | });
119 |
120 | SingleViewAdapper adapter3 = new SingleViewAdapper(LayoutInflater.from(getActivity()).inflate(R.layout.view_single, null));
121 |
122 | RecursiveAdapper