├── 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 | ![](https://github.com/haibuzou/ExpandTable/raw/master/art/ScreenGif.gif) 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 | 5 | 10 | 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 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 | ] --------------------------------------------------------------------------------