├── app
├── .gitignore
├── libs
│ └── gson-2.2.1.jar
├── src
│ └── main
│ │ ├── res
│ │ ├── mipmap-hdpi
│ │ │ ├── square.png
│ │ │ ├── black_circle.png
│ │ │ ├── ic_launcher.png
│ │ │ └── orange_circle.png
│ │ ├── mipmap-mdpi
│ │ │ └── ic_launcher.png
│ │ ├── mipmap-xhdpi
│ │ │ └── ic_launcher.png
│ │ ├── mipmap-xxhdpi
│ │ │ └── ic_launcher.png
│ │ ├── values
│ │ │ ├── colors.xml
│ │ │ ├── strings.xml
│ │ │ ├── styles.xml
│ │ │ └── dimens.xml
│ │ ├── drawable
│ │ │ └── main_click_selector.xml
│ │ ├── values-w820dp
│ │ │ └── dimens.xml
│ │ ├── layout
│ │ │ ├── viewpager.xml
│ │ │ ├── expand_grid_item.xml
│ │ │ ├── table_row_item.xml
│ │ │ ├── activity_main.xml
│ │ │ ├── expand_item.xml
│ │ │ └── pulldown_view.xml
│ │ ├── menu
│ │ │ └── menu_main.xml
│ │ └── raw
│ │ │ └── zhaopin.json
│ │ ├── java
│ │ └── com
│ │ │ └── haibuzou
│ │ │ └── myapplication
│ │ │ ├── entity
│ │ │ ├── GongZhong.java
│ │ │ ├── ZhaoPin.java
│ │ │ └── BaseData.java
│ │ │ ├── view
│ │ │ ├── ItemTextView.java
│ │ │ ├── MyTextView.java
│ │ │ └── CurrenPositionView.java
│ │ │ ├── adapter
│ │ │ ├── MyViewPagerAdapter.java
│ │ │ ├── ExpandGridAdapter.java
│ │ │ ├── CommonAdapter.java
│ │ │ └── ViewHolder.java
│ │ │ ├── Utils.java
│ │ │ └── MainActivity.java
│ │ └── AndroidManifest.xml
├── build.gradle
└── proguard-rules.pro
├── settings.gradle
├── art
└── ScreenGif.gif
├── gradle
└── wrapper
│ ├── gradle-wrapper.jar
│ └── gradle-wrapper.properties
├── README.md
├── .gitignore
├── gradle.properties
├── gradlew.bat
└── gradlew
/app/.gitignore:
--------------------------------------------------------------------------------
1 | /build
2 |
--------------------------------------------------------------------------------
/settings.gradle:
--------------------------------------------------------------------------------
1 | include 'app'
--------------------------------------------------------------------------------
/art/ScreenGif.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/haibuzou/ExpandTable/HEAD/art/ScreenGif.gif
--------------------------------------------------------------------------------
/app/libs/gson-2.2.1.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/haibuzou/ExpandTable/HEAD/app/libs/gson-2.2.1.jar
--------------------------------------------------------------------------------
/gradle/wrapper/gradle-wrapper.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/haibuzou/ExpandTable/HEAD/gradle/wrapper/gradle-wrapper.jar
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-hdpi/square.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/haibuzou/ExpandTable/HEAD/app/src/main/res/mipmap-hdpi/square.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-hdpi/black_circle.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/haibuzou/ExpandTable/HEAD/app/src/main/res/mipmap-hdpi/black_circle.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-hdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/haibuzou/ExpandTable/HEAD/app/src/main/res/mipmap-hdpi/ic_launcher.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-hdpi/orange_circle.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/haibuzou/ExpandTable/HEAD/app/src/main/res/mipmap-hdpi/orange_circle.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-mdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/haibuzou/ExpandTable/HEAD/app/src/main/res/mipmap-mdpi/ic_launcher.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/haibuzou/ExpandTable/HEAD/app/src/main/res/mipmap-xhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xxhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/haibuzou/ExpandTable/HEAD/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # ExpandTable
2 | 完全高仿58同城 点击展开的表格效果
3 | 使用tablelayout 来实现
4 |
5 | ### 效果图:
6 | 
7 |
--------------------------------------------------------------------------------
/app/src/main/res/values/colors.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | #f1f1f1
4 | #ffffff
5 |
--------------------------------------------------------------------------------
/app/src/main/res/values/strings.xml:
--------------------------------------------------------------------------------
1 |
2 | ExpandTable
3 |
4 | Hello world!
5 | Settings
6 |
7 |
--------------------------------------------------------------------------------
/app/src/main/res/values/styles.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/app/src/main/res/values/dimens.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | 16dp
4 | 16dp
5 |
6 |
--------------------------------------------------------------------------------
/gradle/wrapper/gradle-wrapper.properties:
--------------------------------------------------------------------------------
1 | #Mon May 23 08:59:39 CST 2016
2 | distributionBase=GRADLE_USER_HOME
3 | distributionPath=wrapper/dists
4 | zipStoreBase=GRADLE_USER_HOME
5 | zipStorePath=wrapper/dists
6 | distributionUrl=https\://services.gradle.org/distributions/gradle-2.10-all.zip
7 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/main_click_selector.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
--------------------------------------------------------------------------------
/app/src/main/res/values-w820dp/dimens.xml:
--------------------------------------------------------------------------------
1 |
2 |
5 | 64dp
6 |
7 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/viewpager.xml:
--------------------------------------------------------------------------------
1 |
2 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/menu/menu_main.xml:
--------------------------------------------------------------------------------
1 |
11 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/expand_grid_item.xml:
--------------------------------------------------------------------------------
1 |
2 |
10 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | #built application files
2 | *.apk
3 | *.ap_
4 |
5 | # files for the dex VM
6 | *.dex
7 |
8 | # Java class files
9 | *.class
10 |
11 | # generated files
12 | bin/
13 | gen/
14 |
15 | # Local configuration file (sdk path, etc)
16 | local.properties
17 |
18 | # Windows thumbnail db
19 | Thumbs.db
20 |
21 | # OSX files
22 | .DS_Store
23 |
24 | # Eclipse project files
25 | .classpath
26 | .project
27 |
28 | # Android Studio
29 | *.iml
30 | .idea
31 | #.idea/workspace.xml - remove # and delete .idea if it better suit your needs.
32 | .gradle
33 | build/
--------------------------------------------------------------------------------
/app/src/main/res/layout/table_row_item.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/app/src/main/java/com/haibuzou/myapplication/entity/GongZhong.java:
--------------------------------------------------------------------------------
1 | package com.haibuzou.myapplication.entity;
2 |
3 | import java.util.List;
4 |
5 | /**
6 | * Created by AAA on 2015/6/16.
7 | */
8 | public class GongZhong extends BaseData {
9 |
10 | public GongZhong(int id, String name) {
11 | super(id, name);
12 | }
13 |
14 | private List jobtype;
15 |
16 | public List getJobtype() {
17 | return jobtype;
18 | }
19 |
20 | public void setJobtype(List jobtype) {
21 | this.jobtype = jobtype;
22 | }
23 |
24 | }
25 |
--------------------------------------------------------------------------------
/app/src/main/java/com/haibuzou/myapplication/entity/ZhaoPin.java:
--------------------------------------------------------------------------------
1 | package com.haibuzou.myapplication.entity;
2 |
3 | import java.util.List;
4 |
5 | /**
6 | * Created by Administrator on 2015/6/16.
7 | */
8 | public class ZhaoPin extends BaseData {
9 |
10 | public ZhaoPin(int id, String name) {
11 | super(id, name);
12 | }
13 |
14 | private List jobtype;
15 |
16 | public List getJobtype() {
17 | return jobtype;
18 | }
19 |
20 | public void setJobtype(List jobtype) {
21 | this.jobtype = jobtype;
22 | }
23 |
24 | }
25 |
--------------------------------------------------------------------------------
/app/build.gradle:
--------------------------------------------------------------------------------
1 | apply plugin: 'com.android.application'
2 |
3 | android {
4 | compileSdkVersion 22
5 | buildToolsVersion "23.0.1"
6 |
7 | defaultConfig {
8 | applicationId "com.haibuzou.myapplication"
9 | minSdkVersion 14
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 | compile 'com.android.support:appcompat-v7:22.2.0'
25 | compile files('libs/gson-2.2.1.jar')
26 | }
27 |
--------------------------------------------------------------------------------
/app/proguard-rules.pro:
--------------------------------------------------------------------------------
1 | # Add project specific ProGuard rules here.
2 | # By default, the flags in this file are appended to flags specified
3 | # in D:\adt-bundle-windows-x86_64-20130917\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 | #}
18 |
--------------------------------------------------------------------------------
/app/src/main/java/com/haibuzou/myapplication/entity/BaseData.java:
--------------------------------------------------------------------------------
1 | package com.haibuzou.myapplication.entity;
2 |
3 | /**
4 | * Created by AAA on 2015/6/16.
5 | */
6 | public class BaseData {
7 |
8 | private int dataId;
9 | private String name;
10 |
11 | public BaseData() {
12 |
13 | }
14 |
15 | public BaseData(int id, String name) {
16 | this.dataId = id;
17 | this.name = name;
18 | }
19 |
20 | public int getDataId() {
21 | return dataId;
22 | }
23 |
24 | public void setDataId(int dataId) {
25 | this.dataId = dataId;
26 | }
27 |
28 | public String getName() {
29 | return name;
30 | }
31 |
32 | public void setName(String name) {
33 | this.name = name;
34 | }
35 |
36 |
37 | }
38 |
--------------------------------------------------------------------------------
/app/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
4 |
5 |
10 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/activity_main.xml:
--------------------------------------------------------------------------------
1 |
2 |
7 |
8 |
12 |
13 |
21 |
22 |
23 |
--------------------------------------------------------------------------------
/gradle.properties:
--------------------------------------------------------------------------------
1 | # Project-wide Gradle settings.
2 |
3 | # IDE (e.g. Android Studio) users:
4 | # Gradle settings configured through the IDE *will override*
5 | # any settings specified in this file.
6 |
7 | # For more details on how to configure your build environment visit
8 | # http://www.gradle.org/docs/current/userguide/build_environment.html
9 |
10 | # Specifies the JVM arguments used for the daemon process.
11 | # The setting is particularly useful for tweaking memory settings.
12 | # Default value: -Xmx10248m -XX:MaxPermSize=256m
13 | # org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8
14 |
15 | # When configured, Gradle will run in incubating parallel mode.
16 | # This option should only be used with decoupled projects. More details, visit
17 | # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
18 | # org.gradle.parallel=true
--------------------------------------------------------------------------------
/app/src/main/res/layout/expand_item.xml:
--------------------------------------------------------------------------------
1 |
2 |
7 |
8 |
12 |
13 |
23 |
--------------------------------------------------------------------------------
/app/src/main/java/com/haibuzou/myapplication/view/ItemTextView.java:
--------------------------------------------------------------------------------
1 | package com.haibuzou.myapplication.view;
2 |
3 | import android.content.Context;
4 | import android.graphics.Canvas;
5 | import android.graphics.Color;
6 | import android.graphics.Paint;
7 | import android.util.AttributeSet;
8 | import android.widget.TextView;
9 |
10 | /**
11 | * Created by Administrator on 2015/6/17.
12 | */
13 | public class ItemTextView extends TextView {
14 |
15 | private final Paint paint;
16 | private int mwidth;
17 | private int mheight;
18 |
19 | public ItemTextView(Context context, AttributeSet attrs) {
20 | super(context, attrs);
21 | paint = new Paint();
22 | paint.setColor(Color.BLACK);
23 | paint.setStyle(Paint.Style.STROKE);
24 | }
25 |
26 | @Override
27 | protected void onDraw(Canvas canvas) {
28 | canvas.drawLine(0, mheight - 1, mwidth - 1, mheight - 1, paint);
29 | canvas.drawLine(mwidth - 1, mheight - 1, mwidth - 1, 0, paint);
30 | super.onDraw(canvas);
31 | }
32 |
33 | @Override
34 | protected void onSizeChanged(int w, int h, int oldw, int oldh) {
35 | super.onSizeChanged(w, h, oldw, oldh);
36 | mwidth = w;
37 | mheight = h;
38 | }
39 | }
40 |
--------------------------------------------------------------------------------
/app/src/main/java/com/haibuzou/myapplication/adapter/MyViewPagerAdapter.java:
--------------------------------------------------------------------------------
1 | package com.haibuzou.myapplication.adapter;
2 |
3 | import android.support.v4.view.ViewPager;
4 | import android.view.View;
5 |
6 | import java.util.List;
7 |
8 | public class MyViewPagerAdapter extends android.support.v4.view.PagerAdapter {
9 |
10 | private final List mlistViews;
11 |
12 |
13 | public MyViewPagerAdapter(List mlistViews) {
14 | this.mlistViews = mlistViews;
15 | }
16 |
17 | @Override
18 | public int getCount() {
19 | return mlistViews.size();
20 | }
21 |
22 |
23 | @Override
24 | public int getItemPosition(Object object) {
25 | return super.getItemPosition(object);
26 | }
27 |
28 | @Override
29 | public Object instantiateItem(View container, int position) {
30 | ((ViewPager) container).addView(mlistViews.get(position));
31 | return mlistViews.get(position);
32 | }
33 |
34 | @Override
35 | public void destroyItem(View arg0, int arg1, Object arg2) {
36 | ((ViewPager) arg0).removeView(mlistViews.get(arg1));
37 | }
38 |
39 | @Override
40 | public boolean isViewFromObject(View arg0, Object arg1) {
41 | return arg0 == arg1;
42 | }
43 |
44 | }
45 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/pulldown_view.xml:
--------------------------------------------------------------------------------
1 |
2 |
6 |
7 |
13 |
14 |
19 |
20 |
27 |
28 |
29 |
34 |
35 |
--------------------------------------------------------------------------------
/app/src/main/java/com/haibuzou/myapplication/adapter/ExpandGridAdapter.java:
--------------------------------------------------------------------------------
1 | package com.haibuzou.myapplication.adapter;
2 |
3 | import java.util.List;
4 |
5 | import android.content.Context;
6 | import android.view.View;
7 | import android.view.View.OnClickListener;
8 |
9 | import com.haibuzou.myapplication.R;
10 | import com.haibuzou.myapplication.entity.BaseData;
11 |
12 | /**
13 | * Created by AAA on 2015/6/16.
14 | */
15 | public class ExpandGridAdapter extends CommonAdapter {
16 | private OnClick listener;
17 |
18 | public ExpandGridAdapter(Context context, List mDatas,
19 | int itemLayoutId) {
20 | super(context, mDatas, itemLayoutId);
21 | }
22 |
23 | @Override
24 | public void convert(ViewHolder helper, final BaseData item) {
25 | helper.setText(R.id.expand_grid_txt, item.getName());
26 | View view = helper.getView(R.id.expand_grid_txt);
27 | view.setOnClickListener(new OnClickListener() {
28 | @Override
29 | public void onClick(View v) {
30 | if (listener != null) {
31 | listener.onClick(item.getDataId(), item.getName());
32 | }
33 |
34 | }
35 | });
36 | }
37 |
38 | public interface OnClick {
39 | void onClick(int dataId, String str);
40 | }
41 |
42 | public void setOnClick(OnClick listener) {
43 | this.listener = listener;
44 | }
45 | }
46 |
--------------------------------------------------------------------------------
/app/src/main/java/com/haibuzou/myapplication/Utils.java:
--------------------------------------------------------------------------------
1 | package com.haibuzou.myapplication;
2 |
3 | import android.content.Context;
4 |
5 | import com.google.gson.Gson;
6 | import com.google.gson.reflect.TypeToken;
7 | import com.haibuzou.myapplication.entity.ZhaoPin;
8 |
9 | import java.io.ByteArrayOutputStream;
10 | import java.io.InputStream;
11 | import java.util.List;
12 |
13 | /**
14 | * Created by AAA on 2015/6/16.
15 | */
16 | public class Utils {
17 | public static List getJobType(Context context) {
18 | String result = readFileFromRaw(context, R.raw.zhaopin);
19 | if (result != null) {
20 | Gson gson = new Gson();
21 | return gson.fromJson(result, new TypeToken>() {
22 | }.getType());
23 | }
24 | return null;
25 | }
26 |
27 | /**
28 | * 读取Raw文件夹下文本类型文件
29 | *
30 | * @param context 上下文
31 | * @param resourceId 资源id
32 | * @return 返回的读取完成的数据 string格式
33 | */
34 | public static String readFileFromRaw(Context context, int resourceId) {
35 | if (null == context || resourceId < 0) {
36 | return null;
37 | }
38 |
39 | String result = null;
40 | try {
41 | InputStream input = context.getResources().openRawResource(resourceId);
42 | ByteArrayOutputStream output = new ByteArrayOutputStream();
43 | byte[] buffer = new byte[1024];
44 | int length;
45 | while ((length = input.read(buffer)) != -1) {
46 | output.write(buffer, 0, length);
47 | }
48 | output.close();
49 | input.close();
50 | return output.toString();
51 | } catch (Exception e) {
52 | e.printStackTrace();
53 | }
54 |
55 | return result;
56 | }
57 | }
58 |
--------------------------------------------------------------------------------
/app/src/main/java/com/haibuzou/myapplication/adapter/CommonAdapter.java:
--------------------------------------------------------------------------------
1 | package com.haibuzou.myapplication.adapter;
2 |
3 | import java.util.ArrayList;
4 | import java.util.List;
5 |
6 | import android.content.Context;
7 | import android.view.LayoutInflater;
8 | import android.view.View;
9 | import android.view.ViewGroup;
10 | import android.widget.BaseAdapter;
11 |
12 | public abstract class CommonAdapter extends BaseAdapter {
13 | protected LayoutInflater mInflater;
14 | protected Context mContext;
15 | protected List mDatas;
16 | protected final int mItemLayoutId;
17 |
18 | public CommonAdapter(Context context, int itemLayoutId) {
19 | this.mContext = context;
20 | this.mInflater = LayoutInflater.from(mContext);
21 | this.mDatas = new ArrayList();
22 | this.mItemLayoutId = itemLayoutId;
23 | }
24 |
25 | public CommonAdapter(Context context, List mDatas, int itemLayoutId) {
26 | this.mContext = context;
27 | this.mInflater = LayoutInflater.from(mContext);
28 | this.mDatas = mDatas;
29 | this.mItemLayoutId = itemLayoutId;
30 | }
31 |
32 | @Override
33 | public int getCount() {
34 | return mDatas != null ? mDatas.size() : 0;
35 | }
36 |
37 | @Override
38 | public T getItem(int position) {
39 | return mDatas.get(position);
40 | }
41 |
42 | @Override
43 | public long getItemId(int position) {
44 | return position;
45 | }
46 |
47 | @Override
48 | public View getView(int position, View convertView, ViewGroup parent) {
49 | final ViewHolder viewHolder = getViewHolder(position, convertView,
50 | parent);
51 | convert(viewHolder, getItem(position));
52 | return viewHolder.getConvertView();
53 |
54 | }
55 |
56 | public abstract void convert(ViewHolder helper, T item);
57 |
58 | private ViewHolder getViewHolder(int position, View convertView,
59 | ViewGroup parent) {
60 | return ViewHolder.get(mContext, convertView, parent, mItemLayoutId,
61 | position);
62 | }
63 |
64 | }
65 |
--------------------------------------------------------------------------------
/app/src/main/java/com/haibuzou/myapplication/view/MyTextView.java:
--------------------------------------------------------------------------------
1 | package com.haibuzou.myapplication.view;
2 |
3 | import android.content.Context;
4 | import android.widget.TextView;
5 | import android.graphics.Canvas;
6 | import android.graphics.Color;
7 | import android.graphics.Paint;
8 | import android.graphics.Paint.Align;
9 | import android.graphics.Path;
10 | import android.util.AttributeSet;
11 | import android.util.TypedValue;
12 |
13 | /**
14 | * Created by AAA on 2015/6/16.
15 | */
16 | public class MyTextView extends TextView {
17 |
18 |
19 | private Paint txtpaint;
20 | private Paint linepaint;
21 | private Paint tripaint;
22 | private Path path;
23 | private Boolean isDraw;
24 | private float textSize;
25 |
26 | public MyTextView(Context context) {
27 | super(context);
28 | }
29 |
30 | public MyTextView(Context context, AttributeSet attrs, int defStyleAttr) {
31 | super(context, attrs, defStyleAttr);
32 | init(context, attrs);
33 | }
34 |
35 | public MyTextView(Context context, AttributeSet attrs) {
36 | super(context, attrs);
37 | init(context, attrs);
38 | }
39 |
40 | private void init(Context context, AttributeSet attrs) {
41 |
42 | txtpaint = new Paint();
43 | path = new Path();
44 | txtpaint.setColor(Color.BLACK);
45 | txtpaint.setTextSize(textSize);
46 | txtpaint.setTextAlign(Align.LEFT);
47 |
48 | linepaint = new Paint();
49 | linepaint.setColor(Color.LTGRAY);
50 | linepaint.setStyle(Paint.Style.STROKE);
51 |
52 | tripaint = new Paint();
53 | tripaint.setColor(Color.GRAY);
54 |
55 | isDraw = false;
56 |
57 | }
58 |
59 | @Override
60 | protected void onDraw(Canvas canvas) {
61 | canvas.drawRect(0, 0, getWidth(), getHeight(), linepaint);
62 | int len = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,
63 | 7, getResources().getDisplayMetrics());
64 | if (isDraw) {
65 | path.moveTo(getWidth() / 2, getHeight() - len);
66 | path.lineTo(getWidth() / 2 - len, getHeight());
67 | path.lineTo(getWidth() / 2 + len, getHeight());
68 | canvas.drawPath(path, tripaint);
69 | }
70 | super.onDraw(canvas);
71 | }
72 |
73 | public void isDraw(boolean isDraw) {
74 | this.isDraw = isDraw;
75 | postInvalidate();
76 | }
77 |
78 |
79 | }
80 |
--------------------------------------------------------------------------------
/gradlew.bat:
--------------------------------------------------------------------------------
1 | @if "%DEBUG%" == "" @echo off
2 | @rem ##########################################################################
3 | @rem
4 | @rem Gradle startup script for Windows
5 | @rem
6 | @rem ##########################################################################
7 |
8 | @rem Set local scope for the variables with windows NT shell
9 | if "%OS%"=="Windows_NT" setlocal
10 |
11 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
12 | set DEFAULT_JVM_OPTS=
13 |
14 | set DIRNAME=%~dp0
15 | if "%DIRNAME%" == "" set DIRNAME=.
16 | set APP_BASE_NAME=%~n0
17 | set APP_HOME=%DIRNAME%
18 |
19 | @rem Find java.exe
20 | if defined JAVA_HOME goto findJavaFromJavaHome
21 |
22 | set JAVA_EXE=java.exe
23 | %JAVA_EXE% -version >NUL 2>&1
24 | if "%ERRORLEVEL%" == "0" goto init
25 |
26 | echo.
27 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
28 | echo.
29 | echo Please set the JAVA_HOME variable in your environment to match the
30 | echo location of your Java installation.
31 |
32 | goto fail
33 |
34 | :findJavaFromJavaHome
35 | set JAVA_HOME=%JAVA_HOME:"=%
36 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe
37 |
38 | if exist "%JAVA_EXE%" goto init
39 |
40 | echo.
41 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
42 | echo.
43 | echo Please set the JAVA_HOME variable in your environment to match the
44 | echo location of your Java installation.
45 |
46 | goto fail
47 |
48 | :init
49 | @rem Get command-line arguments, handling Windowz variants
50 |
51 | if not "%OS%" == "Windows_NT" goto win9xME_args
52 | if "%@eval[2+2]" == "4" goto 4NT_args
53 |
54 | :win9xME_args
55 | @rem Slurp the command line arguments.
56 | set CMD_LINE_ARGS=
57 | set _SKIP=2
58 |
59 | :win9xME_args_slurp
60 | if "x%~1" == "x" goto execute
61 |
62 | set CMD_LINE_ARGS=%*
63 | goto execute
64 |
65 | :4NT_args
66 | @rem Get arguments from the 4NT Shell from JP Software
67 | set CMD_LINE_ARGS=%$
68 |
69 | :execute
70 | @rem Setup the command line
71 |
72 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
73 |
74 | @rem Execute Gradle
75 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
76 |
77 | :end
78 | @rem End local scope for the variables with windows NT shell
79 | if "%ERRORLEVEL%"=="0" goto mainEnd
80 |
81 | :fail
82 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
83 | rem the _cmd.exe /c_ return code!
84 | if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
85 | exit /b 1
86 |
87 | :mainEnd
88 | if "%OS%"=="Windows_NT" endlocal
89 |
90 | :omega
91 |
--------------------------------------------------------------------------------
/app/src/main/java/com/haibuzou/myapplication/view/CurrenPositionView.java:
--------------------------------------------------------------------------------
1 | package com.haibuzou.myapplication.view;
2 |
3 | import android.content.Context;
4 | import android.util.AttributeSet;
5 | import android.view.LayoutInflater;
6 | import android.view.View;
7 | import android.widget.LinearLayout;
8 | import android.widget.TableLayout;
9 | import android.widget.TableRow;
10 | import android.widget.TextView;
11 |
12 | import com.haibuzou.myapplication.MainActivity;
13 | import com.haibuzou.myapplication.R;
14 | import com.haibuzou.myapplication.entity.ZhaoPin;
15 |
16 |
17 | public class CurrenPositionView extends LinearLayout {
18 | //每行item个数
19 | private static final int ROW_NUM = 3;
20 | private TextView titleView;
21 | private ZhaoPin data;
22 | private TableLayout tableLayout;
23 | private LayoutInflater layoutInflater;
24 | private int viewId;
25 |
26 | public CurrenPositionView(Context context, AttributeSet attrs, int defStyle) {
27 | super(context, attrs, defStyle);
28 | }
29 |
30 | public CurrenPositionView(Context context, AttributeSet attrs) {
31 | super(context, attrs);
32 | }
33 |
34 | public CurrenPositionView(Context context) {
35 | super(context);
36 | }
37 |
38 | public ZhaoPin getData() {
39 | return data;
40 | }
41 |
42 | public void setData(ZhaoPin data) {
43 | this.data = data;
44 | }
45 |
46 | private void initView() {
47 | layoutInflater = LayoutInflater.from(getContext());
48 | View rootView = layoutInflater.inflate(R.layout.pulldown_view, this);
49 | titleView = (TextView) rootView.findViewById(R.id.job_name_text);
50 | tableLayout = (TableLayout) rootView.findViewById(R.id.job_name_table);
51 | tableLayout.setStretchAllColumns(true);
52 | setTitleStr(data.getName());
53 | //初始化表格数据
54 | int h = data.getJobtype().size() / ROW_NUM;
55 | int len = data.getJobtype().size() % ROW_NUM;
56 | int location = 0;
57 | if (len != 0)
58 | h += 1;
59 | for (int n = 1; n <= h; n++) {
60 | TableRow row = new TableRow(getContext());
61 | int length = n == h ? len : ROW_NUM;
62 | for (int m = 0; m < length; m++) {
63 | MyTextView mview = (MyTextView) layoutInflater.inflate(R.layout.table_row_item, null);
64 | mview.setText(data.getJobtype().get(location).getName());
65 | mview.setTag("" + viewId + location);
66 | mview.setOnClickListener(((MainActivity) getContext()).new OnItemClick(data, location, n, tableLayout, mview));
67 | row.addView(mview);
68 | location++;
69 | }
70 | // 每一列 tablerow 增加一个 下拉的layout
71 | View view = layoutInflater.inflate(R.layout.expand_item, null);
72 | view.setTag(n);
73 | view.setVisibility(View.GONE);
74 | tableLayout.addView(row);
75 | tableLayout.addView(view);
76 | }
77 | }
78 |
79 | public void init() {
80 | initView();
81 | }
82 |
83 | public void setTitleStr(CharSequence text) {
84 | titleView.setText(text);
85 | }
86 |
87 | public int getViewId() {
88 | return viewId;
89 | }
90 |
91 | public void setViewId(int viewId) {
92 | this.viewId = viewId;
93 | }
94 | }
95 |
--------------------------------------------------------------------------------
/gradlew:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env bash
2 |
3 | ##############################################################################
4 | ##
5 | ## Gradle start up script for UN*X
6 | ##
7 | ##############################################################################
8 |
9 | # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
10 | DEFAULT_JVM_OPTS=""
11 |
12 | APP_NAME="Gradle"
13 | APP_BASE_NAME=`basename "$0"`
14 |
15 | # Use the maximum available, or set MAX_FD != -1 to use that value.
16 | MAX_FD="maximum"
17 |
18 | warn ( ) {
19 | echo "$*"
20 | }
21 |
22 | die ( ) {
23 | echo
24 | echo "$*"
25 | echo
26 | exit 1
27 | }
28 |
29 | # OS specific support (must be 'true' or 'false').
30 | cygwin=false
31 | msys=false
32 | darwin=false
33 | case "`uname`" in
34 | CYGWIN* )
35 | cygwin=true
36 | ;;
37 | Darwin* )
38 | darwin=true
39 | ;;
40 | MINGW* )
41 | msys=true
42 | ;;
43 | esac
44 |
45 | # For Cygwin, ensure paths are in UNIX format before anything is touched.
46 | if $cygwin ; then
47 | [ -n "$JAVA_HOME" ] && JAVA_HOME=`cygpath --unix "$JAVA_HOME"`
48 | fi
49 |
50 | # Attempt to set APP_HOME
51 | # Resolve links: $0 may be a link
52 | PRG="$0"
53 | # Need this for relative symlinks.
54 | while [ -h "$PRG" ] ; do
55 | ls=`ls -ld "$PRG"`
56 | link=`expr "$ls" : '.*-> \(.*\)$'`
57 | if expr "$link" : '/.*' > /dev/null; then
58 | PRG="$link"
59 | else
60 | PRG=`dirname "$PRG"`"/$link"
61 | fi
62 | done
63 | SAVED="`pwd`"
64 | cd "`dirname \"$PRG\"`/" >&-
65 | APP_HOME="`pwd -P`"
66 | cd "$SAVED" >&-
67 |
68 | CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
69 |
70 | # Determine the Java command to use to start the JVM.
71 | if [ -n "$JAVA_HOME" ] ; then
72 | if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
73 | # IBM's JDK on AIX uses strange locations for the executables
74 | JAVACMD="$JAVA_HOME/jre/sh/java"
75 | else
76 | JAVACMD="$JAVA_HOME/bin/java"
77 | fi
78 | if [ ! -x "$JAVACMD" ] ; then
79 | die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
80 |
81 | Please set the JAVA_HOME variable in your environment to match the
82 | location of your Java installation."
83 | fi
84 | else
85 | JAVACMD="java"
86 | which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
87 |
88 | Please set the JAVA_HOME variable in your environment to match the
89 | location of your Java installation."
90 | fi
91 |
92 | # Increase the maximum file descriptors if we can.
93 | if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then
94 | MAX_FD_LIMIT=`ulimit -H -n`
95 | if [ $? -eq 0 ] ; then
96 | if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
97 | MAX_FD="$MAX_FD_LIMIT"
98 | fi
99 | ulimit -n $MAX_FD
100 | if [ $? -ne 0 ] ; then
101 | warn "Could not set maximum file descriptor limit: $MAX_FD"
102 | fi
103 | else
104 | warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
105 | fi
106 | fi
107 |
108 | # For Darwin, add options to specify how the application appears in the dock
109 | if $darwin; then
110 | GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
111 | fi
112 |
113 | # For Cygwin, switch paths to Windows format before running java
114 | if $cygwin ; then
115 | APP_HOME=`cygpath --path --mixed "$APP_HOME"`
116 | CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
117 |
118 | # We build the pattern for arguments to be converted via cygpath
119 | ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
120 | SEP=""
121 | for dir in $ROOTDIRSRAW ; do
122 | ROOTDIRS="$ROOTDIRS$SEP$dir"
123 | SEP="|"
124 | done
125 | OURCYGPATTERN="(^($ROOTDIRS))"
126 | # Add a user-defined pattern to the cygpath arguments
127 | if [ "$GRADLE_CYGPATTERN" != "" ] ; then
128 | OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
129 | fi
130 | # Now convert the arguments - kludge to limit ourselves to /bin/sh
131 | i=0
132 | for arg in "$@" ; do
133 | CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
134 | CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
135 |
136 | if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
137 | eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
138 | else
139 | eval `echo args$i`="\"$arg\""
140 | fi
141 | i=$((i+1))
142 | done
143 | case $i in
144 | (0) set -- ;;
145 | (1) set -- "$args0" ;;
146 | (2) set -- "$args0" "$args1" ;;
147 | (3) set -- "$args0" "$args1" "$args2" ;;
148 | (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
149 | (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
150 | (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
151 | (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
152 | (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
153 | (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
154 | esac
155 | fi
156 |
157 | # Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules
158 | function splitJvmOpts() {
159 | JVM_OPTS=("$@")
160 | }
161 | eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS
162 | JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME"
163 |
164 | exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@"
165 |
--------------------------------------------------------------------------------
/app/src/main/java/com/haibuzou/myapplication/adapter/ViewHolder.java:
--------------------------------------------------------------------------------
1 | package com.haibuzou.myapplication.adapter;
2 |
3 | import java.lang.ref.SoftReference;
4 | import java.lang.reflect.Constructor;
5 |
6 | import android.content.Context;
7 | import android.graphics.Bitmap;
8 | import android.util.SparseArray;
9 | import android.view.LayoutInflater;
10 | import android.view.View;
11 | import android.view.ViewGroup;
12 | import android.widget.ImageView;
13 | import android.widget.TextView;
14 |
15 | public class ViewHolder {
16 | private final SparseArray> mViews;
17 | private final SparseArray> childViews;
18 | private int mPosition;
19 | private final View mConvertView;
20 | private final ViewGroup parent;
21 |
22 | private ViewHolder(Context context, ViewGroup parent, int layoutId,
23 | int position) {
24 | this.mPosition = position;
25 | this.parent = parent;
26 | this.mViews = new SparseArray>();
27 | this.childViews = new SparseArray>();
28 | mConvertView = LayoutInflater.from(context).inflate(layoutId, parent,
29 | false);
30 | // setTag
31 | mConvertView.setTag(this);
32 | }
33 |
34 | private ViewHolder(Context context, ViewGroup parent, View view,
35 | int position) {
36 | this.mPosition = position;
37 | this.parent = parent;
38 | this.mViews = new SparseArray>();
39 | this.childViews = new SparseArray>();
40 | mConvertView = view;
41 | // setTag
42 | mConvertView.setTag(this);
43 | }
44 |
45 | @SuppressWarnings("unchecked")
46 | public static T get(View view, int id) {
47 | SparseArray viewHolder = (SparseArray) view.getTag();
48 | if (viewHolder == null) {
49 | viewHolder = new SparseArray();
50 | view.setTag(viewHolder);
51 | }
52 | View childView = viewHolder.get(id);
53 | if (childView == null) {
54 | childView = view.findViewById(id);
55 | viewHolder.put(id, childView);
56 | }
57 | return (T) childView;
58 | }
59 |
60 | /**
61 | * 拿到一个ViewHolder对象
62 | *
63 | * @param context
64 | * @param convertView item view
65 | * @param parent 父控件
66 | * @param layoutId 布局id
67 | * @param position 位置
68 | * @return
69 | */
70 | public static ViewHolder get(Context context, View convertView,
71 | ViewGroup parent, int layoutId, int position) {
72 | ViewHolder holder;
73 | if (convertView == null) {
74 | holder = new ViewHolder(context, parent, layoutId, position);
75 | } else {
76 | holder = (ViewHolder) convertView.getTag();
77 | holder.mPosition = position;
78 | }
79 | return holder;
80 | }
81 |
82 | /**
83 | * 拿到一个ViewHolder对象
84 | *
85 | * @param context
86 | * @param convertView
87 | * @param parent 母控件
88 | * @param position 点击位置
89 | * @return
90 | */
91 | public static ViewHolder get(Context context, View convertView,
92 | ViewGroup parent, Class extends View> view, int position) throws Exception {
93 | ViewHolder holder;
94 | if (convertView == null) {
95 | Constructor> constructor = view.getConstructor(Context.class);
96 | View contentView = (View) constructor.newInstance(context);
97 | holder = new ViewHolder(context, parent, contentView, position);
98 | } else {
99 | holder = (ViewHolder) convertView.getTag();
100 | holder.mPosition = position;
101 | }
102 | return holder;
103 | }
104 |
105 | public View getConvertView() {
106 | return mConvertView;
107 | }
108 |
109 | /**
110 | * 通过控件的Id获取对于的控件,如果没有则加入views
111 | *
112 | * @param viewId
113 | * @return
114 | */
115 | public T getView(int viewId) {
116 | View view = mViews.get(viewId) != null ? mViews.get(viewId).get() : null;
117 | if (view == null) {
118 | view = mConvertView.findViewById(viewId);
119 | mViews.put(viewId, new SoftReference(view));
120 | }
121 | return (T) view;
122 | }
123 |
124 | /**
125 | * 为TextView设置字符串
126 | *
127 | * @param viewId
128 | * @param text
129 | * @return
130 | */
131 | public ViewHolder setText(int viewId, String text) {
132 | TextView view = getView(viewId);
133 | view.setText(text);
134 | return this;
135 | }
136 |
137 | /**
138 | * 为ImageView设置图片
139 | *
140 | * @param viewId
141 | * @param drawableId
142 | * @return
143 | */
144 | public ViewHolder setImageResource(int viewId, int drawableId) {
145 | ImageView view = getView(viewId);
146 | view.setImageResource(drawableId);
147 |
148 | return this;
149 | }
150 |
151 | /**
152 | * 为ImageView设置图片
153 | *
154 | * @param viewId
155 | * @param bm
156 | * @return
157 | */
158 | public ViewHolder setImageBitmap(int viewId, Bitmap bm) {
159 | ImageView view = getView(viewId);
160 | view.setImageBitmap(bm);
161 | return this;
162 | }
163 |
164 | /**
165 | * 临时创建view,但不显示
166 | *
167 | * @param viewId view的 id
168 | * @param childView 子view
169 | */
170 | public void setChildView(int viewId, View childView) {
171 | if (getView(viewId) == null) {
172 | return;
173 | }
174 | childViews.put(viewId, new SoftReference(childView));
175 | }
176 |
177 | /**
178 | * 获取子view
179 | *
180 | * @param viewId
181 | */
182 | public T getChildView(int viewId) {
183 | View view = childViews.get(viewId) != null ? childViews.get(viewId).get() : null;
184 | return (T) view;
185 | }
186 |
187 | public ViewGroup getParent() {
188 | return parent;
189 | }
190 |
191 | public int getPosition() {
192 | return mPosition;
193 | }
194 |
195 | }
196 |
--------------------------------------------------------------------------------
/app/src/main/java/com/haibuzou/myapplication/MainActivity.java:
--------------------------------------------------------------------------------
1 | package com.haibuzou.myapplication;
2 |
3 | import android.app.Activity;
4 | import android.content.Intent;
5 | import android.os.Bundle;
6 | import android.support.v4.view.ViewPager;
7 | import android.support.v4.view.ViewPager.OnPageChangeListener;
8 | import android.util.TypedValue;
9 | import android.view.LayoutInflater;
10 | import android.view.View;
11 | import android.view.View.OnClickListener;
12 | import android.view.animation.Animation;
13 | import android.view.animation.Transformation;
14 | import android.widget.GridView;
15 | import android.widget.ImageView;
16 | import android.widget.LinearLayout;
17 | import android.widget.RelativeLayout;
18 | import android.widget.TableLayout;
19 |
20 |
21 | import com.haibuzou.myapplication.adapter.ExpandGridAdapter;
22 | import com.haibuzou.myapplication.adapter.MyViewPagerAdapter;
23 | import com.haibuzou.myapplication.entity.BaseData;
24 | import com.haibuzou.myapplication.entity.ZhaoPin;
25 | import com.haibuzou.myapplication.view.CurrenPositionView;
26 | import com.haibuzou.myapplication.view.MyTextView;
27 |
28 | import java.util.ArrayList;
29 | import java.util.List;
30 |
31 |
32 | public class MainActivity extends Activity implements ExpandGridAdapter.OnClick {
33 |
34 | //招聘数据
35 | private List data;
36 | private LinearLayout currenPositionLinear;
37 | private final Integer duration = 200;
38 | private RelativeLayout rel;
39 | private String itemId;
40 | //记录点击位置
41 | private String clickPosition = "";
42 | private MyTextView clicktxt;
43 | //下拉的 圆点显示layout
44 | private LinearLayout circlelayout;
45 | private int lastlocation = -1;
46 | private ExpandGridAdapter.OnClick listener;
47 | //每行显示条目个数
48 | private static final int NUM_LINE = 3;
49 |
50 | @Override
51 | protected void onCreate(Bundle savedInstanceState) {
52 | super.onCreate(savedInstanceState);
53 | setContentView(R.layout.activity_main);
54 | initData();
55 | initView();
56 | }
57 |
58 | private void initView() {
59 | currenPositionLinear = (LinearLayout) findViewById(R.id.zp_curr_potion_linear);
60 | for (int num = 0; num < data.size(); num++) {
61 | ZhaoPin zhaoPin = data.get(num);
62 | CurrenPositionView currenPositionView = new CurrenPositionView(this);
63 | currenPositionView.setData(zhaoPin);
64 | currenPositionView.setViewId(num);
65 | currenPositionView.init();
66 | if (num > 0) {
67 | LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);
68 | params.topMargin = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 10, getResources().getDisplayMetrics());
69 | if (num == data.size() - 1) {
70 | params.bottomMargin = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 50, getResources().getDisplayMetrics());
71 | }
72 | currenPositionLinear.addView(currenPositionView, params);
73 | } else {
74 | currenPositionLinear.addView(currenPositionView);
75 | }
76 |
77 | }
78 | }
79 |
80 | private void initData() {
81 | if (listener == null) {
82 | listener = this;
83 | }
84 | if (data == null) {
85 | data = Utils.getJobType(this);
86 | }
87 | }
88 |
89 | public class OnItemClick implements OnClickListener, OnPageChangeListener {
90 | private final int position;
91 | private final int tag;
92 | private final MyTextView view;
93 | private final TableLayout tableLayout;
94 | private final ZhaoPin zhaoPin;
95 |
96 | public OnItemClick(ZhaoPin zhaoPin, int position, int tag, TableLayout table, MyTextView view) {
97 | this.position = position;
98 | this.tag = tag;
99 | this.view = view;
100 | this.tableLayout = table;
101 | this.zhaoPin = zhaoPin;
102 | }
103 |
104 | @Override
105 | public void onPageScrollStateChanged(int arg0) {
106 |
107 | }
108 |
109 | @Override
110 | public void onPageScrolled(int arg0, float arg1, int arg2) {
111 | if (lastlocation != arg0 && lastlocation != -1) {
112 | ImageView mimage = (ImageView) circlelayout
113 | .findViewWithTag(lastlocation + 1 + 10);
114 | if (mimage != null) {
115 | mimage.setImageResource(R.mipmap.black_circle);
116 | }
117 | }
118 |
119 | ImageView image = (ImageView) circlelayout
120 | .findViewWithTag(arg0 + 1 + 10);
121 | if (image != null) {
122 | image.setImageResource(R.mipmap.orange_circle);
123 | }
124 |
125 | lastlocation = arg0;
126 | }
127 |
128 | @Override
129 | public void onPageSelected(int arg0) {
130 |
131 | }
132 |
133 | private void init(View v, int location) {
134 | List list;
135 | ViewPager pager = (ViewPager) v.findViewById(R.id.expand_item);
136 | // 底部的圆点初始化
137 | circlelayout = (LinearLayout) v.findViewById(R.id.circle_layout);
138 | circlelayout.removeAllViews();
139 | int radio = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 5, getResources().getDisplayMetrics());
140 | // 初始化一个params 用于圆点大小设置
141 | LinearLayout.LayoutParams circleparams = new LinearLayout.LayoutParams(radio, radio);
142 | circleparams.setMargins(0, 0, 10, 0);
143 | List views = new ArrayList<>();
144 | // 下拉表格的行数
145 | int row = zhaoPin.getJobtype().get(location).getJobtype().size() / NUM_LINE;
146 | if (row > 4) {
147 | row = 4;
148 | } else if (row < 4) {
149 | if (zhaoPin.getJobtype().get(location).getJobtype().size() % NUM_LINE != 0) {
150 | row += 1;
151 | }
152 | }
153 | // 计算生成 view的数量
154 | int i = zhaoPin.getJobtype().get(location).getJobtype().size() / 12;
155 | int len = zhaoPin.getJobtype().get(location).getJobtype().size() % 12;
156 | if (len > 0) {
157 | i += 1;
158 | }
159 | // View的 初始化
160 | for (int n = 1; n <= i; n++) {
161 | View view = LayoutInflater.from(MainActivity.this).inflate(R.layout.viewpager, null);
162 | GridView grid = (GridView) view.findViewById(R.id.expand_grid);
163 | // 计算每个 gridview 存放多少数据
164 | if (i == 0) {
165 | list = zhaoPin.getJobtype().get(location).getJobtype();
166 | } else if (n < i) {
167 | // 每一个 表只有3列 最多 4行 每个表最多12个
168 | list = zhaoPin.getJobtype().get(location).getJobtype().subList((n - 1) * 12, n * 12);
169 | } else {
170 | int size = zhaoPin.getJobtype().get(location).getJobtype().size();
171 | list = zhaoPin.getJobtype().get(location).getJobtype().subList((n - 1) * 12, size);
172 | }
173 | ExpandGridAdapter ea = new ExpandGridAdapter(MainActivity.this, list, R.layout.expand_grid_item);
174 | ea.setOnClick(listener);
175 | grid.setAdapter(ea);
176 | views.add(grid);
177 | if (i > 1) {
178 | circlelayout.setVisibility(View.VISIBLE);
179 | // viewpager 底部的 点标识
180 | ImageView image = new ImageView(MainActivity.this);
181 | image.setTag(n + 10);
182 | image.setImageResource(R.mipmap.black_circle);
183 | circlelayout.addView(image, circleparams);
184 | } else {
185 | circlelayout.setVisibility(View.GONE);
186 | }
187 | }
188 | MyViewPagerAdapter mpa = new MyViewPagerAdapter(views);
189 | // 宽度每一个格高度 42dp 转成px
190 | int height = (int) (MainActivity.this.getResources().getDisplayMetrics().density * 42 + 0.5f);
191 | RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, row * height);
192 | pager.setLayoutParams(params);
193 | pager.setAdapter(mpa);
194 | pager.setOnPageChangeListener(this);
195 | }
196 |
197 | // 收缩动画
198 | private void collapse(final View v) {
199 | final int initialHeight = v.getMeasuredHeight();
200 | Animation animation = new Animation() {
201 | @Override
202 | protected void applyTransformation(float interpolatedTime,
203 | Transformation t) {
204 | // interpolatedTime 0-1 进行变化 为1的时候表示动画已经完成
205 | if (interpolatedTime == 1) {
206 | v.setVisibility(View.GONE);
207 | } else {
208 | // 同样的原理 让控件的高度不断变化
209 | v.getLayoutParams().height = initialHeight
210 | - (int) (initialHeight * interpolatedTime);
211 | v.requestLayout();
212 | }
213 | }
214 |
215 | @Override
216 | public boolean willChangeBounds() {
217 | return true;
218 | }
219 | };
220 |
221 | animation.setDuration(duration);
222 | v.startAnimation(animation);
223 | }
224 |
225 | // 展开动画
226 | private void expand(final View v, int location) {
227 | init(v, location);
228 | v.measure(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT);
229 | final int targetHeight = v.getMeasuredHeight();
230 | // 最开始显示下拉控件的时候 将高度设为0 达到不显示的效果
231 | v.getLayoutParams().height = 0;
232 | v.setVisibility(View.VISIBLE);
233 |
234 | Animation animation = new Animation() {
235 | @Override
236 | protected void applyTransformation(float interpolatedTime,
237 | Transformation t) {
238 | // 不断变化高度来显示控件
239 | v.getLayoutParams().height = (interpolatedTime == 1) ? RelativeLayout.LayoutParams.WRAP_CONTENT
240 | : (int) (targetHeight * interpolatedTime);
241 | v.requestLayout();
242 | }
243 |
244 | @Override
245 | public boolean willChangeBounds() {
246 | return true;
247 | }
248 | };
249 | animation.setDuration(duration);
250 | v.startAnimation(animation);
251 | }
252 |
253 | @Override
254 | public void onClick(View v) {
255 | String tempTag = (String) v.getTag();
256 | if (rel == null) {
257 | rel = (RelativeLayout) tableLayout.findViewWithTag(tag);
258 | expand(rel, position);
259 | view.isDraw(true);
260 | } else {
261 | if (rel.getVisibility() == View.VISIBLE) {
262 | collapse(rel);
263 | view.isDraw(false);
264 | } else {
265 | if (tempTag.equals(clickPosition)) {
266 | expand(rel, position);
267 | }
268 | view.isDraw(true);
269 | }
270 |
271 | if (!tempTag.equals(clickPosition)) {
272 | rel = (RelativeLayout) tableLayout.findViewWithTag(tag);
273 | expand(rel, position);
274 | // 上一次的箭头去除
275 | clicktxt.isDraw(false);
276 | view.isDraw(true);
277 | }
278 | }
279 | clickPosition = tempTag;
280 | clicktxt = view;
281 | }
282 | }
283 |
284 | @Override
285 | public void onClick(int dataId, String str) {
286 | Intent intent = new Intent();
287 | intent.putExtra("id", dataId);
288 | intent.putExtra("value", str);
289 | setResult(RESULT_OK, intent);
290 | finish();
291 | }
292 |
293 | }
294 |
--------------------------------------------------------------------------------
/app/src/main/res/raw/zhaopin.json:
--------------------------------------------------------------------------------
1 | [
2 | {
3 | "dataId": "120000",
4 | "name": "技术/制造岗位",
5 | "jobtype": [
6 | {
7 | "dataId": "120100",
8 | "name": "技工/普工",
9 | "jobtype": [
10 | {
11 | "dataId": "120101",
12 | "name": "普工/操作工"
13 | },
14 | {
15 | "dataId": "120102",
16 | "name": "车床工"
17 | },
18 | {
19 | "dataId": "120103",
20 | "name": "铣刨"
21 | },
22 | {
23 | "dataId": "120104",
24 | "name": "钣铆冲铸"
25 | },
26 | {
27 | "dataId": "120105",
28 | "name": "钳工"
29 | },
30 | {
31 | "dataId": "120106",
32 | "name": "焊工"
33 | },
34 | {
35 | "dataId": "120107",
36 | "name": "磨床工"
37 | },
38 | {
39 | "dataId": "120108",
40 | "name": "火花机工"
41 | },
42 | {
43 | "dataId": "120109",
44 | "name": "裁剪车"
45 | },
46 | {
47 | "dataId": "120110",
48 | "name": "缝熨烫"
49 | },
50 | {
51 | "dataId": "120111",
52 | "name": "打磨/抛光"
53 | },
54 | {
55 | "dataId": "120112",
56 | "name": "空调/电梯工"
57 | },
58 | {
59 | "dataId": "120113",
60 | "name": "汽摩维修员"
61 | },
62 | {
63 | "dataId": "120114",
64 | "name": "水/木/油漆工"
65 | },
66 | {
67 | "dataId": "120115",
68 | "name": "电工"
69 | },
70 | {
71 | "dataId": "120116",
72 | "name": "锅炉工"
73 | },
74 | {
75 | "dataId": "120117",
76 | "name": "锁具修理工"
77 | },
78 | {
79 | "dataId": "120118",
80 | "name": "叉车工"
81 | },
82 | {
83 | "dataId": "120119",
84 | "name": "模具工"
85 | },
86 | {
87 | "dataId": "120120",
88 | "name": "手机维修"
89 | },
90 | {
91 | "dataId": "120121",
92 | "name": "包装工"
93 | },
94 | {
95 | "dataId": "120122",
96 | "name": "水泥工"
97 | },
98 | {
99 | "dataId": "120123",
100 | "name": "钢筋工"
101 | },
102 | {
103 | "dataId": "120124",
104 | "name": "管道工"
105 | },
106 | {
107 | "dataId": "120125",
108 | "name": "瓦工"
109 | },
110 | {
111 | "dataId": "120126",
112 | "name": "组装工"
113 | },
114 | {
115 | "dataId": "120127",
116 | "name": "样衣工"
117 | },
118 | {
119 | "dataId": "120128",
120 | "name": "染工"
121 | },
122 | {
123 | "dataId": "120129",
124 | "name": "纺织工"
125 | },
126 | {
127 | "dataId": "120130",
128 | "name": "印花工"
129 | },
130 | {
131 | "dataId": "120131",
132 | "name": "其他"
133 | }
134 | ]
135 | },
136 | {
137 | "dataId": "120200",
138 | "name": "生产/研发",
139 | "jobtype": [
140 | {
141 | "dataId": "120201",
142 | "name": "生产文员 "
143 | },
144 | {
145 | "dataId": "120202",
146 | "name": "组长/拉长 "
147 | },
148 | {
149 | "dataId": "120203",
150 | "name": "物控/物料员"
151 | },
152 | {
153 | "dataId": "120204",
154 | "name": "储备干部"
155 | },
156 | {
157 | "dataId": "120205",
158 | "name": "质量管理"
159 | },
160 | {
161 | "dataId": "120206",
162 | "name": "生产组长"
163 | },
164 | {
165 | "dataId": "120207",
166 | "name": "主任"
167 | },
168 | {
169 | "dataId": "120208",
170 | "name": "高级工程师"
171 | },
172 | {
173 | "dataId": "120209",
174 | "name": "设备管理"
175 | },
176 | {
177 | "dataId": "120210",
178 | "name": "工艺设计"
179 | },
180 | {
181 | "dataId": "120211",
182 | "name": "生产计划"
183 | },
184 | {
185 | "dataId": "120212",
186 | "name": "化验/检验"
187 | },
188 | {
189 | "dataId": "120213",
190 | "name": "厂长/副厂长"
191 | },
192 | {
193 | "dataId": "120214",
194 | "name": "生产总监"
195 | },
196 | {
197 | "dataId": "120215",
198 | "name": "维修工程师"
199 | },
200 | {
201 | "dataId": "120216",
202 | "name": "工业工程师"
203 | },
204 | {
205 | "dataId": "120217",
206 | "name": "材料工程师"
207 | },
208 | {
209 | "dataId": "120218",
210 | "name": "技术工程师"
211 | },
212 | {
213 | "dataId": "120219",
214 | "name": "其他"
215 | }
216 | ]
217 | },
218 | {
219 | "dataId": "120300",
220 | "name": "机械/仪表",
221 | "jobtype": [
222 | {
223 | "dataId": "120301",
224 | "name": "机械工程"
225 | },
226 | {
227 | "dataId": "120302",
228 | "name": "仪器仪表"
229 | },
230 | {
231 | "dataId": "120303",
232 | "name": "机电"
233 | },
234 | {
235 | "dataId": "120304",
236 | "name": "版图设计"
237 | },
238 | {
239 | "dataId": "120305",
240 | "name": "研发工程师"
241 | },
242 | {
243 | "dataId": "120306",
244 | "name": "机械测试"
245 | },
246 | {
247 | "dataId": "120307",
248 | "name": "其他"
249 | }
250 | ]
251 | },
252 | {
253 | "dataId": "120400",
254 | "name": "建筑/装修",
255 | "jobtype": [
256 | {
257 | "dataId": "120401",
258 | "name": "土木工程"
259 | },
260 | {
261 | "dataId": "120402",
262 | "name": "工程监理"
263 | },
264 | {
265 | "dataId": "120403",
266 | "name": "项目管理"
267 | },
268 | {
269 | "dataId": "120404",
270 | "name": "总工程师"
271 | },
272 | {
273 | "dataId": "120405",
274 | "name": "造价师"
275 | },
276 | {
277 | "dataId": "120406",
278 | "name": "幕墙工程师"
279 | },
280 | {
281 | "dataId": "120407",
282 | "name": "安防工程师"
283 | },
284 | {
285 | "dataId": "120408",
286 | "name": "安全管理"
287 | },
288 | {
289 | "dataId": "120409",
290 | "name": "道路桥梁"
291 | },
292 | {
293 | "dataId": "120410",
294 | "name": "给排水暖通"
295 | },
296 | {
297 | "dataId": "120411",
298 | "name": "测绘员"
299 | },
300 | {
301 | "dataId": "120412",
302 | "name": "园林设计"
303 | },
304 | {
305 | "dataId": "120413",
306 | "name": "资料员"
307 | },
308 | {
309 | "dataId": "120414",
310 | "name": "综合布线"
311 | },
312 | {
313 | "dataId": "120415",
314 | "name": "市政工程师"
315 | },
316 | {
317 | "dataId": "120416",
318 | "name": "其他"
319 | }
320 | ]
321 | },
322 | {
323 | "dataId": "120500",
324 | "name": "电子/电气",
325 | "jobtype": [
326 | {
327 | "dataId": "120501",
328 | "name": "电子电气"
329 | },
330 | {
331 | "dataId": "120502",
332 | "name": "自动化"
333 | },
334 | {
335 | "dataId": "120503",
336 | "name": "电路工程师"
337 | },
338 | {
339 | "dataId": "120504",
340 | "name": "无线电"
341 | },
342 | {
343 | "dataId": "120505",
344 | "name": "电气测试"
345 | },
346 | {
347 | "dataId": "120506",
348 | "name": "产品工艺"
349 | },
350 | {
351 | "dataId": "120507",
352 | "name": "音频/视频"
353 | },
354 | {
355 | "dataId": "120508",
356 | "name": "灯光照明"
357 | },
358 | {
359 | "dataId": "120509",
360 | "name": "研发工程师"
361 | },
362 | {
363 | "dataId": "120510",
364 | "name": "电子维修"
365 | },
366 | {
367 | "dataId": "120511",
368 | "name": "其他"
369 | }
370 | ]
371 | },
372 | {
373 | "dataId": "120600",
374 | "name": "质控/安防",
375 | "jobtype": [
376 | {
377 | "dataId": "120601",
378 | "name": "质量管理"
379 | },
380 | {
381 | "dataId": "120602",
382 | "name": "安全消防"
383 | },
384 | {
385 | "dataId": "120603",
386 | "name": "质检"
387 | },
388 | {
389 | "dataId": "120604",
390 | "name": "安防测试"
391 | },
392 | {
393 | "dataId": "120605",
394 | "name": "认证工程师"
395 | },
396 | {
397 | "dataId": "120606",
398 | "name": "安防管理"
399 | },
400 | {
401 | "dataId": "120607",
402 | "name": "其他"
403 | }
404 | ]
405 | },
406 | {
407 | "dataId": "120700",
408 | "name": "制药/生工",
409 | "jobtype": [
410 | {
411 | "dataId": "120701",
412 | "name": "临床研究"
413 | },
414 | {
415 | "dataId": "120702",
416 | "name": "医药研发"
417 | },
418 | {
419 | "dataId": "120703",
420 | "name": "生工"
421 | },
422 | {
423 | "dataId": "120704",
424 | "name": "医疗器械"
425 | },
426 | {
427 | "dataId": "120705",
428 | "name": "其他"
429 | }
430 | ]
431 | },
432 | {
433 | "dataId": "120800",
434 | "name": "服装/食品",
435 | "jobtype": [
436 | {
437 | "dataId": "120801",
438 | "name": "服装设计师"
439 | },
440 | {
441 | "dataId": "120802",
442 | "name": "打样制版"
443 | },
444 | {
445 | "dataId": "120803",
446 | "name": "样衣工"
447 | },
448 | {
449 | "dataId": "120804",
450 | "name": "生产管理"
451 | },
452 | {
453 | "dataId": "120805",
454 | "name": "食品研发"
455 | },
456 | {
457 | "dataId": "120806",
458 | "name": "样板出格师"
459 | },
460 | {
461 | "dataId": "120807",
462 | "name": "电脑放码员"
463 | },
464 | {
465 | "dataId": "120808",
466 | "name": "纸样师"
467 | },
468 | {
469 | "dataId": "120809",
470 | "name": "纺织品设计"
471 | },
472 | {
473 | "dataId": "120810",
474 | "name": "其他"
475 | }
476 | ]
477 | },
478 | {
479 | "dataId": "120900",
480 | "name": "农林牧渔",
481 | "jobtype": [
482 | {
483 | "dataId": "120901",
484 | "name": "养殖人员"
485 | },
486 | {
487 | "dataId": "120902",
488 | "name": "饲料业务"
489 | },
490 | {
491 | "dataId": "120903",
492 | "name": "农艺师"
493 | },
494 | {
495 | "dataId": "120904",
496 | "name": "畜牧师"
497 | },
498 | {
499 | "dataId": "120905",
500 | "name": "场长"
501 | },
502 | {
503 | "dataId": "120906",
504 | "name": "养殖部主管"
505 | },
506 | {
507 | "dataId": "120907",
508 | "name": "饲料研发"
509 | },
510 | {
511 | "dataId": "120908",
512 | "name": "其他"
513 | }
514 | ]
515 | },
516 | {
517 | "dataId": "121100",
518 | "name": "环境保护",
519 | "jobtype": [
520 | {
521 | "dataId": "121101",
522 | "name": "污水处理"
523 | },
524 | {
525 | "dataId": "121102",
526 | "name": "环保检测"
527 | },
528 | {
529 | "dataId": "121103",
530 | "name": "工程师"
531 | },
532 | {
533 | "dataId": "121104",
534 | "name": "环境管理"
535 | },
536 | {
537 | "dataId": "121105",
538 | "name": "环保技术"
539 | },
540 | {
541 | "dataId": "121106",
542 | "name": "EHS管理"
543 | },
544 | {
545 | "dataId": "121107",
546 | "name": "环保工程师"
547 | },
548 | {
549 | "dataId": "121108",
550 | "name": "水质检测员"
551 | },
552 | {
553 | "dataId": "121109",
554 | "name": "环境绿化"
555 | },
556 | {
557 | "dataId": "121110",
558 | "name": "其他"
559 | }
560 | ]
561 | },
562 | {
563 | "dataId": "121000",
564 | "name": "汽车",
565 | "jobtype": [
566 | {
567 | "dataId": "121001",
568 | "name": "汽车修理"
569 | },
570 | {
571 | "dataId": "121002",
572 | "name": "汽车美容"
573 | },
574 | {
575 | "dataId": "121003",
576 | "name": "洗车工"
577 | },
578 | {
579 | "dataId": "121004",
580 | "name": "轮胎工"
581 | },
582 | {
583 | "dataId": "121005",
584 | "name": "汽车设计"
585 | },
586 | {
587 | "dataId": "121006",
588 | "name": "装配工艺"
589 | },
590 | {
591 | "dataId": "121007",
592 | "name": "机械工程师"
593 | },
594 | {
595 | "dataId": "121008",
596 | "name": "电子工程师"
597 | },
598 | {
599 | "dataId": "121009",
600 | "name": "4S店管理"
601 | },
602 | {
603 | "dataId": "121010",
604 | "name": "汽车检验"
605 | },
606 | {
607 | "dataId": "121011",
608 | "name": "二手车评估"
609 | },
610 | {
611 | "dataId": "121012",
612 | "name": "总装工程师"
613 | },
614 | {
615 | "dataId": "121013",
616 | "name": "安全性能"
617 | },
618 | {
619 | "dataId": "121014",
620 | "name": "理赔专员"
621 | },
622 | {
623 | "dataId": "121015",
624 | "name": "停车管理员"
625 | },
626 | {
627 | "dataId": "121016",
628 | "name": "加油站工人"
629 | },
630 | {
631 | "dataId": "121017",
632 | "name": "其他"
633 | }
634 | ]
635 | }
636 | ]
637 | },
638 | {
639 | "dataId": "110000",
640 | "name": "生活服务岗位",
641 | "jobtype": [
642 | {
643 | "dataId": "110100",
644 | "name": "餐饮服务",
645 | "jobtype": [
646 | {
647 | "dataId": "110101",
648 | "name": "厨师"
649 | },
650 | {
651 | "dataId": "110102",
652 | "name": "面点师"
653 | },
654 | {
655 | "dataId": "110103",
656 | "name": "服务员"
657 | },
658 | {
659 | "dataId": "110104",
660 | "name": "传菜员"
661 | },
662 | {
663 | "dataId": "110105",
664 | "name": "配菜打荷"
665 | },
666 | {
667 | "dataId": "110106",
668 | "name": "洗碗工"
669 | },
670 | {
671 | "dataId": "110107",
672 | "name": "后厨"
673 | },
674 | {
675 | "dataId": "110108",
676 | "name": "茶艺师"
677 | },
678 | {
679 | "dataId": "110109",
680 | "name": "咖啡师"
681 | },
682 | {
683 | "dataId": "110110",
684 | "name": "迎宾"
685 | },
686 | {
687 | "dataId": "110111",
688 | "name": "大堂经理"
689 | },
690 | {
691 | "dataId": "110112",
692 | "name": "预订员"
693 | },
694 | {
695 | "dataId": "110113",
696 | "name": "送餐员"
697 | },
698 | {
699 | "dataId": "110114",
700 | "name": "餐饮管理"
701 | },
702 | {
703 | "dataId": "110115",
704 | "name": "学徒"
705 | },
706 | {
707 | "dataId": "110116",
708 | "name": "杂工"
709 | },
710 | {
711 | "dataId": "110117",
712 | "name": "其他"
713 | }
714 | ]
715 | },
716 | {
717 | "dataId": "110200",
718 | "name": "酒店/旅游",
719 | "jobtype": [
720 | {
721 | "dataId": "110201",
722 | "name": "酒店前台"
723 | },
724 | {
725 | "dataId": "110202",
726 | "name": "客房服务员"
727 | },
728 | {
729 | "dataId": "110203",
730 | "name": "楼面经理"
731 | },
732 | {
733 | "dataId": "110204",
734 | "name": "行李员"
735 | },
736 | {
737 | "dataId": "110205",
738 | "name": "救生员"
739 | },
740 | {
741 | "dataId": "110206",
742 | "name": "酒店管理"
743 | },
744 | {
745 | "dataId": "110207",
746 | "name": "订票员"
747 | },
748 | {
749 | "dataId": "110208",
750 | "name": "导游"
751 | },
752 | {
753 | "dataId": "110209",
754 | "name": "计调"
755 | },
756 | {
757 | "dataId": "110210",
758 | "name": "签证专员"
759 | },
760 | {
761 | "dataId": "110211",
762 | "name": "旅游顾问"
763 | },
764 | {
765 | "dataId": "110212",
766 | "name": "其他"
767 | }
768 | ]
769 | },
770 | {
771 | "dataId": "110300",
772 | "name": "超市/零售",
773 | "jobtype": [
774 | {
775 | "dataId": "110301",
776 | "name": "促销导购"
777 | },
778 | {
779 | "dataId": "110302",
780 | "name": "营业员"
781 | },
782 | {
783 | "dataId": "110303",
784 | "name": "收银员"
785 | },
786 | {
787 | "dataId": "110304",
788 | "name": "理货员"
789 | },
790 | {
791 | "dataId": "110305",
792 | "name": "防损员"
793 | },
794 | {
795 | "dataId": "110306",
796 | "name": "店长"
797 | },
798 | {
799 | "dataId": "110307",
800 | "name": "招商经理"
801 | },
802 | {
803 | "dataId": "110308",
804 | "name": "奢侈品业务"
805 | },
806 | {
807 | "dataId": "110309",
808 | "name": "品类管理"
809 | },
810 | {
811 | "dataId": "110310",
812 | "name": "食品加工"
813 | },
814 | {
815 | "dataId": "110311",
816 | "name": "督导"
817 | },
818 | {
819 | "dataId": "110312",
820 | "name": "其他"
821 | }
822 | ]
823 | },
824 | {
825 | "dataId": "110400",
826 | "name": "美容/美发",
827 | "jobtype": [
828 | {
829 | "dataId": "110401",
830 | "name": "发型师"
831 | },
832 | {
833 | "dataId": "110402",
834 | "name": "美容师"
835 | },
836 | {
837 | "dataId": "110403",
838 | "name": "化妆师"
839 | },
840 | {
841 | "dataId": "110404",
842 | "name": "美发助理"
843 | },
844 | {
845 | "dataId": "110405",
846 | "name": "洗头工"
847 | },
848 | {
849 | "dataId": "110406",
850 | "name": "美容助理"
851 | },
852 | {
853 | "dataId": "110407",
854 | "name": "美甲师"
855 | },
856 | {
857 | "dataId": "110408",
858 | "name": "美体师"
859 | },
860 | {
861 | "dataId": "110409",
862 | "name": "美容导师"
863 | },
864 | {
865 | "dataId": "110410",
866 | "name": "美容店长"
867 | },
868 | {
869 | "dataId": "110411",
870 | "name": "美容顾问"
871 | },
872 | {
873 | "dataId": "110412",
874 | "name": "彩妆培训师"
875 | },
876 | {
877 | "dataId": "110413",
878 | "name": "宠物美容"
879 | },
880 | {
881 | "dataId": "110414",
882 | "name": "其他"
883 | }
884 | ]
885 | },
886 | {
887 | "dataId": "110500",
888 | "name": "保健/按摩",
889 | "jobtype": [
890 | {
891 | "dataId": "110501",
892 | "name": "按摩师"
893 | },
894 | {
895 | "dataId": "110502",
896 | "name": "针灸推拿"
897 | },
898 | {
899 | "dataId": "110503",
900 | "name": "足疗师"
901 | },
902 | {
903 | "dataId": "110504",
904 | "name": "搓澡工"
905 | },
906 | {
907 | "dataId": "110505",
908 | "name": "其他"
909 | }
910 | ]
911 | },
912 | {
913 | "dataId": "110600",
914 | "name": "运动/健身",
915 | "jobtype": [
916 | {
917 | "dataId": "110601",
918 | "name": "健身教练"
919 | },
920 | {
921 | "dataId": "110602",
922 | "name": "瑜伽老师"
923 | },
924 | {
925 | "dataId": "110603",
926 | "name": "舞蹈师"
927 | },
928 | {
929 | "dataId": "110604",
930 | "name": "游泳教练"
931 | },
932 | {
933 | "dataId": "110605",
934 | "name": "台球教练"
935 | },
936 | {
937 | "dataId": "110606",
938 | "name": "高尔夫助理"
939 | },
940 | {
941 | "dataId": "110607",
942 | "name": "其他"
943 | }
944 | ]
945 | },
946 | {
947 | "dataId": "110700",
948 | "name": "淘宝招聘",
949 | "jobtype": [
950 | {
951 | "dataId": "110701",
952 | "name": "淘宝客服"
953 | },
954 | {
955 | "dataId": "110702",
956 | "name": "淘宝美工"
957 | },
958 | {
959 | "dataId": "110703",
960 | "name": "淘宝店长"
961 | },
962 | {
963 | "dataId": "110704",
964 | "name": "店铺编辑"
965 | },
966 | {
967 | "dataId": "110705",
968 | "name": "店铺推广"
969 | },
970 | {
971 | "dataId": "110706",
972 | "name": "活动策划"
973 | },
974 | {
975 | "dataId": "110707",
976 | "name": "其他"
977 | }
978 | ]
979 | },
980 | {
981 | "dataId": "110800",
982 | "name": "家政/安保",
983 | "jobtype": [
984 | {
985 | "dataId": "110801",
986 | "name": "保洁"
987 | },
988 | {
989 | "dataId": "110802",
990 | "name": "保姆"
991 | },
992 | {
993 | "dataId": "110803",
994 | "name": "保安"
995 | },
996 | {
997 | "dataId": "110804",
998 | "name": "月嫂"
999 | },
1000 | {
1001 | "dataId": "110805",
1002 | "name": "育婴师"
1003 | },
1004 | {
1005 | "dataId": "110806",
1006 | "name": "洗衣工"
1007 | },
1008 | {
1009 | "dataId": "110807",
1010 | "name": "钟点工"
1011 | },
1012 | {
1013 | "dataId": "110808",
1014 | "name": "送水工"
1015 | },
1016 | {
1017 | "dataId": "110809",
1018 | "name": "护工"
1019 | },
1020 | {
1021 | "dataId": "110810",
1022 | "name": "其他"
1023 | }
1024 | ]
1025 | },
1026 | {
1027 | "dataId": "110900",
1028 | "name": "物业管理",
1029 | "jobtype": [
1030 | {
1031 | "dataId": "110901",
1032 | "name": "物业维修"
1033 | },
1034 | {
1035 | "dataId": "110902",
1036 | "name": "物业经理"
1037 | },
1038 | {
1039 | "dataId": "110903",
1040 | "name": "物业管理员"
1041 | },
1042 | {
1043 | "dataId": "110904",
1044 | "name": "合同管理"
1045 | },
1046 | {
1047 | "dataId": "110905",
1048 | "name": "招商经理"
1049 | },
1050 | {
1051 | "dataId": "110906",
1052 | "name": "其他"
1053 | }
1054 | ]
1055 | },
1056 | {
1057 | "dataId": "111000",
1058 | "name": "教育/培训",
1059 | "jobtype": [
1060 | {
1061 | "dataId": "111001",
1062 | "name": "教师/助教"
1063 | },
1064 | {
1065 | "dataId": "111002",
1066 | "name": "家教"
1067 | },
1068 | {
1069 | "dataId": "111003",
1070 | "name": "培训师"
1071 | },
1072 | {
1073 | "dataId": "111004",
1074 | "name": "幼教"
1075 | },
1076 | {
1077 | "dataId": "111005",
1078 | "name": "培训策划"
1079 | },
1080 | {
1081 | "dataId": "111006",
1082 | "name": "培训助理"
1083 | },
1084 | {
1085 | "dataId": "111007",
1086 | "name": "教务管理"
1087 | },
1088 | {
1089 | "dataId": "111008",
1090 | "name": "教具开发"
1091 | },
1092 | {
1093 | "dataId": "111009",
1094 | "name": "学术研究"
1095 | },
1096 | {
1097 | "dataId": "111010",
1098 | "name": "课程顾问"
1099 | },
1100 | {
1101 | "dataId": "111011",
1102 | "name": "校长"
1103 | },
1104 | {
1105 | "dataId": "111012",
1106 | "name": "拓展训练师"
1107 | },
1108 | {
1109 | "dataId": "111013",
1110 | "name": "其他"
1111 | }
1112 | ]
1113 | },
1114 | {
1115 | "dataId": "111100",
1116 | "name": "娱乐/影视",
1117 | "jobtype": [
1118 | {
1119 | "dataId": "111101",
1120 | "name": "礼仪"
1121 | },
1122 | {
1123 | "dataId": "111102",
1124 | "name": "调酒师"
1125 | },
1126 | {
1127 | "dataId": "111103",
1128 | "name": "摄影师"
1129 | },
1130 | {
1131 | "dataId": "111104",
1132 | "name": "酒吧服务员"
1133 | },
1134 | {
1135 | "dataId": "111105",
1136 | "name": "歌厅服务员"
1137 | },
1138 | {
1139 | "dataId": "111106",
1140 | "name": "主持人"
1141 | },
1142 | {
1143 | "dataId": "111107",
1144 | "name": "音效师"
1145 | },
1146 | {
1147 | "dataId": "111108",
1148 | "name": "后期制作"
1149 | },
1150 | {
1151 | "dataId": "111109",
1152 | "name": "配音员"
1153 | },
1154 | {
1155 | "dataId": "111110",
1156 | "name": "放映员"
1157 | },
1158 | {
1159 | "dataId": "111111",
1160 | "name": "灯光师"
1161 | },
1162 | {
1163 | "dataId": "111112",
1164 | "name": "其他"
1165 | }
1166 | ]
1167 | },
1168 | {
1169 | "dataId": "111200",
1170 | "name": "医疗/药剂",
1171 | "jobtype": [
1172 | {
1173 | "dataId": "111201",
1174 | "name": "医生"
1175 | },
1176 | {
1177 | "dataId": "111202",
1178 | "name": "护士"
1179 | },
1180 | {
1181 | "dataId": "111203",
1182 | "name": "药剂师"
1183 | },
1184 | {
1185 | "dataId": "111204",
1186 | "name": "保健医生"
1187 | },
1188 | {
1189 | "dataId": "111205",
1190 | "name": "心理医生"
1191 | },
1192 | {
1193 | "dataId": "111206",
1194 | "name": "导医"
1195 | },
1196 | {
1197 | "dataId": "111207",
1198 | "name": "护士长"
1199 | },
1200 | {
1201 | "dataId": "111208",
1202 | "name": "理疗师"
1203 | },
1204 | {
1205 | "dataId": "111209",
1206 | "name": "医药质检"
1207 | },
1208 | {
1209 | "dataId": "111210",
1210 | "name": "医疗管理"
1211 | },
1212 | {
1213 | "dataId": "111211",
1214 | "name": "美容整形师"
1215 | },
1216 | {
1217 | "dataId": "111212",
1218 | "name": "验光师"
1219 | },
1220 | {
1221 | "dataId": "111213",
1222 | "name": "营养师"
1223 | },
1224 | {
1225 | "dataId": "111214",
1226 | "name": "宠物医生"
1227 | },
1228 | {
1229 | "dataId": "111215",
1230 | "name": "其他"
1231 | }
1232 | ]
1233 | }
1234 | ]
1235 | },
1236 | {
1237 | "dataId": "100000",
1238 | "name": "商务服务岗位",
1239 | "jobtype": [
1240 | {
1241 | "dataId": "100100",
1242 | "name": "销售",
1243 | "jobtype": [
1244 | {
1245 | "dataId": "100101",
1246 | "name": "销售代表"
1247 | },
1248 | {
1249 | "dataId": "100102",
1250 | "name": "电话销售"
1251 | },
1252 | {
1253 | "dataId": "100103",
1254 | "name": "销售经理"
1255 | },
1256 | {
1257 | "dataId": "100104",
1258 | "name": "销售助理"
1259 | },
1260 | {
1261 | "dataId": "100105",
1262 | "name": "销售总监"
1263 | },
1264 | {
1265 | "dataId": "100106",
1266 | "name": "销售支持"
1267 | },
1268 | {
1269 | "dataId": "100107",
1270 | "name": "汽车销售"
1271 | },
1272 | {
1273 | "dataId": "100108",
1274 | "name": "医药代表"
1275 | },
1276 | {
1277 | "dataId": "100109",
1278 | "name": "器械销售"
1279 | },
1280 | {
1281 | "dataId": "100110",
1282 | "name": "网络销售"
1283 | },
1284 | {
1285 | "dataId": "100111",
1286 | "name": "团购销售"
1287 | },
1288 | {
1289 | "dataId": "100112",
1290 | "name": "区域销售"
1291 | },
1292 | {
1293 | "dataId": "100113",
1294 | "name": "渠道专员"
1295 | },
1296 | {
1297 | "dataId": "100114",
1298 | "name": "渠道经理"
1299 | },
1300 | {
1301 | "dataId": "100115",
1302 | "name": "客户经理"
1303 | },
1304 | {
1305 | "dataId": "100116",
1306 | "name": "大客户经理"
1307 | },
1308 | {
1309 | "dataId": "100117",
1310 | "name": "会籍顾问"
1311 | },
1312 | {
1313 | "dataId": "100118",
1314 | "name": "其他"
1315 | }
1316 | ]
1317 | },
1318 | {
1319 | "dataId": "100200",
1320 | "name": "客服",
1321 | "jobtype": [
1322 | {
1323 | "dataId": "100201",
1324 | "name": "客服专员"
1325 | },
1326 | {
1327 | "dataId": "100202",
1328 | "name": "电话客服"
1329 | },
1330 | {
1331 | "dataId": "100203",
1332 | "name": "客服经理"
1333 | },
1334 | {
1335 | "dataId": "100204",
1336 | "name": "客服总监"
1337 | },
1338 | {
1339 | "dataId": "100205",
1340 | "name": "售后服务"
1341 | },
1342 | {
1343 | "dataId": "100206",
1344 | "name": "客户关系"
1345 | },
1346 | {
1347 | "dataId": "100207",
1348 | "name": "其他"
1349 | }
1350 | ]
1351 | },
1352 | {
1353 | "dataId": "100300",
1354 | "name": "人事/行政",
1355 | "jobtype": [
1356 | {
1357 | "dataId": "100301",
1358 | "name": "文员"
1359 | },
1360 | {
1361 | "dataId": "100302",
1362 | "name": "前台"
1363 | },
1364 | {
1365 | "dataId": "100303",
1366 | "name": "秘书"
1367 | },
1368 | {
1369 | "dataId": "100304",
1370 | "name": "人事专员"
1371 | },
1372 | {
1373 | "dataId": "100305",
1374 | "name": "人事经理"
1375 | },
1376 | {
1377 | "dataId": "100306",
1378 | "name": "人事总监"
1379 | },
1380 | {
1381 | "dataId": "100307",
1382 | "name": "行政助理"
1383 | },
1384 | {
1385 | "dataId": "100308",
1386 | "name": "行政主管"
1387 | },
1388 | {
1389 | "dataId": "100309",
1390 | "name": "行政总监"
1391 | },
1392 | {
1393 | "dataId": "100310",
1394 | "name": "薪酬绩效"
1395 | },
1396 | {
1397 | "dataId": "100311",
1398 | "name": "招聘专员"
1399 | },
1400 | {
1401 | "dataId": "100312",
1402 | "name": "招聘经理"
1403 | },
1404 | {
1405 | "dataId": "100313",
1406 | "name": "猎头顾问"
1407 | },
1408 | {
1409 | "dataId": "100314",
1410 | "name": "培训专员"
1411 | },
1412 | {
1413 | "dataId": "100315",
1414 | "name": "培训经理"
1415 | },
1416 | {
1417 | "dataId": "100316",
1418 | "name": "后期管理"
1419 | },
1420 | {
1421 | "dataId": "100317",
1422 | "name": "其他"
1423 | }
1424 | ]
1425 | },
1426 | {
1427 | "dataId": "100400",
1428 | "name": "司机",
1429 | "jobtype": [
1430 | {
1431 | "dataId": "100401",
1432 | "name": "商务司机"
1433 | },
1434 | {
1435 | "dataId": "100402",
1436 | "name": "货运司机"
1437 | },
1438 | {
1439 | "dataId": "100403",
1440 | "name": "客运司机"
1441 | },
1442 | {
1443 | "dataId": "100404",
1444 | "name": "出租车司机"
1445 | },
1446 | {
1447 | "dataId": "100405",
1448 | "name": "班车司机"
1449 | },
1450 | {
1451 | "dataId": "100406",
1452 | "name": "特种车司机"
1453 | },
1454 | {
1455 | "dataId": "100407",
1456 | "name": "驾校教练"
1457 | },
1458 | {
1459 | "dataId": "100408",
1460 | "name": "其他"
1461 | }
1462 | ]
1463 | },
1464 | {
1465 | "dataId": "100500",
1466 | "name": "物流/仓储",
1467 | "jobtype": [
1468 | {
1469 | "dataId": "100501",
1470 | "name": "快递员"
1471 | },
1472 | {
1473 | "dataId": "100502",
1474 | "name": "仓库管理员"
1475 | },
1476 | {
1477 | "dataId": "100503",
1478 | "name": "搬运工"
1479 | },
1480 | {
1481 | "dataId": "100504",
1482 | "name": "物流专员"
1483 | },
1484 | {
1485 | "dataId": "100505",
1486 | "name": "物流经理"
1487 | },
1488 | {
1489 | "dataId": "100506",
1490 | "name": "物流总监"
1491 | },
1492 | {
1493 | "dataId": "100507",
1494 | "name": "调度员"
1495 | },
1496 | {
1497 | "dataId": "100508",
1498 | "name": "仓库经理"
1499 | },
1500 | {
1501 | "dataId": "100509",
1502 | "name": "供应链管理"
1503 | },
1504 | {
1505 | "dataId": "100510",
1506 | "name": "单证员"
1507 | },
1508 | {
1509 | "dataId": "100511",
1510 | "name": "国际货运"
1511 | },
1512 | {
1513 | "dataId": "100512",
1514 | "name": "其他"
1515 | }
1516 | ]
1517 | },
1518 | {
1519 | "dataId": "100600",
1520 | "name": "贸易/采购",
1521 | "jobtype": [
1522 | {
1523 | "dataId": "100601",
1524 | "name": "外贸专员"
1525 | },
1526 | {
1527 | "dataId": "100602",
1528 | "name": "外贸经理"
1529 | },
1530 | {
1531 | "dataId": "100603",
1532 | "name": "采购员"
1533 | },
1534 | {
1535 | "dataId": "100604",
1536 | "name": "采购助理"
1537 | },
1538 | {
1539 | "dataId": "100605",
1540 | "name": "采购经理"
1541 | },
1542 | {
1543 | "dataId": "100606",
1544 | "name": "报关员"
1545 | },
1546 | {
1547 | "dataId": "100607",
1548 | "name": "商务专员"
1549 | },
1550 | {
1551 | "dataId": "100608",
1552 | "name": "买手"
1553 | },
1554 | {
1555 | "dataId": "100609",
1556 | "name": "其他"
1557 | }
1558 | ]
1559 | },
1560 | {
1561 | "dataId": "100700",
1562 | "name": "翻译",
1563 | "jobtype": [
1564 | {
1565 | "dataId": "100701",
1566 | "name": "英语"
1567 | },
1568 | {
1569 | "dataId": "100702",
1570 | "name": "日语"
1571 | },
1572 | {
1573 | "dataId": "100703",
1574 | "name": "俄语"
1575 | },
1576 | {
1577 | "dataId": "100704",
1578 | "name": "韩语"
1579 | },
1580 | {
1581 | "dataId": "100705",
1582 | "name": "法语"
1583 | },
1584 | {
1585 | "dataId": "100706",
1586 | "name": "德语"
1587 | },
1588 | {
1589 | "dataId": "100707",
1590 | "name": "西班牙语"
1591 | },
1592 | {
1593 | "dataId": "100708",
1594 | "name": "意大利语"
1595 | },
1596 | {
1597 | "dataId": "100709",
1598 | "name": "葡萄牙语"
1599 | },
1600 | {
1601 | "dataId": "100710",
1602 | "name": "阿拉伯语"
1603 | },
1604 | {
1605 | "dataId": "100711",
1606 | "name": "小语种"
1607 | },
1608 | {
1609 | "dataId": "100712",
1610 | "name": "其他"
1611 | }
1612 | ]
1613 | },
1614 | {
1615 | "dataId": "100800",
1616 | "name": "律师/法务",
1617 | "jobtype": [
1618 | {
1619 | "dataId": "100801",
1620 | "name": "律师助理"
1621 | },
1622 | {
1623 | "dataId": "100802",
1624 | "name": "法务专员"
1625 | },
1626 | {
1627 | "dataId": "100803",
1628 | "name": "律师"
1629 | },
1630 | {
1631 | "dataId": "100804",
1632 | "name": "专利顾问"
1633 | },
1634 | {
1635 | "dataId": "100805",
1636 | "name": "合规管理"
1637 | },
1638 | {
1639 | "dataId": "100806",
1640 | "name": "其他"
1641 | }
1642 | ]
1643 | },
1644 | {
1645 | "dataId": "100900",
1646 | "name": "财务/审计",
1647 | "jobtype": [
1648 | {
1649 | "dataId": "100901",
1650 | "name": "财务经理"
1651 | },
1652 | {
1653 | "dataId": "100902",
1654 | "name": "会计"
1655 | },
1656 | {
1657 | "dataId": "100903",
1658 | "name": "出纳"
1659 | },
1660 | {
1661 | "dataId": "100904",
1662 | "name": "会计助理"
1663 | },
1664 | {
1665 | "dataId": "100905",
1666 | "name": "财务总监"
1667 | },
1668 | {
1669 | "dataId": "100906",
1670 | "name": "审计专员"
1671 | },
1672 | {
1673 | "dataId": "100907",
1674 | "name": "审计经理"
1675 | },
1676 | {
1677 | "dataId": "100908",
1678 | "name": "统计员"
1679 | },
1680 | {
1681 | "dataId": "100909",
1682 | "name": "税务专员"
1683 | },
1684 | {
1685 | "dataId": "100910",
1686 | "name": "税务经理"
1687 | },
1688 | {
1689 | "dataId": "100911",
1690 | "name": "财务分析员"
1691 | },
1692 | {
1693 | "dataId": "100912",
1694 | "name": "成本管理员"
1695 | },
1696 | {
1697 | "dataId": "100913",
1698 | "name": "其他"
1699 | }
1700 | ]
1701 | },
1702 | {
1703 | "dataId": "101000",
1704 | "name": "广告/咨询",
1705 | "jobtype": [
1706 | {
1707 | "dataId": "101001",
1708 | "name": "咨询顾问"
1709 | },
1710 | {
1711 | "dataId": "101002",
1712 | "name": "广告制作"
1713 | },
1714 | {
1715 | "dataId": "101003",
1716 | "name": "广告文案"
1717 | },
1718 | {
1719 | "dataId": "101004",
1720 | "name": "广告创意"
1721 | },
1722 | {
1723 | "dataId": "101005",
1724 | "name": "创意总监"
1725 | },
1726 | {
1727 | "dataId": "101006",
1728 | "name": "会展策划"
1729 | },
1730 | {
1731 | "dataId": "101007",
1732 | "name": "客户主管"
1733 | },
1734 | {
1735 | "dataId": "101008",
1736 | "name": "企业策划"
1737 | },
1738 | {
1739 | "dataId": "101009",
1740 | "name": "媒介策划"
1741 | },
1742 | {
1743 | "dataId": "101010",
1744 | "name": "婚礼策划"
1745 | },
1746 | {
1747 | "dataId": "101011",
1748 | "name": "咨询经理"
1749 | },
1750 | {
1751 | "dataId": "101012",
1752 | "name": "其他"
1753 | }
1754 | ]
1755 | },
1756 | {
1757 | "dataId": "101100",
1758 | "name": "美术/设计",
1759 | "jobtype": [
1760 | {
1761 | "dataId": "101101",
1762 | "name": "服装设计"
1763 | },
1764 | {
1765 | "dataId": "101102",
1766 | "name": "平面设计"
1767 | },
1768 | {
1769 | "dataId": "101103",
1770 | "name": "美编"
1771 | },
1772 | {
1773 | "dataId": "101104",
1774 | "name": "家居设计"
1775 | },
1776 | {
1777 | "dataId": "101105",
1778 | "name": "美术指导"
1779 | },
1780 | {
1781 | "dataId": "101106",
1782 | "name": "店面设计"
1783 | },
1784 | {
1785 | "dataId": "101107",
1786 | "name": "珠宝设计"
1787 | },
1788 | {
1789 | "dataId": "101108",
1790 | "name": "动画设计"
1791 | },
1792 | {
1793 | "dataId": "101109",
1794 | "name": "包装设计"
1795 | },
1796 | {
1797 | "dataId": "101110",
1798 | "name": "室内设计"
1799 | },
1800 | {
1801 | "dataId": "101111",
1802 | "name": "CAD制图"
1803 | },
1804 | {
1805 | "dataId": "101112",
1806 | "name": "其他"
1807 | }
1808 | ]
1809 | },
1810 | {
1811 | "dataId": "101200",
1812 | "name": "编辑/出版",
1813 | "jobtype": [
1814 | {
1815 | "dataId": "101201",
1816 | "name": "编辑"
1817 | },
1818 | {
1819 | "dataId": "101202",
1820 | "name": "记者"
1821 | },
1822 | {
1823 | "dataId": "101203",
1824 | "name": "总编辑"
1825 | },
1826 | {
1827 | "dataId": "101204",
1828 | "name": "出版发行"
1829 | },
1830 | {
1831 | "dataId": "101205",
1832 | "name": "排版设计"
1833 | },
1834 | {
1835 | "dataId": "101206",
1836 | "name": "印刷操作"
1837 | },
1838 | {
1839 | "dataId": "101207",
1840 | "name": "装订烫金"
1841 | },
1842 | {
1843 | "dataId": "101208",
1844 | "name": "其他"
1845 | }
1846 | ]
1847 | },
1848 | {
1849 | "dataId": "101300",
1850 | "name": "网络/IT",
1851 | "jobtype": [
1852 | {
1853 | "dataId": "101301",
1854 | "name": "网页设计"
1855 | },
1856 | {
1857 | "dataId": "101302",
1858 | "name": "网站编辑"
1859 | },
1860 | {
1861 | "dataId": "101303",
1862 | "name": "程序员"
1863 | },
1864 | {
1865 | "dataId": "101304",
1866 | "name": "技术专员"
1867 | },
1868 | {
1869 | "dataId": "101305",
1870 | "name": "软件工程师"
1871 | },
1872 | {
1873 | "dataId": "101306",
1874 | "name": "技术支持"
1875 | },
1876 | {
1877 | "dataId": "101307",
1878 | "name": "技术经理"
1879 | },
1880 | {
1881 | "dataId": "101308",
1882 | "name": "硬件工程师"
1883 | },
1884 | {
1885 | "dataId": "101309",
1886 | "name": "质量工程师"
1887 | },
1888 | {
1889 | "dataId": "101310",
1890 | "name": "测试工程师"
1891 | },
1892 | {
1893 | "dataId": "101311",
1894 | "name": "系统架构师"
1895 | },
1896 | {
1897 | "dataId": "101312",
1898 | "name": "项目经理"
1899 | },
1900 | {
1901 | "dataId": "101313",
1902 | "name": "产品经理"
1903 | },
1904 | {
1905 | "dataId": "101314",
1906 | "name": "网站运营"
1907 | },
1908 | {
1909 | "dataId": "101315",
1910 | "name": "网站策划"
1911 | },
1912 | {
1913 | "dataId": "101316",
1914 | "name": "网络管理员"
1915 | },
1916 | {
1917 | "dataId": "101317",
1918 | "name": "信息安全"
1919 | },
1920 | {
1921 | "dataId": "101318",
1922 | "name": "通信工程师"
1923 | },
1924 | {
1925 | "dataId": "101319",
1926 | "name": "实施工程师"
1927 | },
1928 | {
1929 | "dataId": "101320",
1930 | "name": "DBA"
1931 | },
1932 | {
1933 | "dataId": "101321",
1934 | "name": "游戏设计"
1935 | },
1936 | {
1937 | "dataId": "101322",
1938 | "name": "视频设计"
1939 | },
1940 | {
1941 | "dataId": "101323",
1942 | "name": "其他"
1943 | }
1944 | ]
1945 | },
1946 | {
1947 | "dataId": "101400",
1948 | "name": "金融/证券",
1949 | "jobtype": [
1950 | {
1951 | "dataId": "101401",
1952 | "name": "理财顾问"
1953 | },
1954 | {
1955 | "dataId": "101402",
1956 | "name": "证券分析"
1957 | },
1958 | {
1959 | "dataId": "101403",
1960 | "name": "柜员"
1961 | },
1962 | {
1963 | "dataId": "101404",
1964 | "name": "证券经纪人"
1965 | },
1966 | {
1967 | "dataId": "101405",
1968 | "name": "证券经理"
1969 | },
1970 | {
1971 | "dataId": "101406",
1972 | "name": "信用卡业务"
1973 | },
1974 | {
1975 | "dataId": "101407",
1976 | "name": "银行经理"
1977 | },
1978 | {
1979 | "dataId": "101408",
1980 | "name": "信贷管理"
1981 | },
1982 | {
1983 | "dataId": "101409",
1984 | "name": "资产评估"
1985 | },
1986 | {
1987 | "dataId": "101410",
1988 | "name": "担保典当"
1989 | },
1990 | {
1991 | "dataId": "101411",
1992 | "name": "拍卖师"
1993 | },
1994 | {
1995 | "dataId": "101412",
1996 | "name": "外汇经纪人"
1997 | },
1998 | {
1999 | "dataId": "101413",
2000 | "name": "融资专员"
2001 | },
2002 | {
2003 | "dataId": "101414",
2004 | "name": "融资经理"
2005 | },
2006 | {
2007 | "dataId": "101415",
2008 | "name": "风险管理"
2009 | },
2010 | {
2011 | "dataId": "101416",
2012 | "name": "操盘手"
2013 | },
2014 | {
2015 | "dataId": "101417",
2016 | "name": "其他"
2017 | }
2018 | ]
2019 | },
2020 | {
2021 | "dataId": "101500",
2022 | "name": "市场/公关",
2023 | "jobtype": [
2024 | {
2025 | "dataId": "101501",
2026 | "name": "市场专员"
2027 | },
2028 | {
2029 | "dataId": "101502",
2030 | "name": "市场经理"
2031 | },
2032 | {
2033 | "dataId": "101503",
2034 | "name": "公关员"
2035 | },
2036 | {
2037 | "dataId": "101504",
2038 | "name": "市场拓展"
2039 | },
2040 | {
2041 | "dataId": "101505",
2042 | "name": "市场调研"
2043 | },
2044 | {
2045 | "dataId": "101506",
2046 | "name": "市场策划"
2047 | },
2048 | {
2049 | "dataId": "101507",
2050 | "name": "媒介专员"
2051 | },
2052 | {
2053 | "dataId": "101508",
2054 | "name": "媒介经理"
2055 | },
2056 | {
2057 | "dataId": "101509",
2058 | "name": "会展专员"
2059 | },
2060 | {
2061 | "dataId": "101510",
2062 | "name": "品牌经理"
2063 | },
2064 | {
2065 | "dataId": "101511",
2066 | "name": "公关经理"
2067 | },
2068 | {
2069 | "dataId": "101512",
2070 | "name": "企划经理"
2071 | },
2072 | {
2073 | "dataId": "101513",
2074 | "name": "其他"
2075 | }
2076 | ]
2077 | },
2078 | {
2079 | "dataId": "101600",
2080 | "name": "保险/理赔",
2081 | "jobtype": [
2082 | {
2083 | "dataId": "101601",
2084 | "name": "保险顾问"
2085 | },
2086 | {
2087 | "dataId": "101602",
2088 | "name": "储备经理"
2089 | },
2090 | {
2091 | "dataId": "101603",
2092 | "name": "经纪人"
2093 | },
2094 | {
2095 | "dataId": "101604",
2096 | "name": "保险内勤"
2097 | },
2098 | {
2099 | "dataId": "101605",
2100 | "name": "项目经理"
2101 | },
2102 | {
2103 | "dataId": "101606",
2104 | "name": "核保理赔"
2105 | },
2106 | {
2107 | "dataId": "101607",
2108 | "name": "保险精算师"
2109 | },
2110 | {
2111 | "dataId": "101608",
2112 | "name": "产品开发"
2113 | },
2114 | {
2115 | "dataId": "101609",
2116 | "name": "续期管理"
2117 | },
2118 | {
2119 | "dataId": "101610",
2120 | "name": "保险培训师"
2121 | },
2122 | {
2123 | "dataId": "101611",
2124 | "name": "契约管理"
2125 | },
2126 | {
2127 | "dataId": "101612",
2128 | "name": "其他"
2129 | }
2130 | ]
2131 | },
2132 | {
2133 | "dataId": "101700",
2134 | "name": "房地产",
2135 | "jobtype": [
2136 | {
2137 | "dataId": "101701",
2138 | "name": "房产经纪人"
2139 | },
2140 | {
2141 | "dataId": "101702",
2142 | "name": "置业顾问"
2143 | },
2144 | {
2145 | "dataId": "101703",
2146 | "name": "置业店长"
2147 | },
2148 | {
2149 | "dataId": "101704",
2150 | "name": "房产店员"
2151 | },
2152 | {
2153 | "dataId": "101705",
2154 | "name": "房产客服"
2155 | },
2156 | {
2157 | "dataId": "101706",
2158 | "name": "房产内勤"
2159 | },
2160 | {
2161 | "dataId": "101707",
2162 | "name": "房地产策划"
2163 | },
2164 | {
2165 | "dataId": "101708",
2166 | "name": "房产评估师"
2167 | },
2168 | {
2169 | "dataId": "101709",
2170 | "name": "其他房产职位"
2171 | },
2172 | {
2173 | "dataId": "101710",
2174 | "name": "其他"
2175 | }
2176 | ]
2177 | },
2178 | {
2179 | "dataId": "101800",
2180 | "name": "高级管理",
2181 | "jobtype": [
2182 | {
2183 | "dataId": "101801",
2184 | "name": "总监"
2185 | },
2186 | {
2187 | "dataId": "101802",
2188 | "name": "总裁助理"
2189 | },
2190 | {
2191 | "dataId": "101803",
2192 | "name": "副总裁"
2193 | },
2194 | {
2195 | "dataId": "101804",
2196 | "name": "分公司经理"
2197 | },
2198 | {
2199 | "dataId": "101805",
2200 | "name": "首席执行官"
2201 | },
2202 | {
2203 | "dataId": "101806",
2204 | "name": "首席运营官"
2205 | },
2206 | {
2207 | "dataId": "101807",
2208 | "name": "首席财务官"
2209 | },
2210 | {
2211 | "dataId": "101808",
2212 | "name": "首席技术官"
2213 | },
2214 | {
2215 | "dataId": "101809",
2216 | "name": "合伙人"
2217 | },
2218 | {
2219 | "dataId": "101810",
2220 | "name": "其他"
2221 | }
2222 | ]
2223 | }
2224 | ]
2225 | }
2226 | ]
--------------------------------------------------------------------------------