-
Notifications
You must be signed in to change notification settings - Fork 280
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #2 from Ramotion/development
Development
- Loading branch information
Showing
125 changed files
with
3,274 additions
and
9 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -32,4 +32,5 @@ local.properties | |
obj/ | ||
|
||
# files for the dex VM # | ||
*.dex | ||
*.dex | ||
libs/ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,13 +1,230 @@ | ||
[![header](./header.png)](https://business.ramotion.com?utm_source=gthb&utm_medium=special&utm_campaign=expanding-collection-android-logo) | ||
|
||
# ExpandingCollection for Android | ||
[![Twitter](https://img.shields.io/badge/Twitter-@Ramotion-blue.svg?style=flat)](http://twitter.com/Ramotion) | ||
|
||
## Licence | ||
## About | ||
This project is maintained by Ramotion, Inc.<br> | ||
We specialize in the designing and coding of custom UI for Mobile Apps and Websites.<br><br>**Looking for developers for your project?** | ||
|
||
<a href="https://business.ramotion.com?utm_source=gthb&utm_medium=special&utm_campaign=expanding-collection-andrpoid-contact-us/#Get_in_Touch" > <img src="https://github.com/Ramotion/navigation-stack/raw/master/contact_our_team@2x.png" width="150" height="30"></a> | ||
|
||
## Requirements | ||
| ||
Folding cell is released under the MIT license. | ||
See [LICENSE](./LICENSE.md) for details. | ||
- Android 4.0 IceCreamSandwich (API lvl 14) or greater | ||
- Your favorite IDE | ||
|
||
## Installation | ||
| ||
## About | ||
The project maintained by [app development agency](https://ramotion.com?utm_source=gthb&utm_medium=special&utm_campaign=foolding-cell-android) [Ramotion Inc.](https://ramotion.com?utm_source=gthb&utm_medium=special&utm_campaign=foolding-cell-android) | ||
See our other [open-source projects](https://github.com/ramotion) or [hire](https://ramotion.com?utm_source=gthb&utm_medium=special&utm_campaign=foolding-cell-android) us to design, develop, and grow your product. | ||
maven repo: | ||
|
||
Gradle: | ||
```groovy | ||
'com.ramotion.expandingcollection:expanding-collection:0.9.0' | ||
``` | ||
SBT: | ||
```scala | ||
libraryDependencies += "com.ramotion.expandingcollection" % "expanding-collection" % "0.9.0" | ||
``` | ||
Maven: | ||
```xml | ||
<dependency> | ||
<groupId>com.ramotion.expandingcollection</groupId> | ||
<artifactId>expanding-collection</artifactId> | ||
<version>0.9.0</version> | ||
</dependency> | ||
``` | ||
|
||
## Basic usage | ||
| ||
1. Add a background switcher element `ECBackgroundSwitcherView` and a main pager element `ECPagerView` to your layout. `ECPagerView` should always have `match_parent` width and `wrap_content` height. You can adjust the vertical position yourself using **alignment/gravity** or **top margin**. `ECBackgroundSwitcherView` is the dynamic background switcher, so you probably want it to be as big as its parent. | ||
|
||
```xml | ||
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" | ||
android:layout_width="match_parent" | ||
android:layout_height="match_parent"> | ||
|
||
<com.ramotion.expandingcollection.ECBackgroundSwitcherView | ||
android:id="@+id/ec_bg_switcher_element" | ||
android:layout_width="match_parent" | ||
android:layout_height="match_parent" /> | ||
|
||
<com.ramotion.expandingcollection.ECPagerView | ||
android:id="@+id/ec_pager_element" | ||
android:layout_width="match_parent" | ||
android:layout_height="wrap_content" | ||
android:layout_centerInParent="true"/> | ||
|
||
</RelativeLayout> | ||
``` | ||
|
||
2. Tune `ECPagerView`: setup size of card in collapsed state and height of header in expanded state. | ||
|
||
```xml | ||
<com.ramotion.expandingcollection.ECPagerView xmlns:ec="http://schemas.android.com/apk/res-auto" | ||
android:id="@+id/ec_pager_element" | ||
android:layout_width="match_parent" | ||
android:layout_height="wrap_content" | ||
android:layout_centerInParent="true" | ||
ec:cardHeaderHeightExpanded="150dp" | ||
ec:cardHeight="200dp" | ||
ec:cardWidth="250dp" /> | ||
``` | ||
|
||
3. Expanded card contains two parts: a header part with a background (initially visible when card is collapsed) and a ListView element as content (visible only when card is expanded), so you need an xml layout for the list items. | ||
|
||
```xml | ||
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" | ||
android:layout_width="match_parent" | ||
android:layout_height="wrap_content"> | ||
|
||
<TextView xmlns:android="http://schemas.android.com/apk/res/android" | ||
android:id="@+id/list_item_text" | ||
android:layout_width="match_parent" | ||
android:layout_height="100dp" | ||
android:layout_gravity="center_vertical|center_horizontal" | ||
android:background="@color/colorPrimary" | ||
android:textAlignment="center" /> | ||
|
||
</FrameLayout> | ||
``` | ||
|
||
4. Also, you need to implement a custom list adapter for the list items by extending the parametrized `com.ramotion.expandingcollection.ECCardContentListItemAdapter.java` class, where `T` is type of datasource object for list items inside the card. In the example below, `T` is just a string object. It's a pretty straightforward implementation with a common view holder pattern. | ||
|
||
```java | ||
public class CardListItemAdapter extends ECCardContentListItemAdapter<String> { | ||
|
||
public CardListItemAdapter(@NonNull Context context, @NonNull List<String> objects) { | ||
super(context, R.layout.list_item, objects); | ||
} | ||
|
||
@NonNull | ||
@Override | ||
public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) { | ||
ViewHolder viewHolder; | ||
View rowView = convertView; | ||
|
||
if (rowView == null) { | ||
LayoutInflater inflater = LayoutInflater.from(getContext()); | ||
rowView = inflater.inflate(R.layout.list_item, null); | ||
viewHolder = new ViewHolder(); | ||
viewHolder.itemText = (TextView) rowView.findViewById(R.id.list_item_text); | ||
rowView.setTag(viewHolder); | ||
} else { | ||
viewHolder = (ViewHolder) rowView.getTag(); | ||
} | ||
|
||
String item = getItem(position); | ||
if (item != null) { | ||
viewHolder.itemText.setText(item); | ||
} | ||
return rowView; | ||
} | ||
|
||
static class ViewHolder { | ||
TextView itemText; | ||
} | ||
|
||
} | ||
``` | ||
5. Your data class must implement the `com.ramotion.expandingcollection.ECCardData.java` interface where `T` is type of datasource object for list items inside the card. | ||
|
||
```java | ||
public class CardDataImpl implements ECCardData<String> { | ||
|
||
private String cardTitle; | ||
private Integer mainBackgroundResource; | ||
private Integer headBackgroundResource; | ||
private List<String> listItems; | ||
|
||
@Override | ||
public Integer getMainBackgroundResource() { | ||
return mainBackgroundResource; | ||
} | ||
|
||
@Override | ||
public Integer getHeadBackgroundResource() { | ||
return headBackgroundResource; | ||
} | ||
|
||
@Override | ||
public List<String> getListItems() { | ||
return listItems; | ||
} | ||
} | ||
``` | ||
|
||
6. Almost done! The last thing we need to do is provide our dataset to a pager element through a pager adapter. It's just an implementation of the abstract class `com.ramotion.expandingcollection.ECPagerViewAdapter.java` with one abstract method, so it can be easily implemented inside your activity. | ||
|
||
```java | ||
public class MainActivity extends Activity { | ||
|
||
private ECPagerView ecPagerView; | ||
|
||
@Override | ||
protected void onCreate(Bundle savedInstanceState) { | ||
super.onCreate(savedInstanceState); | ||
setContentView(R.layout.activity_main); | ||
|
||
// Get pager from layout | ||
ecPagerView = (ECPagerView) findViewById(R.id.ec_pager_element); | ||
|
||
// Generate example dataset | ||
List<ECCardData> dataset = CardDataImpl.generateExampleData(); | ||
|
||
// Implement and pager adapter and set it to pager view | ||
ecPagerView.setPagerViewAdapter(new ECPagerViewAdapter(getApplicationContext(), dataset) { | ||
@Override | ||
public void instantiateCard(LayoutInflater inflaterService, ViewGroup head, ListView list, ECCardData data) { | ||
// Data object for current card | ||
CardDataImpl cardData = (CardDataImpl) data; | ||
|
||
// Set adapter and items to current card content list | ||
list.setAdapter(new CardListItemAdapter(getApplicationContext(), cardData.getListItems())); | ||
// Also some visual tuning can be done here | ||
list.setBackgroundColor(Color.WHITE); | ||
|
||
// Here we can create elements for head view or inflate layout from xml using inflater service | ||
TextView cardTitle = new TextView(getApplicationContext()); | ||
cardTitle.setText(cardData.getCardTitle()); | ||
cardTitle.setTextSize(COMPLEX_UNIT_DIP, 20); | ||
FrameLayout.LayoutParams layoutParams = new FrameLayout.LayoutParams(FrameLayout.LayoutParams.WRAP_CONTENT, FrameLayout.LayoutParams.WRAP_CONTENT); | ||
layoutParams.gravity = Gravity.CENTER; | ||
head.addView(cardTitle, layoutParams); | ||
|
||
// Card toggling by click on head element view | ||
head.setOnClickListener(new View.OnClickListener() { | ||
@Override | ||
public void onClick(final View v) { | ||
ecPagerView.toggle(); | ||
} | ||
}); | ||
} | ||
}); | ||
|
||
// Add background switcher to pager view | ||
ecPagerView.setBackgroundSwitcherView((ECBackgroundSwitcherView) findViewById(R.id.ec_bg_switcher_element)); | ||
|
||
} | ||
|
||
// Card collapse on back pressed | ||
@Override | ||
public void onBackPressed() { | ||
if (!ecPagerView.collapse()) | ||
super.onBackPressed(); | ||
} | ||
|
||
} | ||
``` | ||
|
||
You can find this and other, more complex, examples in this repository | ||
|
||
## Licence | ||
| ||
[![Twitter URL](https://img.shields.io/twitter/url/http/shields.io.svg?style=social)](https://twitter.com/intent/tweet?text=https://github.com/ramotion/foolding-cell-android) | ||
Expanding Collection is released under the MIT license. | ||
See [LICENSE](./LICENSE.md) for details. | ||
|
||
## Follow us | ||
|
||
[![Twitter URL](https://img.shields.io/twitter/url/http/shields.io.svg?style=social)](https://twitter.com/intent/tweet?text=https://github.com/ramotion/expanding-collection-android) | ||
[![Twitter Follow](https://img.shields.io/twitter/follow/ramotion.svg?style=social)](https://twitter.com/ramotion) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,23 @@ | ||
// Top-level build file where you can add configuration options common to all sub-projects/modules. | ||
|
||
buildscript { | ||
repositories { | ||
jcenter() | ||
} | ||
dependencies { | ||
classpath 'com.android.tools.build:gradle:2.3.0' | ||
|
||
// NOTE: Do not place your application dependencies here; they belong | ||
// in the individual module build.gradle files | ||
} | ||
} | ||
|
||
allprojects { | ||
repositories { | ||
jcenter() | ||
} | ||
} | ||
|
||
task clean(type: Delete) { | ||
delete rootProject.buildDir | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
/build |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,35 @@ | ||
apply plugin: 'com.android.application' | ||
|
||
android { | ||
compileSdkVersion 25 | ||
buildToolsVersion "25.0.2" | ||
defaultConfig { | ||
applicationId "com.ramotion.expandingcollection.examples.full" | ||
minSdkVersion 14 | ||
targetSdkVersion 25 | ||
versionCode 1 | ||
versionName '1.0' | ||
|
||
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" | ||
|
||
} | ||
buildTypes { | ||
release { | ||
minifyEnabled false | ||
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' | ||
} | ||
} | ||
productFlavors { | ||
} | ||
} | ||
|
||
dependencies { | ||
compile fileTree(include: ['*.jar'], dir: 'libs') | ||
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', { | ||
exclude group: 'com.android.support', module: 'support-annotations' | ||
}) | ||
compile 'com.android.support:appcompat-v7:25.3.1' | ||
compile 'com.android.support:support-v4:25.3.1' | ||
testCompile 'junit:junit:4.12' | ||
compile project(path: ':expanding-collection') | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,25 @@ | ||
# Add project specific ProGuard rules here. | ||
# By default, the flags in this file are appended to flags specified | ||
# in C:\Users\TheKid\AppData\Local\Android\Sdk/tools/proguard/proguard-android.txt | ||
# You can edit the include path and order by changing the proguardFiles | ||
# directive in build.gradle. | ||
# | ||
# For more details, see | ||
# http://developer.android.com/guide/developing/tools/proguard.html | ||
|
||
# Add any project specific keep options here: | ||
|
||
# If your project uses WebView with JS, uncomment the following | ||
# and specify the fully qualified class name to the JavaScript interface | ||
# class: | ||
#-keepclassmembers class fqcn.of.javascript.interface.for.webview { | ||
# public *; | ||
#} | ||
|
||
# Uncomment this to preserve the line number information for | ||
# debugging stack traces. | ||
#-keepattributes SourceFile,LineNumberTable | ||
|
||
# If you keep the line number information, uncomment this to | ||
# hide the original source file name. | ||
#-renamesourcefileattribute SourceFile |
26 changes: 26 additions & 0 deletions
26
...roidTest/java/com/ramotion/expandingcollection/examples/full/ExampleInstrumentedTest.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,26 @@ | ||
package com.ramotion.expandingcollection.examples.full; | ||
|
||
import android.content.Context; | ||
import android.support.test.InstrumentationRegistry; | ||
import android.support.test.runner.AndroidJUnit4; | ||
|
||
import org.junit.Test; | ||
import org.junit.runner.RunWith; | ||
|
||
import static org.junit.Assert.*; | ||
|
||
/** | ||
* Instrumentation test, which will execute on an Android device. | ||
* | ||
* @see <a href="http://d.android.com/tools/testing">Testing documentation</a> | ||
*/ | ||
@RunWith(AndroidJUnit4.class) | ||
public class ExampleInstrumentedTest { | ||
@Test | ||
public void useAppContext() throws Exception { | ||
// Context of the app under test. | ||
Context appContext = InstrumentationRegistry.getTargetContext(); | ||
|
||
assertEquals("com.ramotion.expandingcollection.examples.full", appContext.getPackageName()); | ||
} | ||
} |
22 changes: 22 additions & 0 deletions
22
expanding-collection-full-example/src/main/AndroidManifest.xml
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,22 @@ | ||
<?xml version="1.0" encoding="utf-8"?> | ||
<manifest xmlns:android="http://schemas.android.com/apk/res/android" | ||
package="com.ramotion.expandingcollection.examples.full"> | ||
|
||
<application | ||
android:allowBackup="true" | ||
android:icon="@mipmap/ic_launcher" | ||
android:label="@string/app_name" | ||
android:roundIcon="@mipmap/ic_launcher_round" | ||
android:supportsRtl="true" | ||
android:theme="@style/AppTheme"> | ||
|
||
<activity android:name="com.ramotion.expandingcollection.examples.full.MainActivity"> | ||
<intent-filter> | ||
<action android:name="android.intent.action.MAIN" /> | ||
<category android:name="android.intent.category.LAUNCHER" /> | ||
</intent-filter> | ||
</activity> | ||
|
||
</application> | ||
|
||
</manifest> |
Oops, something went wrong.