Repository: haibuzou/ExpandTable
Branch: master
Commit: 53f24cc99f7b
Files: 40
Total size: 90.4 KB
Directory structure:
gitextract_edkb4w1x/
├── .gitignore
├── README.md
├── app/
│ ├── .gitignore
│ ├── build.gradle
│ ├── libs/
│ │ └── gson-2.2.1.jar
│ ├── proguard-rules.pro
│ └── src/
│ └── main/
│ ├── AndroidManifest.xml
│ ├── java/
│ │ └── com/
│ │ └── haibuzou/
│ │ └── myapplication/
│ │ ├── MainActivity.java
│ │ ├── Utils.java
│ │ ├── adapter/
│ │ │ ├── CommonAdapter.java
│ │ │ ├── ExpandGridAdapter.java
│ │ │ ├── MyViewPagerAdapter.java
│ │ │ └── ViewHolder.java
│ │ ├── entity/
│ │ │ ├── BaseData.java
│ │ │ ├── GongZhong.java
│ │ │ └── ZhaoPin.java
│ │ └── view/
│ │ ├── CurrenPositionView.java
│ │ ├── ItemTextView.java
│ │ └── MyTextView.java
│ └── res/
│ ├── drawable/
│ │ └── main_click_selector.xml
│ ├── layout/
│ │ ├── activity_main.xml
│ │ ├── expand_grid_item.xml
│ │ ├── expand_item.xml
│ │ ├── pulldown_view.xml
│ │ ├── table_row_item.xml
│ │ └── viewpager.xml
│ ├── menu/
│ │ └── menu_main.xml
│ ├── raw/
│ │ └── zhaopin.json
│ ├── values/
│ │ ├── colors.xml
│ │ ├── dimens.xml
│ │ ├── strings.xml
│ │ └── styles.xml
│ └── values-w820dp/
│ └── dimens.xml
├── build.gradle
├── gradle/
│ └── wrapper/
│ ├── gradle-wrapper.jar
│ └── gradle-wrapper.properties
├── gradle.properties
├── gradlew
├── gradlew.bat
└── settings.gradle
================================================
FILE CONTENTS
================================================
================================================
FILE: .gitignore
================================================
#built application files
*.apk
*.ap_
# files for the dex VM
*.dex
# Java class files
*.class
# generated files
bin/
gen/
# Local configuration file (sdk path, etc)
local.properties
# Windows thumbnail db
Thumbs.db
# OSX files
.DS_Store
# Eclipse project files
.classpath
.project
# Android Studio
*.iml
.idea
#.idea/workspace.xml - remove # and delete .idea if it better suit your needs.
.gradle
build/
================================================
FILE: README.md
================================================
# ExpandTable
完全高仿58同城 点击展开的表格效果
使用tablelayout 来实现
### 效果图:

================================================
FILE: app/.gitignore
================================================
/build
================================================
FILE: app/build.gradle
================================================
apply plugin: 'com.android.application'
android {
compileSdkVersion 22
buildToolsVersion "23.0.1"
defaultConfig {
applicationId "com.haibuzou.myapplication"
minSdkVersion 14
targetSdkVersion 22
versionCode 1
versionName "1.0"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.android.support:appcompat-v7:22.2.0'
compile files('libs/gson-2.2.1.jar')
}
================================================
FILE: app/proguard-rules.pro
================================================
# Add project specific ProGuard rules here.
# By default, the flags in this file are appended to flags specified
# in D:\adt-bundle-windows-x86_64-20130917\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 *;
#}
================================================
FILE: app/src/main/AndroidManifest.xml
================================================
================================================
FILE: app/src/main/java/com/haibuzou/myapplication/MainActivity.java
================================================
package com.haibuzou.myapplication;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.util.TypedValue;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.animation.Animation;
import android.view.animation.Transformation;
import android.widget.GridView;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import android.widget.TableLayout;
import com.haibuzou.myapplication.adapter.ExpandGridAdapter;
import com.haibuzou.myapplication.adapter.MyViewPagerAdapter;
import com.haibuzou.myapplication.entity.BaseData;
import com.haibuzou.myapplication.entity.ZhaoPin;
import com.haibuzou.myapplication.view.CurrenPositionView;
import com.haibuzou.myapplication.view.MyTextView;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends Activity implements ExpandGridAdapter.OnClick {
//招聘数据
private List data;
private LinearLayout currenPositionLinear;
private final Integer duration = 200;
private RelativeLayout rel;
private String itemId;
//记录点击位置
private String clickPosition = "";
private MyTextView clicktxt;
//下拉的 圆点显示layout
private LinearLayout circlelayout;
private int lastlocation = -1;
private ExpandGridAdapter.OnClick listener;
//每行显示条目个数
private static final int NUM_LINE = 3;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initData();
initView();
}
private void initView() {
currenPositionLinear = (LinearLayout) findViewById(R.id.zp_curr_potion_linear);
for (int num = 0; num < data.size(); num++) {
ZhaoPin zhaoPin = data.get(num);
CurrenPositionView currenPositionView = new CurrenPositionView(this);
currenPositionView.setData(zhaoPin);
currenPositionView.setViewId(num);
currenPositionView.init();
if (num > 0) {
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);
params.topMargin = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 10, getResources().getDisplayMetrics());
if (num == data.size() - 1) {
params.bottomMargin = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 50, getResources().getDisplayMetrics());
}
currenPositionLinear.addView(currenPositionView, params);
} else {
currenPositionLinear.addView(currenPositionView);
}
}
}
private void initData() {
if (listener == null) {
listener = this;
}
if (data == null) {
data = Utils.getJobType(this);
}
}
public class OnItemClick implements OnClickListener, OnPageChangeListener {
private final int position;
private final int tag;
private final MyTextView view;
private final TableLayout tableLayout;
private final ZhaoPin zhaoPin;
public OnItemClick(ZhaoPin zhaoPin, int position, int tag, TableLayout table, MyTextView view) {
this.position = position;
this.tag = tag;
this.view = view;
this.tableLayout = table;
this.zhaoPin = zhaoPin;
}
@Override
public void onPageScrollStateChanged(int arg0) {
}
@Override
public void onPageScrolled(int arg0, float arg1, int arg2) {
if (lastlocation != arg0 && lastlocation != -1) {
ImageView mimage = (ImageView) circlelayout
.findViewWithTag(lastlocation + 1 + 10);
if (mimage != null) {
mimage.setImageResource(R.mipmap.black_circle);
}
}
ImageView image = (ImageView) circlelayout
.findViewWithTag(arg0 + 1 + 10);
if (image != null) {
image.setImageResource(R.mipmap.orange_circle);
}
lastlocation = arg0;
}
@Override
public void onPageSelected(int arg0) {
}
private void init(View v, int location) {
List list;
ViewPager pager = (ViewPager) v.findViewById(R.id.expand_item);
// 底部的圆点初始化
circlelayout = (LinearLayout) v.findViewById(R.id.circle_layout);
circlelayout.removeAllViews();
int radio = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 5, getResources().getDisplayMetrics());
// 初始化一个params 用于圆点大小设置
LinearLayout.LayoutParams circleparams = new LinearLayout.LayoutParams(radio, radio);
circleparams.setMargins(0, 0, 10, 0);
List views = new ArrayList<>();
// 下拉表格的行数
int row = zhaoPin.getJobtype().get(location).getJobtype().size() / NUM_LINE;
if (row > 4) {
row = 4;
} else if (row < 4) {
if (zhaoPin.getJobtype().get(location).getJobtype().size() % NUM_LINE != 0) {
row += 1;
}
}
// 计算生成 view的数量
int i = zhaoPin.getJobtype().get(location).getJobtype().size() / 12;
int len = zhaoPin.getJobtype().get(location).getJobtype().size() % 12;
if (len > 0) {
i += 1;
}
// View的 初始化
for (int n = 1; n <= i; n++) {
View view = LayoutInflater.from(MainActivity.this).inflate(R.layout.viewpager, null);
GridView grid = (GridView) view.findViewById(R.id.expand_grid);
// 计算每个 gridview 存放多少数据
if (i == 0) {
list = zhaoPin.getJobtype().get(location).getJobtype();
} else if (n < i) {
// 每一个 表只有3列 最多 4行 每个表最多12个
list = zhaoPin.getJobtype().get(location).getJobtype().subList((n - 1) * 12, n * 12);
} else {
int size = zhaoPin.getJobtype().get(location).getJobtype().size();
list = zhaoPin.getJobtype().get(location).getJobtype().subList((n - 1) * 12, size);
}
ExpandGridAdapter ea = new ExpandGridAdapter(MainActivity.this, list, R.layout.expand_grid_item);
ea.setOnClick(listener);
grid.setAdapter(ea);
views.add(grid);
if (i > 1) {
circlelayout.setVisibility(View.VISIBLE);
// viewpager 底部的 点标识
ImageView image = new ImageView(MainActivity.this);
image.setTag(n + 10);
image.setImageResource(R.mipmap.black_circle);
circlelayout.addView(image, circleparams);
} else {
circlelayout.setVisibility(View.GONE);
}
}
MyViewPagerAdapter mpa = new MyViewPagerAdapter(views);
// 宽度每一个格高度 42dp 转成px
int height = (int) (MainActivity.this.getResources().getDisplayMetrics().density * 42 + 0.5f);
RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, row * height);
pager.setLayoutParams(params);
pager.setAdapter(mpa);
pager.setOnPageChangeListener(this);
}
// 收缩动画
private void collapse(final View v) {
final int initialHeight = v.getMeasuredHeight();
Animation animation = new Animation() {
@Override
protected void applyTransformation(float interpolatedTime,
Transformation t) {
// interpolatedTime 0-1 进行变化 为1的时候表示动画已经完成
if (interpolatedTime == 1) {
v.setVisibility(View.GONE);
} else {
// 同样的原理 让控件的高度不断变化
v.getLayoutParams().height = initialHeight
- (int) (initialHeight * interpolatedTime);
v.requestLayout();
}
}
@Override
public boolean willChangeBounds() {
return true;
}
};
animation.setDuration(duration);
v.startAnimation(animation);
}
// 展开动画
private void expand(final View v, int location) {
init(v, location);
v.measure(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT);
final int targetHeight = v.getMeasuredHeight();
// 最开始显示下拉控件的时候 将高度设为0 达到不显示的效果
v.getLayoutParams().height = 0;
v.setVisibility(View.VISIBLE);
Animation animation = new Animation() {
@Override
protected void applyTransformation(float interpolatedTime,
Transformation t) {
// 不断变化高度来显示控件
v.getLayoutParams().height = (interpolatedTime == 1) ? RelativeLayout.LayoutParams.WRAP_CONTENT
: (int) (targetHeight * interpolatedTime);
v.requestLayout();
}
@Override
public boolean willChangeBounds() {
return true;
}
};
animation.setDuration(duration);
v.startAnimation(animation);
}
@Override
public void onClick(View v) {
String tempTag = (String) v.getTag();
if (rel == null) {
rel = (RelativeLayout) tableLayout.findViewWithTag(tag);
expand(rel, position);
view.isDraw(true);
} else {
if (rel.getVisibility() == View.VISIBLE) {
collapse(rel);
view.isDraw(false);
} else {
if (tempTag.equals(clickPosition)) {
expand(rel, position);
}
view.isDraw(true);
}
if (!tempTag.equals(clickPosition)) {
rel = (RelativeLayout) tableLayout.findViewWithTag(tag);
expand(rel, position);
// 上一次的箭头去除
clicktxt.isDraw(false);
view.isDraw(true);
}
}
clickPosition = tempTag;
clicktxt = view;
}
}
@Override
public void onClick(int dataId, String str) {
Intent intent = new Intent();
intent.putExtra("id", dataId);
intent.putExtra("value", str);
setResult(RESULT_OK, intent);
finish();
}
}
================================================
FILE: app/src/main/java/com/haibuzou/myapplication/Utils.java
================================================
package com.haibuzou.myapplication;
import android.content.Context;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import com.haibuzou.myapplication.entity.ZhaoPin;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.util.List;
/**
* Created by AAA on 2015/6/16.
*/
public class Utils {
public static List getJobType(Context context) {
String result = readFileFromRaw(context, R.raw.zhaopin);
if (result != null) {
Gson gson = new Gson();
return gson.fromJson(result, new TypeToken>() {
}.getType());
}
return null;
}
/**
* 读取Raw文件夹下文本类型文件
*
* @param context 上下文
* @param resourceId 资源id
* @return 返回的读取完成的数据 string格式
*/
public static String readFileFromRaw(Context context, int resourceId) {
if (null == context || resourceId < 0) {
return null;
}
String result = null;
try {
InputStream input = context.getResources().openRawResource(resourceId);
ByteArrayOutputStream output = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int length;
while ((length = input.read(buffer)) != -1) {
output.write(buffer, 0, length);
}
output.close();
input.close();
return output.toString();
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
}
================================================
FILE: app/src/main/java/com/haibuzou/myapplication/adapter/CommonAdapter.java
================================================
package com.haibuzou.myapplication.adapter;
import java.util.ArrayList;
import java.util.List;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
public abstract class CommonAdapter extends BaseAdapter {
protected LayoutInflater mInflater;
protected Context mContext;
protected List mDatas;
protected final int mItemLayoutId;
public CommonAdapter(Context context, int itemLayoutId) {
this.mContext = context;
this.mInflater = LayoutInflater.from(mContext);
this.mDatas = new ArrayList();
this.mItemLayoutId = itemLayoutId;
}
public CommonAdapter(Context context, List mDatas, int itemLayoutId) {
this.mContext = context;
this.mInflater = LayoutInflater.from(mContext);
this.mDatas = mDatas;
this.mItemLayoutId = itemLayoutId;
}
@Override
public int getCount() {
return mDatas != null ? mDatas.size() : 0;
}
@Override
public T getItem(int position) {
return mDatas.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
final ViewHolder viewHolder = getViewHolder(position, convertView,
parent);
convert(viewHolder, getItem(position));
return viewHolder.getConvertView();
}
public abstract void convert(ViewHolder helper, T item);
private ViewHolder getViewHolder(int position, View convertView,
ViewGroup parent) {
return ViewHolder.get(mContext, convertView, parent, mItemLayoutId,
position);
}
}
================================================
FILE: app/src/main/java/com/haibuzou/myapplication/adapter/ExpandGridAdapter.java
================================================
package com.haibuzou.myapplication.adapter;
import java.util.List;
import android.content.Context;
import android.view.View;
import android.view.View.OnClickListener;
import com.haibuzou.myapplication.R;
import com.haibuzou.myapplication.entity.BaseData;
/**
* Created by AAA on 2015/6/16.
*/
public class ExpandGridAdapter extends CommonAdapter {
private OnClick listener;
public ExpandGridAdapter(Context context, List mDatas,
int itemLayoutId) {
super(context, mDatas, itemLayoutId);
}
@Override
public void convert(ViewHolder helper, final BaseData item) {
helper.setText(R.id.expand_grid_txt, item.getName());
View view = helper.getView(R.id.expand_grid_txt);
view.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if (listener != null) {
listener.onClick(item.getDataId(), item.getName());
}
}
});
}
public interface OnClick {
void onClick(int dataId, String str);
}
public void setOnClick(OnClick listener) {
this.listener = listener;
}
}
================================================
FILE: app/src/main/java/com/haibuzou/myapplication/adapter/MyViewPagerAdapter.java
================================================
package com.haibuzou.myapplication.adapter;
import android.support.v4.view.ViewPager;
import android.view.View;
import java.util.List;
public class MyViewPagerAdapter extends android.support.v4.view.PagerAdapter {
private final List mlistViews;
public MyViewPagerAdapter(List mlistViews) {
this.mlistViews = mlistViews;
}
@Override
public int getCount() {
return mlistViews.size();
}
@Override
public int getItemPosition(Object object) {
return super.getItemPosition(object);
}
@Override
public Object instantiateItem(View container, int position) {
((ViewPager) container).addView(mlistViews.get(position));
return mlistViews.get(position);
}
@Override
public void destroyItem(View arg0, int arg1, Object arg2) {
((ViewPager) arg0).removeView(mlistViews.get(arg1));
}
@Override
public boolean isViewFromObject(View arg0, Object arg1) {
return arg0 == arg1;
}
}
================================================
FILE: app/src/main/java/com/haibuzou/myapplication/adapter/ViewHolder.java
================================================
package com.haibuzou.myapplication.adapter;
import java.lang.ref.SoftReference;
import java.lang.reflect.Constructor;
import android.content.Context;
import android.graphics.Bitmap;
import android.util.SparseArray;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
public class ViewHolder {
private final SparseArray> mViews;
private final SparseArray> childViews;
private int mPosition;
private final View mConvertView;
private final ViewGroup parent;
private ViewHolder(Context context, ViewGroup parent, int layoutId,
int position) {
this.mPosition = position;
this.parent = parent;
this.mViews = new SparseArray>();
this.childViews = new SparseArray>();
mConvertView = LayoutInflater.from(context).inflate(layoutId, parent,
false);
// setTag
mConvertView.setTag(this);
}
private ViewHolder(Context context, ViewGroup parent, View view,
int position) {
this.mPosition = position;
this.parent = parent;
this.mViews = new SparseArray>();
this.childViews = new SparseArray>();
mConvertView = view;
// setTag
mConvertView.setTag(this);
}
@SuppressWarnings("unchecked")
public static T get(View view, int id) {
SparseArray viewHolder = (SparseArray) view.getTag();
if (viewHolder == null) {
viewHolder = new SparseArray();
view.setTag(viewHolder);
}
View childView = viewHolder.get(id);
if (childView == null) {
childView = view.findViewById(id);
viewHolder.put(id, childView);
}
return (T) childView;
}
/**
* 拿到一个ViewHolder对象
*
* @param context
* @param convertView item view
* @param parent 父控件
* @param layoutId 布局id
* @param position 位置
* @return
*/
public static ViewHolder get(Context context, View convertView,
ViewGroup parent, int layoutId, int position) {
ViewHolder holder;
if (convertView == null) {
holder = new ViewHolder(context, parent, layoutId, position);
} else {
holder = (ViewHolder) convertView.getTag();
holder.mPosition = position;
}
return holder;
}
/**
* 拿到一个ViewHolder对象
*
* @param context
* @param convertView
* @param parent 母控件
* @param position 点击位置
* @return
*/
public static ViewHolder get(Context context, View convertView,
ViewGroup parent, Class extends View> view, int position) throws Exception {
ViewHolder holder;
if (convertView == null) {
Constructor> constructor = view.getConstructor(Context.class);
View contentView = (View) constructor.newInstance(context);
holder = new ViewHolder(context, parent, contentView, position);
} else {
holder = (ViewHolder) convertView.getTag();
holder.mPosition = position;
}
return holder;
}
public View getConvertView() {
return mConvertView;
}
/**
* 通过控件的Id获取对于的控件,如果没有则加入views
*
* @param viewId
* @return
*/
public T getView(int viewId) {
View view = mViews.get(viewId) != null ? mViews.get(viewId).get() : null;
if (view == null) {
view = mConvertView.findViewById(viewId);
mViews.put(viewId, new SoftReference(view));
}
return (T) view;
}
/**
* 为TextView设置字符串
*
* @param viewId
* @param text
* @return
*/
public ViewHolder setText(int viewId, String text) {
TextView view = getView(viewId);
view.setText(text);
return this;
}
/**
* 为ImageView设置图片
*
* @param viewId
* @param drawableId
* @return
*/
public ViewHolder setImageResource(int viewId, int drawableId) {
ImageView view = getView(viewId);
view.setImageResource(drawableId);
return this;
}
/**
* 为ImageView设置图片
*
* @param viewId
* @param bm
* @return
*/
public ViewHolder setImageBitmap(int viewId, Bitmap bm) {
ImageView view = getView(viewId);
view.setImageBitmap(bm);
return this;
}
/**
* 临时创建view,但不显示
*
* @param viewId view的 id
* @param childView 子view
*/
public void setChildView(int viewId, View childView) {
if (getView(viewId) == null) {
return;
}
childViews.put(viewId, new SoftReference(childView));
}
/**
* 获取子view
*
* @param viewId
*/
public T getChildView(int viewId) {
View view = childViews.get(viewId) != null ? childViews.get(viewId).get() : null;
return (T) view;
}
public ViewGroup getParent() {
return parent;
}
public int getPosition() {
return mPosition;
}
}
================================================
FILE: app/src/main/java/com/haibuzou/myapplication/entity/BaseData.java
================================================
package com.haibuzou.myapplication.entity;
/**
* Created by AAA on 2015/6/16.
*/
public class BaseData {
private int dataId;
private String name;
public BaseData() {
}
public BaseData(int id, String name) {
this.dataId = id;
this.name = name;
}
public int getDataId() {
return dataId;
}
public void setDataId(int dataId) {
this.dataId = dataId;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
================================================
FILE: app/src/main/java/com/haibuzou/myapplication/entity/GongZhong.java
================================================
package com.haibuzou.myapplication.entity;
import java.util.List;
/**
* Created by AAA on 2015/6/16.
*/
public class GongZhong extends BaseData {
public GongZhong(int id, String name) {
super(id, name);
}
private List jobtype;
public List getJobtype() {
return jobtype;
}
public void setJobtype(List jobtype) {
this.jobtype = jobtype;
}
}
================================================
FILE: app/src/main/java/com/haibuzou/myapplication/entity/ZhaoPin.java
================================================
package com.haibuzou.myapplication.entity;
import java.util.List;
/**
* Created by Administrator on 2015/6/16.
*/
public class ZhaoPin extends BaseData {
public ZhaoPin(int id, String name) {
super(id, name);
}
private List jobtype;
public List getJobtype() {
return jobtype;
}
public void setJobtype(List jobtype) {
this.jobtype = jobtype;
}
}
================================================
FILE: app/src/main/java/com/haibuzou/myapplication/view/CurrenPositionView.java
================================================
package com.haibuzou.myapplication.view;
import android.content.Context;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.LinearLayout;
import android.widget.TableLayout;
import android.widget.TableRow;
import android.widget.TextView;
import com.haibuzou.myapplication.MainActivity;
import com.haibuzou.myapplication.R;
import com.haibuzou.myapplication.entity.ZhaoPin;
public class CurrenPositionView extends LinearLayout {
//每行item个数
private static final int ROW_NUM = 3;
private TextView titleView;
private ZhaoPin data;
private TableLayout tableLayout;
private LayoutInflater layoutInflater;
private int viewId;
public CurrenPositionView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
public CurrenPositionView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public CurrenPositionView(Context context) {
super(context);
}
public ZhaoPin getData() {
return data;
}
public void setData(ZhaoPin data) {
this.data = data;
}
private void initView() {
layoutInflater = LayoutInflater.from(getContext());
View rootView = layoutInflater.inflate(R.layout.pulldown_view, this);
titleView = (TextView) rootView.findViewById(R.id.job_name_text);
tableLayout = (TableLayout) rootView.findViewById(R.id.job_name_table);
tableLayout.setStretchAllColumns(true);
setTitleStr(data.getName());
//初始化表格数据
int h = data.getJobtype().size() / ROW_NUM;
int len = data.getJobtype().size() % ROW_NUM;
int location = 0;
if (len != 0)
h += 1;
for (int n = 1; n <= h; n++) {
TableRow row = new TableRow(getContext());
int length = n == h ? len : ROW_NUM;
for (int m = 0; m < length; m++) {
MyTextView mview = (MyTextView) layoutInflater.inflate(R.layout.table_row_item, null);
mview.setText(data.getJobtype().get(location).getName());
mview.setTag("" + viewId + location);
mview.setOnClickListener(((MainActivity) getContext()).new OnItemClick(data, location, n, tableLayout, mview));
row.addView(mview);
location++;
}
// 每一列 tablerow 增加一个 下拉的layout
View view = layoutInflater.inflate(R.layout.expand_item, null);
view.setTag(n);
view.setVisibility(View.GONE);
tableLayout.addView(row);
tableLayout.addView(view);
}
}
public void init() {
initView();
}
public void setTitleStr(CharSequence text) {
titleView.setText(text);
}
public int getViewId() {
return viewId;
}
public void setViewId(int viewId) {
this.viewId = viewId;
}
}
================================================
FILE: app/src/main/java/com/haibuzou/myapplication/view/ItemTextView.java
================================================
package com.haibuzou.myapplication.view;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.widget.TextView;
/**
* Created by Administrator on 2015/6/17.
*/
public class ItemTextView extends TextView {
private final Paint paint;
private int mwidth;
private int mheight;
public ItemTextView(Context context, AttributeSet attrs) {
super(context, attrs);
paint = new Paint();
paint.setColor(Color.BLACK);
paint.setStyle(Paint.Style.STROKE);
}
@Override
protected void onDraw(Canvas canvas) {
canvas.drawLine(0, mheight - 1, mwidth - 1, mheight - 1, paint);
canvas.drawLine(mwidth - 1, mheight - 1, mwidth - 1, 0, paint);
super.onDraw(canvas);
}
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
mwidth = w;
mheight = h;
}
}
================================================
FILE: app/src/main/java/com/haibuzou/myapplication/view/MyTextView.java
================================================
package com.haibuzou.myapplication.view;
import android.content.Context;
import android.widget.TextView;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Paint.Align;
import android.graphics.Path;
import android.util.AttributeSet;
import android.util.TypedValue;
/**
* Created by AAA on 2015/6/16.
*/
public class MyTextView extends TextView {
private Paint txtpaint;
private Paint linepaint;
private Paint tripaint;
private Path path;
private Boolean isDraw;
private float textSize;
public MyTextView(Context context) {
super(context);
}
public MyTextView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init(context, attrs);
}
public MyTextView(Context context, AttributeSet attrs) {
super(context, attrs);
init(context, attrs);
}
private void init(Context context, AttributeSet attrs) {
txtpaint = new Paint();
path = new Path();
txtpaint.setColor(Color.BLACK);
txtpaint.setTextSize(textSize);
txtpaint.setTextAlign(Align.LEFT);
linepaint = new Paint();
linepaint.setColor(Color.LTGRAY);
linepaint.setStyle(Paint.Style.STROKE);
tripaint = new Paint();
tripaint.setColor(Color.GRAY);
isDraw = false;
}
@Override
protected void onDraw(Canvas canvas) {
canvas.drawRect(0, 0, getWidth(), getHeight(), linepaint);
int len = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,
7, getResources().getDisplayMetrics());
if (isDraw) {
path.moveTo(getWidth() / 2, getHeight() - len);
path.lineTo(getWidth() / 2 - len, getHeight());
path.lineTo(getWidth() / 2 + len, getHeight());
canvas.drawPath(path, tripaint);
}
super.onDraw(canvas);
}
public void isDraw(boolean isDraw) {
this.isDraw = isDraw;
postInvalidate();
}
}
================================================
FILE: app/src/main/res/drawable/main_click_selector.xml
================================================
================================================
FILE: app/src/main/res/layout/activity_main.xml
================================================
================================================
FILE: app/src/main/res/layout/expand_grid_item.xml
================================================
================================================
FILE: app/src/main/res/layout/expand_item.xml
================================================
================================================
FILE: app/src/main/res/layout/pulldown_view.xml
================================================
================================================
FILE: app/src/main/res/layout/table_row_item.xml
================================================
================================================
FILE: app/src/main/res/layout/viewpager.xml
================================================
================================================
FILE: app/src/main/res/menu/menu_main.xml
================================================
================================================
FILE: app/src/main/res/raw/zhaopin.json
================================================
[
{
"dataId": "120000",
"name": "技术/制造岗位",
"jobtype": [
{
"dataId": "120100",
"name": "技工/普工",
"jobtype": [
{
"dataId": "120101",
"name": "普工/操作工"
},
{
"dataId": "120102",
"name": "车床工"
},
{
"dataId": "120103",
"name": "铣刨"
},
{
"dataId": "120104",
"name": "钣铆冲铸"
},
{
"dataId": "120105",
"name": "钳工"
},
{
"dataId": "120106",
"name": "焊工"
},
{
"dataId": "120107",
"name": "磨床工"
},
{
"dataId": "120108",
"name": "火花机工"
},
{
"dataId": "120109",
"name": "裁剪车"
},
{
"dataId": "120110",
"name": "缝熨烫"
},
{
"dataId": "120111",
"name": "打磨/抛光"
},
{
"dataId": "120112",
"name": "空调/电梯工"
},
{
"dataId": "120113",
"name": "汽摩维修员"
},
{
"dataId": "120114",
"name": "水/木/油漆工"
},
{
"dataId": "120115",
"name": "电工"
},
{
"dataId": "120116",
"name": "锅炉工"
},
{
"dataId": "120117",
"name": "锁具修理工"
},
{
"dataId": "120118",
"name": "叉车工"
},
{
"dataId": "120119",
"name": "模具工"
},
{
"dataId": "120120",
"name": "手机维修"
},
{
"dataId": "120121",
"name": "包装工"
},
{
"dataId": "120122",
"name": "水泥工"
},
{
"dataId": "120123",
"name": "钢筋工"
},
{
"dataId": "120124",
"name": "管道工"
},
{
"dataId": "120125",
"name": "瓦工"
},
{
"dataId": "120126",
"name": "组装工"
},
{
"dataId": "120127",
"name": "样衣工"
},
{
"dataId": "120128",
"name": "染工"
},
{
"dataId": "120129",
"name": "纺织工"
},
{
"dataId": "120130",
"name": "印花工"
},
{
"dataId": "120131",
"name": "其他"
}
]
},
{
"dataId": "120200",
"name": "生产/研发",
"jobtype": [
{
"dataId": "120201",
"name": "生产文员 "
},
{
"dataId": "120202",
"name": "组长/拉长 "
},
{
"dataId": "120203",
"name": "物控/物料员"
},
{
"dataId": "120204",
"name": "储备干部"
},
{
"dataId": "120205",
"name": "质量管理"
},
{
"dataId": "120206",
"name": "生产组长"
},
{
"dataId": "120207",
"name": "主任"
},
{
"dataId": "120208",
"name": "高级工程师"
},
{
"dataId": "120209",
"name": "设备管理"
},
{
"dataId": "120210",
"name": "工艺设计"
},
{
"dataId": "120211",
"name": "生产计划"
},
{
"dataId": "120212",
"name": "化验/检验"
},
{
"dataId": "120213",
"name": "厂长/副厂长"
},
{
"dataId": "120214",
"name": "生产总监"
},
{
"dataId": "120215",
"name": "维修工程师"
},
{
"dataId": "120216",
"name": "工业工程师"
},
{
"dataId": "120217",
"name": "材料工程师"
},
{
"dataId": "120218",
"name": "技术工程师"
},
{
"dataId": "120219",
"name": "其他"
}
]
},
{
"dataId": "120300",
"name": "机械/仪表",
"jobtype": [
{
"dataId": "120301",
"name": "机械工程"
},
{
"dataId": "120302",
"name": "仪器仪表"
},
{
"dataId": "120303",
"name": "机电"
},
{
"dataId": "120304",
"name": "版图设计"
},
{
"dataId": "120305",
"name": "研发工程师"
},
{
"dataId": "120306",
"name": "机械测试"
},
{
"dataId": "120307",
"name": "其他"
}
]
},
{
"dataId": "120400",
"name": "建筑/装修",
"jobtype": [
{
"dataId": "120401",
"name": "土木工程"
},
{
"dataId": "120402",
"name": "工程监理"
},
{
"dataId": "120403",
"name": "项目管理"
},
{
"dataId": "120404",
"name": "总工程师"
},
{
"dataId": "120405",
"name": "造价师"
},
{
"dataId": "120406",
"name": "幕墙工程师"
},
{
"dataId": "120407",
"name": "安防工程师"
},
{
"dataId": "120408",
"name": "安全管理"
},
{
"dataId": "120409",
"name": "道路桥梁"
},
{
"dataId": "120410",
"name": "给排水暖通"
},
{
"dataId": "120411",
"name": "测绘员"
},
{
"dataId": "120412",
"name": "园林设计"
},
{
"dataId": "120413",
"name": "资料员"
},
{
"dataId": "120414",
"name": "综合布线"
},
{
"dataId": "120415",
"name": "市政工程师"
},
{
"dataId": "120416",
"name": "其他"
}
]
},
{
"dataId": "120500",
"name": "电子/电气",
"jobtype": [
{
"dataId": "120501",
"name": "电子电气"
},
{
"dataId": "120502",
"name": "自动化"
},
{
"dataId": "120503",
"name": "电路工程师"
},
{
"dataId": "120504",
"name": "无线电"
},
{
"dataId": "120505",
"name": "电气测试"
},
{
"dataId": "120506",
"name": "产品工艺"
},
{
"dataId": "120507",
"name": "音频/视频"
},
{
"dataId": "120508",
"name": "灯光照明"
},
{
"dataId": "120509",
"name": "研发工程师"
},
{
"dataId": "120510",
"name": "电子维修"
},
{
"dataId": "120511",
"name": "其他"
}
]
},
{
"dataId": "120600",
"name": "质控/安防",
"jobtype": [
{
"dataId": "120601",
"name": "质量管理"
},
{
"dataId": "120602",
"name": "安全消防"
},
{
"dataId": "120603",
"name": "质检"
},
{
"dataId": "120604",
"name": "安防测试"
},
{
"dataId": "120605",
"name": "认证工程师"
},
{
"dataId": "120606",
"name": "安防管理"
},
{
"dataId": "120607",
"name": "其他"
}
]
},
{
"dataId": "120700",
"name": "制药/生工",
"jobtype": [
{
"dataId": "120701",
"name": "临床研究"
},
{
"dataId": "120702",
"name": "医药研发"
},
{
"dataId": "120703",
"name": "生工"
},
{
"dataId": "120704",
"name": "医疗器械"
},
{
"dataId": "120705",
"name": "其他"
}
]
},
{
"dataId": "120800",
"name": "服装/食品",
"jobtype": [
{
"dataId": "120801",
"name": "服装设计师"
},
{
"dataId": "120802",
"name": "打样制版"
},
{
"dataId": "120803",
"name": "样衣工"
},
{
"dataId": "120804",
"name": "生产管理"
},
{
"dataId": "120805",
"name": "食品研发"
},
{
"dataId": "120806",
"name": "样板出格师"
},
{
"dataId": "120807",
"name": "电脑放码员"
},
{
"dataId": "120808",
"name": "纸样师"
},
{
"dataId": "120809",
"name": "纺织品设计"
},
{
"dataId": "120810",
"name": "其他"
}
]
},
{
"dataId": "120900",
"name": "农林牧渔",
"jobtype": [
{
"dataId": "120901",
"name": "养殖人员"
},
{
"dataId": "120902",
"name": "饲料业务"
},
{
"dataId": "120903",
"name": "农艺师"
},
{
"dataId": "120904",
"name": "畜牧师"
},
{
"dataId": "120905",
"name": "场长"
},
{
"dataId": "120906",
"name": "养殖部主管"
},
{
"dataId": "120907",
"name": "饲料研发"
},
{
"dataId": "120908",
"name": "其他"
}
]
},
{
"dataId": "121100",
"name": "环境保护",
"jobtype": [
{
"dataId": "121101",
"name": "污水处理"
},
{
"dataId": "121102",
"name": "环保检测"
},
{
"dataId": "121103",
"name": "工程师"
},
{
"dataId": "121104",
"name": "环境管理"
},
{
"dataId": "121105",
"name": "环保技术"
},
{
"dataId": "121106",
"name": "EHS管理"
},
{
"dataId": "121107",
"name": "环保工程师"
},
{
"dataId": "121108",
"name": "水质检测员"
},
{
"dataId": "121109",
"name": "环境绿化"
},
{
"dataId": "121110",
"name": "其他"
}
]
},
{
"dataId": "121000",
"name": "汽车",
"jobtype": [
{
"dataId": "121001",
"name": "汽车修理"
},
{
"dataId": "121002",
"name": "汽车美容"
},
{
"dataId": "121003",
"name": "洗车工"
},
{
"dataId": "121004",
"name": "轮胎工"
},
{
"dataId": "121005",
"name": "汽车设计"
},
{
"dataId": "121006",
"name": "装配工艺"
},
{
"dataId": "121007",
"name": "机械工程师"
},
{
"dataId": "121008",
"name": "电子工程师"
},
{
"dataId": "121009",
"name": "4S店管理"
},
{
"dataId": "121010",
"name": "汽车检验"
},
{
"dataId": "121011",
"name": "二手车评估"
},
{
"dataId": "121012",
"name": "总装工程师"
},
{
"dataId": "121013",
"name": "安全性能"
},
{
"dataId": "121014",
"name": "理赔专员"
},
{
"dataId": "121015",
"name": "停车管理员"
},
{
"dataId": "121016",
"name": "加油站工人"
},
{
"dataId": "121017",
"name": "其他"
}
]
}
]
},
{
"dataId": "110000",
"name": "生活服务岗位",
"jobtype": [
{
"dataId": "110100",
"name": "餐饮服务",
"jobtype": [
{
"dataId": "110101",
"name": "厨师"
},
{
"dataId": "110102",
"name": "面点师"
},
{
"dataId": "110103",
"name": "服务员"
},
{
"dataId": "110104",
"name": "传菜员"
},
{
"dataId": "110105",
"name": "配菜打荷"
},
{
"dataId": "110106",
"name": "洗碗工"
},
{
"dataId": "110107",
"name": "后厨"
},
{
"dataId": "110108",
"name": "茶艺师"
},
{
"dataId": "110109",
"name": "咖啡师"
},
{
"dataId": "110110",
"name": "迎宾"
},
{
"dataId": "110111",
"name": "大堂经理"
},
{
"dataId": "110112",
"name": "预订员"
},
{
"dataId": "110113",
"name": "送餐员"
},
{
"dataId": "110114",
"name": "餐饮管理"
},
{
"dataId": "110115",
"name": "学徒"
},
{
"dataId": "110116",
"name": "杂工"
},
{
"dataId": "110117",
"name": "其他"
}
]
},
{
"dataId": "110200",
"name": "酒店/旅游",
"jobtype": [
{
"dataId": "110201",
"name": "酒店前台"
},
{
"dataId": "110202",
"name": "客房服务员"
},
{
"dataId": "110203",
"name": "楼面经理"
},
{
"dataId": "110204",
"name": "行李员"
},
{
"dataId": "110205",
"name": "救生员"
},
{
"dataId": "110206",
"name": "酒店管理"
},
{
"dataId": "110207",
"name": "订票员"
},
{
"dataId": "110208",
"name": "导游"
},
{
"dataId": "110209",
"name": "计调"
},
{
"dataId": "110210",
"name": "签证专员"
},
{
"dataId": "110211",
"name": "旅游顾问"
},
{
"dataId": "110212",
"name": "其他"
}
]
},
{
"dataId": "110300",
"name": "超市/零售",
"jobtype": [
{
"dataId": "110301",
"name": "促销导购"
},
{
"dataId": "110302",
"name": "营业员"
},
{
"dataId": "110303",
"name": "收银员"
},
{
"dataId": "110304",
"name": "理货员"
},
{
"dataId": "110305",
"name": "防损员"
},
{
"dataId": "110306",
"name": "店长"
},
{
"dataId": "110307",
"name": "招商经理"
},
{
"dataId": "110308",
"name": "奢侈品业务"
},
{
"dataId": "110309",
"name": "品类管理"
},
{
"dataId": "110310",
"name": "食品加工"
},
{
"dataId": "110311",
"name": "督导"
},
{
"dataId": "110312",
"name": "其他"
}
]
},
{
"dataId": "110400",
"name": "美容/美发",
"jobtype": [
{
"dataId": "110401",
"name": "发型师"
},
{
"dataId": "110402",
"name": "美容师"
},
{
"dataId": "110403",
"name": "化妆师"
},
{
"dataId": "110404",
"name": "美发助理"
},
{
"dataId": "110405",
"name": "洗头工"
},
{
"dataId": "110406",
"name": "美容助理"
},
{
"dataId": "110407",
"name": "美甲师"
},
{
"dataId": "110408",
"name": "美体师"
},
{
"dataId": "110409",
"name": "美容导师"
},
{
"dataId": "110410",
"name": "美容店长"
},
{
"dataId": "110411",
"name": "美容顾问"
},
{
"dataId": "110412",
"name": "彩妆培训师"
},
{
"dataId": "110413",
"name": "宠物美容"
},
{
"dataId": "110414",
"name": "其他"
}
]
},
{
"dataId": "110500",
"name": "保健/按摩",
"jobtype": [
{
"dataId": "110501",
"name": "按摩师"
},
{
"dataId": "110502",
"name": "针灸推拿"
},
{
"dataId": "110503",
"name": "足疗师"
},
{
"dataId": "110504",
"name": "搓澡工"
},
{
"dataId": "110505",
"name": "其他"
}
]
},
{
"dataId": "110600",
"name": "运动/健身",
"jobtype": [
{
"dataId": "110601",
"name": "健身教练"
},
{
"dataId": "110602",
"name": "瑜伽老师"
},
{
"dataId": "110603",
"name": "舞蹈师"
},
{
"dataId": "110604",
"name": "游泳教练"
},
{
"dataId": "110605",
"name": "台球教练"
},
{
"dataId": "110606",
"name": "高尔夫助理"
},
{
"dataId": "110607",
"name": "其他"
}
]
},
{
"dataId": "110700",
"name": "淘宝招聘",
"jobtype": [
{
"dataId": "110701",
"name": "淘宝客服"
},
{
"dataId": "110702",
"name": "淘宝美工"
},
{
"dataId": "110703",
"name": "淘宝店长"
},
{
"dataId": "110704",
"name": "店铺编辑"
},
{
"dataId": "110705",
"name": "店铺推广"
},
{
"dataId": "110706",
"name": "活动策划"
},
{
"dataId": "110707",
"name": "其他"
}
]
},
{
"dataId": "110800",
"name": "家政/安保",
"jobtype": [
{
"dataId": "110801",
"name": "保洁"
},
{
"dataId": "110802",
"name": "保姆"
},
{
"dataId": "110803",
"name": "保安"
},
{
"dataId": "110804",
"name": "月嫂"
},
{
"dataId": "110805",
"name": "育婴师"
},
{
"dataId": "110806",
"name": "洗衣工"
},
{
"dataId": "110807",
"name": "钟点工"
},
{
"dataId": "110808",
"name": "送水工"
},
{
"dataId": "110809",
"name": "护工"
},
{
"dataId": "110810",
"name": "其他"
}
]
},
{
"dataId": "110900",
"name": "物业管理",
"jobtype": [
{
"dataId": "110901",
"name": "物业维修"
},
{
"dataId": "110902",
"name": "物业经理"
},
{
"dataId": "110903",
"name": "物业管理员"
},
{
"dataId": "110904",
"name": "合同管理"
},
{
"dataId": "110905",
"name": "招商经理"
},
{
"dataId": "110906",
"name": "其他"
}
]
},
{
"dataId": "111000",
"name": "教育/培训",
"jobtype": [
{
"dataId": "111001",
"name": "教师/助教"
},
{
"dataId": "111002",
"name": "家教"
},
{
"dataId": "111003",
"name": "培训师"
},
{
"dataId": "111004",
"name": "幼教"
},
{
"dataId": "111005",
"name": "培训策划"
},
{
"dataId": "111006",
"name": "培训助理"
},
{
"dataId": "111007",
"name": "教务管理"
},
{
"dataId": "111008",
"name": "教具开发"
},
{
"dataId": "111009",
"name": "学术研究"
},
{
"dataId": "111010",
"name": "课程顾问"
},
{
"dataId": "111011",
"name": "校长"
},
{
"dataId": "111012",
"name": "拓展训练师"
},
{
"dataId": "111013",
"name": "其他"
}
]
},
{
"dataId": "111100",
"name": "娱乐/影视",
"jobtype": [
{
"dataId": "111101",
"name": "礼仪"
},
{
"dataId": "111102",
"name": "调酒师"
},
{
"dataId": "111103",
"name": "摄影师"
},
{
"dataId": "111104",
"name": "酒吧服务员"
},
{
"dataId": "111105",
"name": "歌厅服务员"
},
{
"dataId": "111106",
"name": "主持人"
},
{
"dataId": "111107",
"name": "音效师"
},
{
"dataId": "111108",
"name": "后期制作"
},
{
"dataId": "111109",
"name": "配音员"
},
{
"dataId": "111110",
"name": "放映员"
},
{
"dataId": "111111",
"name": "灯光师"
},
{
"dataId": "111112",
"name": "其他"
}
]
},
{
"dataId": "111200",
"name": "医疗/药剂",
"jobtype": [
{
"dataId": "111201",
"name": "医生"
},
{
"dataId": "111202",
"name": "护士"
},
{
"dataId": "111203",
"name": "药剂师"
},
{
"dataId": "111204",
"name": "保健医生"
},
{
"dataId": "111205",
"name": "心理医生"
},
{
"dataId": "111206",
"name": "导医"
},
{
"dataId": "111207",
"name": "护士长"
},
{
"dataId": "111208",
"name": "理疗师"
},
{
"dataId": "111209",
"name": "医药质检"
},
{
"dataId": "111210",
"name": "医疗管理"
},
{
"dataId": "111211",
"name": "美容整形师"
},
{
"dataId": "111212",
"name": "验光师"
},
{
"dataId": "111213",
"name": "营养师"
},
{
"dataId": "111214",
"name": "宠物医生"
},
{
"dataId": "111215",
"name": "其他"
}
]
}
]
},
{
"dataId": "100000",
"name": "商务服务岗位",
"jobtype": [
{
"dataId": "100100",
"name": "销售",
"jobtype": [
{
"dataId": "100101",
"name": "销售代表"
},
{
"dataId": "100102",
"name": "电话销售"
},
{
"dataId": "100103",
"name": "销售经理"
},
{
"dataId": "100104",
"name": "销售助理"
},
{
"dataId": "100105",
"name": "销售总监"
},
{
"dataId": "100106",
"name": "销售支持"
},
{
"dataId": "100107",
"name": "汽车销售"
},
{
"dataId": "100108",
"name": "医药代表"
},
{
"dataId": "100109",
"name": "器械销售"
},
{
"dataId": "100110",
"name": "网络销售"
},
{
"dataId": "100111",
"name": "团购销售"
},
{
"dataId": "100112",
"name": "区域销售"
},
{
"dataId": "100113",
"name": "渠道专员"
},
{
"dataId": "100114",
"name": "渠道经理"
},
{
"dataId": "100115",
"name": "客户经理"
},
{
"dataId": "100116",
"name": "大客户经理"
},
{
"dataId": "100117",
"name": "会籍顾问"
},
{
"dataId": "100118",
"name": "其他"
}
]
},
{
"dataId": "100200",
"name": "客服",
"jobtype": [
{
"dataId": "100201",
"name": "客服专员"
},
{
"dataId": "100202",
"name": "电话客服"
},
{
"dataId": "100203",
"name": "客服经理"
},
{
"dataId": "100204",
"name": "客服总监"
},
{
"dataId": "100205",
"name": "售后服务"
},
{
"dataId": "100206",
"name": "客户关系"
},
{
"dataId": "100207",
"name": "其他"
}
]
},
{
"dataId": "100300",
"name": "人事/行政",
"jobtype": [
{
"dataId": "100301",
"name": "文员"
},
{
"dataId": "100302",
"name": "前台"
},
{
"dataId": "100303",
"name": "秘书"
},
{
"dataId": "100304",
"name": "人事专员"
},
{
"dataId": "100305",
"name": "人事经理"
},
{
"dataId": "100306",
"name": "人事总监"
},
{
"dataId": "100307",
"name": "行政助理"
},
{
"dataId": "100308",
"name": "行政主管"
},
{
"dataId": "100309",
"name": "行政总监"
},
{
"dataId": "100310",
"name": "薪酬绩效"
},
{
"dataId": "100311",
"name": "招聘专员"
},
{
"dataId": "100312",
"name": "招聘经理"
},
{
"dataId": "100313",
"name": "猎头顾问"
},
{
"dataId": "100314",
"name": "培训专员"
},
{
"dataId": "100315",
"name": "培训经理"
},
{
"dataId": "100316",
"name": "后期管理"
},
{
"dataId": "100317",
"name": "其他"
}
]
},
{
"dataId": "100400",
"name": "司机",
"jobtype": [
{
"dataId": "100401",
"name": "商务司机"
},
{
"dataId": "100402",
"name": "货运司机"
},
{
"dataId": "100403",
"name": "客运司机"
},
{
"dataId": "100404",
"name": "出租车司机"
},
{
"dataId": "100405",
"name": "班车司机"
},
{
"dataId": "100406",
"name": "特种车司机"
},
{
"dataId": "100407",
"name": "驾校教练"
},
{
"dataId": "100408",
"name": "其他"
}
]
},
{
"dataId": "100500",
"name": "物流/仓储",
"jobtype": [
{
"dataId": "100501",
"name": "快递员"
},
{
"dataId": "100502",
"name": "仓库管理员"
},
{
"dataId": "100503",
"name": "搬运工"
},
{
"dataId": "100504",
"name": "物流专员"
},
{
"dataId": "100505",
"name": "物流经理"
},
{
"dataId": "100506",
"name": "物流总监"
},
{
"dataId": "100507",
"name": "调度员"
},
{
"dataId": "100508",
"name": "仓库经理"
},
{
"dataId": "100509",
"name": "供应链管理"
},
{
"dataId": "100510",
"name": "单证员"
},
{
"dataId": "100511",
"name": "国际货运"
},
{
"dataId": "100512",
"name": "其他"
}
]
},
{
"dataId": "100600",
"name": "贸易/采购",
"jobtype": [
{
"dataId": "100601",
"name": "外贸专员"
},
{
"dataId": "100602",
"name": "外贸经理"
},
{
"dataId": "100603",
"name": "采购员"
},
{
"dataId": "100604",
"name": "采购助理"
},
{
"dataId": "100605",
"name": "采购经理"
},
{
"dataId": "100606",
"name": "报关员"
},
{
"dataId": "100607",
"name": "商务专员"
},
{
"dataId": "100608",
"name": "买手"
},
{
"dataId": "100609",
"name": "其他"
}
]
},
{
"dataId": "100700",
"name": "翻译",
"jobtype": [
{
"dataId": "100701",
"name": "英语"
},
{
"dataId": "100702",
"name": "日语"
},
{
"dataId": "100703",
"name": "俄语"
},
{
"dataId": "100704",
"name": "韩语"
},
{
"dataId": "100705",
"name": "法语"
},
{
"dataId": "100706",
"name": "德语"
},
{
"dataId": "100707",
"name": "西班牙语"
},
{
"dataId": "100708",
"name": "意大利语"
},
{
"dataId": "100709",
"name": "葡萄牙语"
},
{
"dataId": "100710",
"name": "阿拉伯语"
},
{
"dataId": "100711",
"name": "小语种"
},
{
"dataId": "100712",
"name": "其他"
}
]
},
{
"dataId": "100800",
"name": "律师/法务",
"jobtype": [
{
"dataId": "100801",
"name": "律师助理"
},
{
"dataId": "100802",
"name": "法务专员"
},
{
"dataId": "100803",
"name": "律师"
},
{
"dataId": "100804",
"name": "专利顾问"
},
{
"dataId": "100805",
"name": "合规管理"
},
{
"dataId": "100806",
"name": "其他"
}
]
},
{
"dataId": "100900",
"name": "财务/审计",
"jobtype": [
{
"dataId": "100901",
"name": "财务经理"
},
{
"dataId": "100902",
"name": "会计"
},
{
"dataId": "100903",
"name": "出纳"
},
{
"dataId": "100904",
"name": "会计助理"
},
{
"dataId": "100905",
"name": "财务总监"
},
{
"dataId": "100906",
"name": "审计专员"
},
{
"dataId": "100907",
"name": "审计经理"
},
{
"dataId": "100908",
"name": "统计员"
},
{
"dataId": "100909",
"name": "税务专员"
},
{
"dataId": "100910",
"name": "税务经理"
},
{
"dataId": "100911",
"name": "财务分析员"
},
{
"dataId": "100912",
"name": "成本管理员"
},
{
"dataId": "100913",
"name": "其他"
}
]
},
{
"dataId": "101000",
"name": "广告/咨询",
"jobtype": [
{
"dataId": "101001",
"name": "咨询顾问"
},
{
"dataId": "101002",
"name": "广告制作"
},
{
"dataId": "101003",
"name": "广告文案"
},
{
"dataId": "101004",
"name": "广告创意"
},
{
"dataId": "101005",
"name": "创意总监"
},
{
"dataId": "101006",
"name": "会展策划"
},
{
"dataId": "101007",
"name": "客户主管"
},
{
"dataId": "101008",
"name": "企业策划"
},
{
"dataId": "101009",
"name": "媒介策划"
},
{
"dataId": "101010",
"name": "婚礼策划"
},
{
"dataId": "101011",
"name": "咨询经理"
},
{
"dataId": "101012",
"name": "其他"
}
]
},
{
"dataId": "101100",
"name": "美术/设计",
"jobtype": [
{
"dataId": "101101",
"name": "服装设计"
},
{
"dataId": "101102",
"name": "平面设计"
},
{
"dataId": "101103",
"name": "美编"
},
{
"dataId": "101104",
"name": "家居设计"
},
{
"dataId": "101105",
"name": "美术指导"
},
{
"dataId": "101106",
"name": "店面设计"
},
{
"dataId": "101107",
"name": "珠宝设计"
},
{
"dataId": "101108",
"name": "动画设计"
},
{
"dataId": "101109",
"name": "包装设计"
},
{
"dataId": "101110",
"name": "室内设计"
},
{
"dataId": "101111",
"name": "CAD制图"
},
{
"dataId": "101112",
"name": "其他"
}
]
},
{
"dataId": "101200",
"name": "编辑/出版",
"jobtype": [
{
"dataId": "101201",
"name": "编辑"
},
{
"dataId": "101202",
"name": "记者"
},
{
"dataId": "101203",
"name": "总编辑"
},
{
"dataId": "101204",
"name": "出版发行"
},
{
"dataId": "101205",
"name": "排版设计"
},
{
"dataId": "101206",
"name": "印刷操作"
},
{
"dataId": "101207",
"name": "装订烫金"
},
{
"dataId": "101208",
"name": "其他"
}
]
},
{
"dataId": "101300",
"name": "网络/IT",
"jobtype": [
{
"dataId": "101301",
"name": "网页设计"
},
{
"dataId": "101302",
"name": "网站编辑"
},
{
"dataId": "101303",
"name": "程序员"
},
{
"dataId": "101304",
"name": "技术专员"
},
{
"dataId": "101305",
"name": "软件工程师"
},
{
"dataId": "101306",
"name": "技术支持"
},
{
"dataId": "101307",
"name": "技术经理"
},
{
"dataId": "101308",
"name": "硬件工程师"
},
{
"dataId": "101309",
"name": "质量工程师"
},
{
"dataId": "101310",
"name": "测试工程师"
},
{
"dataId": "101311",
"name": "系统架构师"
},
{
"dataId": "101312",
"name": "项目经理"
},
{
"dataId": "101313",
"name": "产品经理"
},
{
"dataId": "101314",
"name": "网站运营"
},
{
"dataId": "101315",
"name": "网站策划"
},
{
"dataId": "101316",
"name": "网络管理员"
},
{
"dataId": "101317",
"name": "信息安全"
},
{
"dataId": "101318",
"name": "通信工程师"
},
{
"dataId": "101319",
"name": "实施工程师"
},
{
"dataId": "101320",
"name": "DBA"
},
{
"dataId": "101321",
"name": "游戏设计"
},
{
"dataId": "101322",
"name": "视频设计"
},
{
"dataId": "101323",
"name": "其他"
}
]
},
{
"dataId": "101400",
"name": "金融/证券",
"jobtype": [
{
"dataId": "101401",
"name": "理财顾问"
},
{
"dataId": "101402",
"name": "证券分析"
},
{
"dataId": "101403",
"name": "柜员"
},
{
"dataId": "101404",
"name": "证券经纪人"
},
{
"dataId": "101405",
"name": "证券经理"
},
{
"dataId": "101406",
"name": "信用卡业务"
},
{
"dataId": "101407",
"name": "银行经理"
},
{
"dataId": "101408",
"name": "信贷管理"
},
{
"dataId": "101409",
"name": "资产评估"
},
{
"dataId": "101410",
"name": "担保典当"
},
{
"dataId": "101411",
"name": "拍卖师"
},
{
"dataId": "101412",
"name": "外汇经纪人"
},
{
"dataId": "101413",
"name": "融资专员"
},
{
"dataId": "101414",
"name": "融资经理"
},
{
"dataId": "101415",
"name": "风险管理"
},
{
"dataId": "101416",
"name": "操盘手"
},
{
"dataId": "101417",
"name": "其他"
}
]
},
{
"dataId": "101500",
"name": "市场/公关",
"jobtype": [
{
"dataId": "101501",
"name": "市场专员"
},
{
"dataId": "101502",
"name": "市场经理"
},
{
"dataId": "101503",
"name": "公关员"
},
{
"dataId": "101504",
"name": "市场拓展"
},
{
"dataId": "101505",
"name": "市场调研"
},
{
"dataId": "101506",
"name": "市场策划"
},
{
"dataId": "101507",
"name": "媒介专员"
},
{
"dataId": "101508",
"name": "媒介经理"
},
{
"dataId": "101509",
"name": "会展专员"
},
{
"dataId": "101510",
"name": "品牌经理"
},
{
"dataId": "101511",
"name": "公关经理"
},
{
"dataId": "101512",
"name": "企划经理"
},
{
"dataId": "101513",
"name": "其他"
}
]
},
{
"dataId": "101600",
"name": "保险/理赔",
"jobtype": [
{
"dataId": "101601",
"name": "保险顾问"
},
{
"dataId": "101602",
"name": "储备经理"
},
{
"dataId": "101603",
"name": "经纪人"
},
{
"dataId": "101604",
"name": "保险内勤"
},
{
"dataId": "101605",
"name": "项目经理"
},
{
"dataId": "101606",
"name": "核保理赔"
},
{
"dataId": "101607",
"name": "保险精算师"
},
{
"dataId": "101608",
"name": "产品开发"
},
{
"dataId": "101609",
"name": "续期管理"
},
{
"dataId": "101610",
"name": "保险培训师"
},
{
"dataId": "101611",
"name": "契约管理"
},
{
"dataId": "101612",
"name": "其他"
}
]
},
{
"dataId": "101700",
"name": "房地产",
"jobtype": [
{
"dataId": "101701",
"name": "房产经纪人"
},
{
"dataId": "101702",
"name": "置业顾问"
},
{
"dataId": "101703",
"name": "置业店长"
},
{
"dataId": "101704",
"name": "房产店员"
},
{
"dataId": "101705",
"name": "房产客服"
},
{
"dataId": "101706",
"name": "房产内勤"
},
{
"dataId": "101707",
"name": "房地产策划"
},
{
"dataId": "101708",
"name": "房产评估师"
},
{
"dataId": "101709",
"name": "其他房产职位"
},
{
"dataId": "101710",
"name": "其他"
}
]
},
{
"dataId": "101800",
"name": "高级管理",
"jobtype": [
{
"dataId": "101801",
"name": "总监"
},
{
"dataId": "101802",
"name": "总裁助理"
},
{
"dataId": "101803",
"name": "副总裁"
},
{
"dataId": "101804",
"name": "分公司经理"
},
{
"dataId": "101805",
"name": "首席执行官"
},
{
"dataId": "101806",
"name": "首席运营官"
},
{
"dataId": "101807",
"name": "首席财务官"
},
{
"dataId": "101808",
"name": "首席技术官"
},
{
"dataId": "101809",
"name": "合伙人"
},
{
"dataId": "101810",
"name": "其他"
}
]
}
]
}
]
================================================
FILE: app/src/main/res/values/colors.xml
================================================
#f1f1f1
#ffffff
================================================
FILE: app/src/main/res/values/dimens.xml
================================================
16dp
16dp
================================================
FILE: app/src/main/res/values/strings.xml
================================================
ExpandTable
Hello world!
Settings
================================================
FILE: app/src/main/res/values/styles.xml
================================================
================================================
FILE: app/src/main/res/values-w820dp/dimens.xml
================================================
64dp
================================================
FILE: build.gradle
================================================
// 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.1.0'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
allprojects {
repositories {
jcenter()
}
}
================================================
FILE: gradle/wrapper/gradle-wrapper.properties
================================================
#Mon May 23 08:59:39 CST 2016
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-2.10-all.zip
================================================
FILE: gradle.properties
================================================
# Project-wide Gradle settings.
# IDE (e.g. Android Studio) users:
# Gradle settings configured through the IDE *will override*
# any settings specified in this file.
# For more details on how to configure your build environment visit
# http://www.gradle.org/docs/current/userguide/build_environment.html
# Specifies the JVM arguments used for the daemon process.
# The setting is particularly useful for tweaking memory settings.
# Default value: -Xmx10248m -XX:MaxPermSize=256m
# org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8
# When configured, Gradle will run in incubating parallel mode.
# This option should only be used with decoupled projects. More details, visit
# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
# org.gradle.parallel=true
================================================
FILE: gradlew
================================================
#!/usr/bin/env bash
##############################################################################
##
## Gradle start up script for UN*X
##
##############################################################################
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
DEFAULT_JVM_OPTS=""
APP_NAME="Gradle"
APP_BASE_NAME=`basename "$0"`
# Use the maximum available, or set MAX_FD != -1 to use that value.
MAX_FD="maximum"
warn ( ) {
echo "$*"
}
die ( ) {
echo
echo "$*"
echo
exit 1
}
# OS specific support (must be 'true' or 'false').
cygwin=false
msys=false
darwin=false
case "`uname`" in
CYGWIN* )
cygwin=true
;;
Darwin* )
darwin=true
;;
MINGW* )
msys=true
;;
esac
# For Cygwin, ensure paths are in UNIX format before anything is touched.
if $cygwin ; then
[ -n "$JAVA_HOME" ] && JAVA_HOME=`cygpath --unix "$JAVA_HOME"`
fi
# Attempt to set APP_HOME
# Resolve links: $0 may be a link
PRG="$0"
# Need this for relative symlinks.
while [ -h "$PRG" ] ; do
ls=`ls -ld "$PRG"`
link=`expr "$ls" : '.*-> \(.*\)$'`
if expr "$link" : '/.*' > /dev/null; then
PRG="$link"
else
PRG=`dirname "$PRG"`"/$link"
fi
done
SAVED="`pwd`"
cd "`dirname \"$PRG\"`/" >&-
APP_HOME="`pwd -P`"
cd "$SAVED" >&-
CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
# Determine the Java command to use to start the JVM.
if [ -n "$JAVA_HOME" ] ; then
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
# IBM's JDK on AIX uses strange locations for the executables
JAVACMD="$JAVA_HOME/jre/sh/java"
else
JAVACMD="$JAVA_HOME/bin/java"
fi
if [ ! -x "$JAVACMD" ] ; then
die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi
else
JAVACMD="java"
which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi
# Increase the maximum file descriptors if we can.
if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then
MAX_FD_LIMIT=`ulimit -H -n`
if [ $? -eq 0 ] ; then
if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
MAX_FD="$MAX_FD_LIMIT"
fi
ulimit -n $MAX_FD
if [ $? -ne 0 ] ; then
warn "Could not set maximum file descriptor limit: $MAX_FD"
fi
else
warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
fi
fi
# For Darwin, add options to specify how the application appears in the dock
if $darwin; then
GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
fi
# For Cygwin, switch paths to Windows format before running java
if $cygwin ; then
APP_HOME=`cygpath --path --mixed "$APP_HOME"`
CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
# We build the pattern for arguments to be converted via cygpath
ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
SEP=""
for dir in $ROOTDIRSRAW ; do
ROOTDIRS="$ROOTDIRS$SEP$dir"
SEP="|"
done
OURCYGPATTERN="(^($ROOTDIRS))"
# Add a user-defined pattern to the cygpath arguments
if [ "$GRADLE_CYGPATTERN" != "" ] ; then
OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
fi
# Now convert the arguments - kludge to limit ourselves to /bin/sh
i=0
for arg in "$@" ; do
CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
else
eval `echo args$i`="\"$arg\""
fi
i=$((i+1))
done
case $i in
(0) set -- ;;
(1) set -- "$args0" ;;
(2) set -- "$args0" "$args1" ;;
(3) set -- "$args0" "$args1" "$args2" ;;
(4) set -- "$args0" "$args1" "$args2" "$args3" ;;
(5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
(6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
(7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
(8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
(9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
esac
fi
# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules
function splitJvmOpts() {
JVM_OPTS=("$@")
}
eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS
JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME"
exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@"
================================================
FILE: gradlew.bat
================================================
@if "%DEBUG%" == "" @echo off
@rem ##########################################################################
@rem
@rem Gradle startup script for Windows
@rem
@rem ##########################################################################
@rem Set local scope for the variables with windows NT shell
if "%OS%"=="Windows_NT" setlocal
@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
set DEFAULT_JVM_OPTS=
set DIRNAME=%~dp0
if "%DIRNAME%" == "" set DIRNAME=.
set APP_BASE_NAME=%~n0
set APP_HOME=%DIRNAME%
@rem Find java.exe
if defined JAVA_HOME goto findJavaFromJavaHome
set JAVA_EXE=java.exe
%JAVA_EXE% -version >NUL 2>&1
if "%ERRORLEVEL%" == "0" goto init
echo.
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.
goto fail
:findJavaFromJavaHome
set JAVA_HOME=%JAVA_HOME:"=%
set JAVA_EXE=%JAVA_HOME%/bin/java.exe
if exist "%JAVA_EXE%" goto init
echo.
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.
goto fail
:init
@rem Get command-line arguments, handling Windowz variants
if not "%OS%" == "Windows_NT" goto win9xME_args
if "%@eval[2+2]" == "4" goto 4NT_args
:win9xME_args
@rem Slurp the command line arguments.
set CMD_LINE_ARGS=
set _SKIP=2
:win9xME_args_slurp
if "x%~1" == "x" goto execute
set CMD_LINE_ARGS=%*
goto execute
:4NT_args
@rem Get arguments from the 4NT Shell from JP Software
set CMD_LINE_ARGS=%$
:execute
@rem Setup the command line
set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
@rem Execute Gradle
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
:end
@rem End local scope for the variables with windows NT shell
if "%ERRORLEVEL%"=="0" goto mainEnd
:fail
rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
rem the _cmd.exe /c_ return code!
if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
exit /b 1
:mainEnd
if "%OS%"=="Windows_NT" endlocal
:omega
================================================
FILE: settings.gradle
================================================
include 'app'