Skip to content

Commit 8ebbb17

Browse files
author
Ingo Schwarz
committed
Implement TableHeader
1 parent 789d7a0 commit 8ebbb17

32 files changed

+731
-0
lines changed

.gitignore

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
.gradle
2+
/local.properties
3+
/.idea/workspace.xml
4+
/.idea/libraries
5+
.DS_Store
6+
/build
7+
/captures

SortableTableView.iml

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<module external.linked.project.id="SortableTableView" external.linked.project.path="$MODULE_DIR$" external.root.project.path="$MODULE_DIR$" external.system.id="GRADLE" external.system.module.group="" external.system.module.version="unspecified" type="JAVA_MODULE" version="4">
3+
<component name="FacetManager">
4+
<facet type="java-gradle" name="Java-Gradle">
5+
<configuration>
6+
<option name="BUILD_FOLDER_PATH" value="$MODULE_DIR$/build" />
7+
<option name="BUILDABLE" value="false" />
8+
</configuration>
9+
</facet>
10+
</component>
11+
<component name="NewModuleRootManager" inherit-compiler-output="true">
12+
<exclude-output />
13+
<content url="file://$MODULE_DIR$">
14+
<excludeFolder url="file://$MODULE_DIR$/.gradle" />
15+
</content>
16+
<orderEntry type="inheritedJdk" />
17+
<orderEntry type="sourceFolder" forTests="false" />
18+
</component>
19+
</module>

app/.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
/build

app/app.iml

Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<module external.linked.project.id=":app" external.linked.project.path="$MODULE_DIR$" external.root.project.path="$MODULE_DIR$/.." external.system.id="GRADLE" external.system.module.group="SortableTableView" external.system.module.version="unspecified" type="JAVA_MODULE" version="4">
3+
<component name="FacetManager">
4+
<facet type="android-gradle" name="Android-Gradle">
5+
<configuration>
6+
<option name="GRADLE_PROJECT_PATH" value=":app" />
7+
</configuration>
8+
</facet>
9+
<facet type="android" name="Android">
10+
<configuration>
11+
<option name="SELECTED_BUILD_VARIANT" value="debug" />
12+
<option name="SELECTED_TEST_ARTIFACT" value="_android_test_" />
13+
<option name="ASSEMBLE_TASK_NAME" value="assembleDebug" />
14+
<option name="COMPILE_JAVA_TASK_NAME" value="compileDebugSources" />
15+
<option name="SOURCE_GEN_TASK_NAME" value="generateDebugSources" />
16+
<option name="ASSEMBLE_TEST_TASK_NAME" value="assembleDebugAndroidTest" />
17+
<option name="COMPILE_JAVA_TEST_TASK_NAME" value="compileDebugAndroidTestSources" />
18+
<option name="TEST_SOURCE_GEN_TASK_NAME" value="generateDebugAndroidTestSources" />
19+
<option name="ALLOW_USER_CONFIGURATION" value="false" />
20+
<option name="MANIFEST_FILE_RELATIVE_PATH" value="/src/main/AndroidManifest.xml" />
21+
<option name="RES_FOLDER_RELATIVE_PATH" value="/src/main/res" />
22+
<option name="RES_FOLDERS_RELATIVE_PATH" value="file://$MODULE_DIR$/src/main/res" />
23+
<option name="ASSETS_FOLDER_RELATIVE_PATH" value="/src/main/assets" />
24+
</configuration>
25+
</facet>
26+
</component>
27+
<component name="NewModuleRootManager" inherit-compiler-output="false">
28+
<output url="file://$MODULE_DIR$/build/intermediates/classes/debug" />
29+
<output-test url="file://$MODULE_DIR$/build/intermediates/classes/androidTest/debug" />
30+
<exclude-output />
31+
<content url="file://$MODULE_DIR$">
32+
<sourceFolder url="file://$MODULE_DIR$/build/generated/source/r/debug" isTestSource="false" generated="true" />
33+
<sourceFolder url="file://$MODULE_DIR$/build/generated/source/aidl/debug" isTestSource="false" generated="true" />
34+
<sourceFolder url="file://$MODULE_DIR$/build/generated/source/buildConfig/debug" isTestSource="false" generated="true" />
35+
<sourceFolder url="file://$MODULE_DIR$/build/generated/source/rs/debug" isTestSource="false" generated="true" />
36+
<sourceFolder url="file://$MODULE_DIR$/build/generated/res/rs/debug" type="java-resource" />
37+
<sourceFolder url="file://$MODULE_DIR$/build/generated/res/generated/debug" type="java-resource" />
38+
<sourceFolder url="file://$MODULE_DIR$/build/generated/source/r/androidTest/debug" isTestSource="true" generated="true" />
39+
<sourceFolder url="file://$MODULE_DIR$/build/generated/source/aidl/androidTest/debug" isTestSource="true" generated="true" />
40+
<sourceFolder url="file://$MODULE_DIR$/build/generated/source/buildConfig/androidTest/debug" isTestSource="true" generated="true" />
41+
<sourceFolder url="file://$MODULE_DIR$/build/generated/source/rs/androidTest/debug" isTestSource="true" generated="true" />
42+
<sourceFolder url="file://$MODULE_DIR$/build/generated/res/rs/androidTest/debug" type="java-test-resource" />
43+
<sourceFolder url="file://$MODULE_DIR$/build/generated/res/generated/androidTest/debug" type="java-test-resource" />
44+
<sourceFolder url="file://$MODULE_DIR$/src/debug/res" type="java-resource" />
45+
<sourceFolder url="file://$MODULE_DIR$/src/debug/resources" type="java-resource" />
46+
<sourceFolder url="file://$MODULE_DIR$/src/debug/assets" type="java-resource" />
47+
<sourceFolder url="file://$MODULE_DIR$/src/debug/aidl" isTestSource="false" />
48+
<sourceFolder url="file://$MODULE_DIR$/src/debug/java" isTestSource="false" />
49+
<sourceFolder url="file://$MODULE_DIR$/src/debug/jni" isTestSource="false" />
50+
<sourceFolder url="file://$MODULE_DIR$/src/debug/rs" isTestSource="false" />
51+
<sourceFolder url="file://$MODULE_DIR$/src/main/res" type="java-resource" />
52+
<sourceFolder url="file://$MODULE_DIR$/src/main/resources" type="java-resource" />
53+
<sourceFolder url="file://$MODULE_DIR$/src/main/assets" type="java-resource" />
54+
<sourceFolder url="file://$MODULE_DIR$/src/main/aidl" isTestSource="false" />
55+
<sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false" />
56+
<sourceFolder url="file://$MODULE_DIR$/src/main/jni" isTestSource="false" />
57+
<sourceFolder url="file://$MODULE_DIR$/src/main/rs" isTestSource="false" />
58+
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/res" type="java-test-resource" />
59+
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/resources" type="java-test-resource" />
60+
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/assets" type="java-test-resource" />
61+
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/aidl" isTestSource="true" />
62+
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/java" isTestSource="true" />
63+
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/jni" isTestSource="true" />
64+
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/rs" isTestSource="true" />
65+
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/assets" />
66+
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/bundles" />
67+
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/classes" />
68+
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/coverage-instrumented-classes" />
69+
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/dependency-cache" />
70+
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/dex" />
71+
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/dex-cache" />
72+
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/incremental" />
73+
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/jacoco" />
74+
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/javaResources" />
75+
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/libs" />
76+
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/lint" />
77+
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/manifests" />
78+
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/ndk" />
79+
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/pre-dexed" />
80+
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/proguard" />
81+
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/res" />
82+
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/rs" />
83+
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/symbols" />
84+
<excludeFolder url="file://$MODULE_DIR$/build/outputs" />
85+
<excludeFolder url="file://$MODULE_DIR$/build/tmp" />
86+
</content>
87+
<orderEntry type="jdk" jdkName="Android API 22 Platform" jdkType="Android SDK" />
88+
<orderEntry type="sourceFolder" forTests="false" />
89+
</component>
90+
</module>

app/build.gradle

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
apply plugin: 'com.android.application'
2+
3+
android {
4+
compileSdkVersion 22
5+
buildToolsVersion "21.1.2"
6+
7+
defaultConfig {
8+
applicationId "de.codecrafters.sortabletableview"
9+
minSdkVersion 11
10+
targetSdkVersion 22
11+
versionCode 1
12+
versionName "1.0"
13+
}
14+
buildTypes {
15+
release {
16+
minifyEnabled false
17+
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
18+
}
19+
}
20+
}
21+
22+
dependencies {
23+
compile fileTree(dir: 'libs', include: ['*.jar'])
24+
}

app/proguard-rules.pro

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
# Add project specific ProGuard rules here.
2+
# By default, the flags in this file are appended to flags specified
3+
# in C:\Users\Ingo\AppData\Local\Android\sdk/tools/proguard/proguard-android.txt
4+
# You can edit the include path and order by changing the proguardFiles
5+
# directive in build.gradle.
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+
#}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package de.codecrafters.sortabletableview;
2+
3+
import android.app.Application;
4+
import android.test.ApplicationTestCase;
5+
6+
/**
7+
* <a href="http://d.android.com/tools/testing/testing_android.html">Testing Fundamentals</a>
8+
*/
9+
public class ApplicationTest extends ApplicationTestCase<Application> {
10+
public ApplicationTest() {
11+
super(Application.class);
12+
}
13+
}

app/src/main/AndroidManifest.xml

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
3+
package="de.codecrafters.sortabletableview" >
4+
5+
<application
6+
android:icon="@mipmap/ic_launcher"
7+
android:label="@string/app_name"
8+
android:theme="@style/AppTheme" >
9+
<activity
10+
android:name=".MainActivity"
11+
android:label="@string/title_activity_main" >
12+
</activity>
13+
</application>
14+
15+
</manifest>
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
package de.codecrafters.sortabletableview;
2+
3+
import android.app.Activity;
4+
import android.os.Bundle;
5+
import android.view.Menu;
6+
import android.view.MenuItem;
7+
8+
9+
public class MainActivity extends Activity {
10+
11+
@Override
12+
protected void onCreate(Bundle savedInstanceState) {
13+
super.onCreate(savedInstanceState);
14+
setContentView(R.layout.activity_main);
15+
}
16+
17+
@Override
18+
public boolean onCreateOptionsMenu(Menu menu) {
19+
// Inflate the menu; this adds items to the action bar if it is present.
20+
getMenuInflater().inflate(R.menu.menu_main, menu);
21+
return true;
22+
}
23+
24+
@Override
25+
public boolean onOptionsItemSelected(MenuItem item) {
26+
// Handle action bar item clicks here. The action bar will
27+
// automatically handle clicks on the Home/Up button, so long
28+
// as you specify a parent activity in AndroidManifest.xml.
29+
int id = item.getItemId();
30+
31+
//noinspection SimplifiableIfStatement
32+
if (id == R.id.action_settings) {
33+
return true;
34+
}
35+
36+
return super.onOptionsItemSelected(item);
37+
}
38+
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package de.codecrafters.sortabletableview;
2+
3+
import android.content.Context;
4+
import android.view.View;
5+
import android.widget.TextView;
6+
7+
/**
8+
* Created by Ingo on 17.07.2015.
9+
*/
10+
public class SimpleTableHeaderAdapter implements TableHeaderAdapter {
11+
12+
private String[] headers;
13+
14+
public SimpleTableHeaderAdapter(String... headers) {
15+
this.headers = headers;
16+
}
17+
18+
@Override
19+
public View getHeaderView(Context context, int columnIndex) {
20+
TextView textView = new TextView(context);
21+
22+
if(columnIndex < headers.length) {
23+
textView.setText(headers[columnIndex]);
24+
}
25+
26+
return textView;
27+
}
28+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package de.codecrafters.sortabletableview;
2+
3+
import android.content.Context;
4+
import android.view.View;
5+
6+
/**
7+
* Created by Ingo on 17.07.2015.
8+
*/
9+
public interface TableHeaderAdapter {
10+
11+
View getHeaderView(Context context, int columnIndex);
12+
13+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package de.codecrafters.sortabletableview;
2+
3+
import android.content.Context;
4+
import android.view.ViewGroup;
5+
import android.widget.LinearLayout;
6+
7+
/**
8+
* Created by Ingo on 17.07.2015.
9+
*/
10+
class TableHeaderView extends LinearLayout {
11+
12+
public TableHeaderView(Context context) {
13+
super(context);
14+
setOrientation(LinearLayout.HORIZONTAL);
15+
16+
LayoutParams layoutParams = new LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
17+
setLayoutParams(layoutParams);
18+
}
19+
20+
}
Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
package de.codecrafters.sortabletableview;
2+
3+
import android.content.Context;
4+
import android.content.res.TypedArray;
5+
import android.util.AttributeSet;
6+
import android.view.View;
7+
import android.view.ViewGroup;
8+
import android.widget.LinearLayout;
9+
import android.widget.TextView;
10+
11+
import java.util.HashMap;
12+
import java.util.Map;
13+
import java.util.jar.Attributes;
14+
15+
/**
16+
* Created by Ingo on 17.07.2015.
17+
*/
18+
public class TableView extends LinearLayout {
19+
20+
private static final int DEFAULT_COLUMN_COUNT = 4;
21+
22+
private TableHeaderView tableHeaderView;
23+
24+
private Map<Integer, Integer> columnWeights = new HashMap<>();
25+
private int columnCount = DEFAULT_COLUMN_COUNT;
26+
27+
private TableHeaderAdapter tableHeaderAdapter = new DefaultTableHeaderAdapter();
28+
29+
30+
public TableView(Context context) {
31+
this(context, null);
32+
}
33+
34+
public TableView(Context context, AttributeSet attrs) {
35+
this(context, attrs, 0);
36+
}
37+
38+
public TableView(Context context, AttributeSet attrs, int defStyleAttr) {
39+
super(context, attrs, defStyleAttr);
40+
setOrientation(LinearLayout.VERTICAL);
41+
setAttributes(context, attrs);
42+
43+
tableHeaderView = new TableHeaderView(context);
44+
45+
for(int columnIndex=0; columnIndex<columnCount; columnIndex++) {
46+
LayoutParams headerLayoutParams = new LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
47+
headerLayoutParams.weight = 1;
48+
49+
View headerView = tableHeaderAdapter.getHeaderView(context, columnIndex);
50+
headerView.setLayoutParams(headerLayoutParams);
51+
52+
tableHeaderView.addView(headerView);
53+
}
54+
55+
addView(tableHeaderView);
56+
}
57+
58+
public void setColumnCount(int columnCount) {
59+
this.columnCount = columnCount;
60+
}
61+
62+
public void setColumnWeight(int columnIndex, int columnWeight) {
63+
columnWeights.put(columnIndex, columnWeight);
64+
}
65+
66+
private void setAttributes(Context context, AttributeSet attributes) {
67+
TypedArray styledAttributes = context.obtainStyledAttributes(attributes, R.styleable.TableView);
68+
69+
for (int i = 0; i < styledAttributes.getIndexCount(); ++i) {
70+
int attribute = styledAttributes.getIndex(i);
71+
switch (attribute) {
72+
case R.styleable.TableView_columnCount:
73+
columnCount = styledAttributes.getInt(attribute, DEFAULT_COLUMN_COUNT);
74+
break;
75+
}
76+
}
77+
styledAttributes.recycle();
78+
}
79+
80+
private static class DefaultTableHeaderAdapter implements TableHeaderAdapter {
81+
@Override
82+
public View getHeaderView(Context context, int columnIndex) {
83+
TextView textView = new TextView(context);
84+
textView.setText("Header " + columnIndex);
85+
return textView;
86+
}
87+
}
88+
89+
}

0 commit comments

Comments
 (0)