Full Code of haibuzou/ExpandTable for AI

master 53f24cc99f7b cached
40 files
90.4 KB
24.7k tokens
91 symbols
1 requests
Download .txt
Repository: haibuzou/ExpandTable
Branch: master
Commit: 53f24cc99f7b
Files: 40
Total size: 90.4 KB

Directory structure:
gitextract_edkb4w1x/

├── .gitignore
├── README.md
├── app/
│   ├── .gitignore
│   ├── build.gradle
│   ├── libs/
│   │   └── gson-2.2.1.jar
│   ├── proguard-rules.pro
│   └── src/
│       └── main/
│           ├── AndroidManifest.xml
│           ├── java/
│           │   └── com/
│           │       └── haibuzou/
│           │           └── myapplication/
│           │               ├── MainActivity.java
│           │               ├── Utils.java
│           │               ├── adapter/
│           │               │   ├── CommonAdapter.java
│           │               │   ├── ExpandGridAdapter.java
│           │               │   ├── MyViewPagerAdapter.java
│           │               │   └── ViewHolder.java
│           │               ├── entity/
│           │               │   ├── BaseData.java
│           │               │   ├── GongZhong.java
│           │               │   └── ZhaoPin.java
│           │               └── view/
│           │                   ├── CurrenPositionView.java
│           │                   ├── ItemTextView.java
│           │                   └── MyTextView.java
│           └── res/
│               ├── drawable/
│               │   └── main_click_selector.xml
│               ├── layout/
│               │   ├── activity_main.xml
│               │   ├── expand_grid_item.xml
│               │   ├── expand_item.xml
│               │   ├── pulldown_view.xml
│               │   ├── table_row_item.xml
│               │   └── viewpager.xml
│               ├── menu/
│               │   └── menu_main.xml
│               ├── raw/
│               │   └── zhaopin.json
│               ├── values/
│               │   ├── colors.xml
│               │   ├── dimens.xml
│               │   ├── strings.xml
│               │   └── styles.xml
│               └── values-w820dp/
│                   └── dimens.xml
├── build.gradle
├── gradle/
│   └── wrapper/
│       ├── gradle-wrapper.jar
│       └── gradle-wrapper.properties
├── gradle.properties
├── gradlew
├── gradlew.bat
└── settings.gradle

================================================
FILE CONTENTS
================================================

================================================
FILE: .gitignore
================================================
#built application files
*.apk
*.ap_

# files for the dex VM
*.dex

# Java class files
*.class

# generated files
bin/
gen/

# Local configuration file (sdk path, etc)
local.properties

# Windows thumbnail db
Thumbs.db

# OSX files
.DS_Store

# Eclipse project files
.classpath
.project

# Android Studio
*.iml
.idea
#.idea/workspace.xml - remove # and delete .idea if it better suit your needs.
.gradle
build/

================================================
FILE: README.md
================================================
# ExpandTable
完全高仿58同城 点击展开的表格效果
使用tablelayout 来实现

### 效果图:
![](https://github.com/haibuzou/ExpandTable/raw/master/art/ScreenGif.gif) 


================================================
FILE: app/.gitignore
================================================
/build


================================================
FILE: app/build.gradle
================================================
apply plugin: 'com.android.application'

android {
    compileSdkVersion 22
    buildToolsVersion "23.0.1"

    defaultConfig {
        applicationId "com.haibuzou.myapplication"
        minSdkVersion 14
        targetSdkVersion 22
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:appcompat-v7:22.2.0'
    compile files('libs/gson-2.2.1.jar')
}


================================================
FILE: app/proguard-rules.pro
================================================
# Add project specific ProGuard rules here.
# By default, the flags in this file are appended to flags specified
# in D:\adt-bundle-windows-x86_64-20130917\sdk/tools/proguard/proguard-android.txt
# You can edit the include path and order by changing the proguardFiles
# directive in build.gradle.
#
# For more details, see
#   http://developer.android.com/guide/developing/tools/proguard.html

# Add any project specific keep options here:

# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
#   public *;
#}


================================================
FILE: app/src/main/AndroidManifest.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.haibuzou.myapplication">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme">
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>


================================================
FILE: app/src/main/java/com/haibuzou/myapplication/MainActivity.java
================================================
package com.haibuzou.myapplication;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.util.TypedValue;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.animation.Animation;
import android.view.animation.Transformation;
import android.widget.GridView;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import android.widget.TableLayout;


import com.haibuzou.myapplication.adapter.ExpandGridAdapter;
import com.haibuzou.myapplication.adapter.MyViewPagerAdapter;
import com.haibuzou.myapplication.entity.BaseData;
import com.haibuzou.myapplication.entity.ZhaoPin;
import com.haibuzou.myapplication.view.CurrenPositionView;
import com.haibuzou.myapplication.view.MyTextView;

import java.util.ArrayList;
import java.util.List;


public class MainActivity extends Activity implements ExpandGridAdapter.OnClick {

    //招聘数据
    private List<ZhaoPin> data;
    private LinearLayout currenPositionLinear;
    private final Integer duration = 200;
    private RelativeLayout rel;
    private String itemId;
    //记录点击位置
    private String clickPosition = "";
    private MyTextView clicktxt;
    //下拉的 圆点显示layout
    private LinearLayout circlelayout;
    private int lastlocation = -1;
    private ExpandGridAdapter.OnClick listener;
    //每行显示条目个数
    private static final int NUM_LINE = 3;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initData();
        initView();
    }

    private void initView() {
        currenPositionLinear = (LinearLayout) findViewById(R.id.zp_curr_potion_linear);
        for (int num = 0; num < data.size(); num++) {
            ZhaoPin zhaoPin = data.get(num);
            CurrenPositionView currenPositionView = new CurrenPositionView(this);
            currenPositionView.setData(zhaoPin);
            currenPositionView.setViewId(num);
            currenPositionView.init();
            if (num > 0) {
                LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);
                params.topMargin = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 10, getResources().getDisplayMetrics());
                if (num == data.size() - 1) {
                    params.bottomMargin = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 50, getResources().getDisplayMetrics());
                }
                currenPositionLinear.addView(currenPositionView, params);
            } else {
                currenPositionLinear.addView(currenPositionView);
            }

        }
    }

    private void initData() {
        if (listener == null) {
            listener = this;
        }
        if (data == null) {
            data = Utils.getJobType(this);
        }
    }

    public class OnItemClick implements OnClickListener, OnPageChangeListener {
        private final int position;
        private final int tag;
        private final MyTextView view;
        private final TableLayout tableLayout;
        private final ZhaoPin zhaoPin;

        public OnItemClick(ZhaoPin zhaoPin, int position, int tag, TableLayout table, MyTextView view) {
            this.position = position;
            this.tag = tag;
            this.view = view;
            this.tableLayout = table;
            this.zhaoPin = zhaoPin;
        }

        @Override
        public void onPageScrollStateChanged(int arg0) {

        }

        @Override
        public void onPageScrolled(int arg0, float arg1, int arg2) {
            if (lastlocation != arg0 && lastlocation != -1) {
                ImageView mimage = (ImageView) circlelayout
                        .findViewWithTag(lastlocation + 1 + 10);
                if (mimage != null) {
                    mimage.setImageResource(R.mipmap.black_circle);
                }
            }

            ImageView image = (ImageView) circlelayout
                    .findViewWithTag(arg0 + 1 + 10);
            if (image != null) {
                image.setImageResource(R.mipmap.orange_circle);
            }

            lastlocation = arg0;
        }

        @Override
        public void onPageSelected(int arg0) {

        }

        private void init(View v, int location) {
            List<BaseData> list;
            ViewPager pager = (ViewPager) v.findViewById(R.id.expand_item);
            // 底部的圆点初始化
            circlelayout = (LinearLayout) v.findViewById(R.id.circle_layout);
            circlelayout.removeAllViews();
            int radio = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 5, getResources().getDisplayMetrics());
            // 初始化一个params 用于圆点大小设置
            LinearLayout.LayoutParams circleparams = new LinearLayout.LayoutParams(radio, radio);
            circleparams.setMargins(0, 0, 10, 0);
            List<View> views = new ArrayList<>();
            // 下拉表格的行数
            int row = zhaoPin.getJobtype().get(location).getJobtype().size() / NUM_LINE;
            if (row > 4) {
                row = 4;
            } else if (row < 4) {
                if (zhaoPin.getJobtype().get(location).getJobtype().size() % NUM_LINE != 0) {
                    row += 1;
                }
            }
            // 计算生成 view的数量
            int i = zhaoPin.getJobtype().get(location).getJobtype().size() / 12;
            int len = zhaoPin.getJobtype().get(location).getJobtype().size() % 12;
            if (len > 0) {
                i += 1;
            }
            // View的 初始化
            for (int n = 1; n <= i; n++) {
                View view = LayoutInflater.from(MainActivity.this).inflate(R.layout.viewpager, null);
                GridView grid = (GridView) view.findViewById(R.id.expand_grid);
                // 计算每个 gridview 存放多少数据
                if (i == 0) {
                    list = zhaoPin.getJobtype().get(location).getJobtype();
                } else if (n < i) {
                    // 每一个 表只有3列 最多 4行 每个表最多12个
                    list = zhaoPin.getJobtype().get(location).getJobtype().subList((n - 1) * 12, n * 12);
                } else {
                    int size = zhaoPin.getJobtype().get(location).getJobtype().size();
                    list = zhaoPin.getJobtype().get(location).getJobtype().subList((n - 1) * 12, size);
                }
                ExpandGridAdapter ea = new ExpandGridAdapter(MainActivity.this, list, R.layout.expand_grid_item);
                ea.setOnClick(listener);
                grid.setAdapter(ea);
                views.add(grid);
                if (i > 1) {
                    circlelayout.setVisibility(View.VISIBLE);
                    // viewpager 底部的 点标识
                    ImageView image = new ImageView(MainActivity.this);
                    image.setTag(n + 10);
                    image.setImageResource(R.mipmap.black_circle);
                    circlelayout.addView(image, circleparams);
                } else {
                    circlelayout.setVisibility(View.GONE);
                }
            }
            MyViewPagerAdapter mpa = new MyViewPagerAdapter(views);
            // 宽度每一个格高度 42dp 转成px
            int height = (int) (MainActivity.this.getResources().getDisplayMetrics().density * 42 + 0.5f);
            RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, row * height);
            pager.setLayoutParams(params);
            pager.setAdapter(mpa);
            pager.setOnPageChangeListener(this);
        }

        // 收缩动画
        private void collapse(final View v) {
            final int initialHeight = v.getMeasuredHeight();
            Animation animation = new Animation() {
                @Override
                protected void applyTransformation(float interpolatedTime,
                                                   Transformation t) {
                    // interpolatedTime 0-1 进行变化 为1的时候表示动画已经完成
                    if (interpolatedTime == 1) {
                        v.setVisibility(View.GONE);
                    } else {
                        // 同样的原理 让控件的高度不断变化
                        v.getLayoutParams().height = initialHeight
                                - (int) (initialHeight * interpolatedTime);
                        v.requestLayout();
                    }
                }

                @Override
                public boolean willChangeBounds() {
                    return true;
                }
            };

            animation.setDuration(duration);
            v.startAnimation(animation);
        }

        // 展开动画
        private void expand(final View v, int location) {
            init(v, location);
            v.measure(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT);
            final int targetHeight = v.getMeasuredHeight();
            // 最开始显示下拉控件的时候 将高度设为0 达到不显示的效果
            v.getLayoutParams().height = 0;
            v.setVisibility(View.VISIBLE);

            Animation animation = new Animation() {
                @Override
                protected void applyTransformation(float interpolatedTime,
                                                   Transformation t) {
                    // 不断变化高度来显示控件
                    v.getLayoutParams().height = (interpolatedTime == 1) ? RelativeLayout.LayoutParams.WRAP_CONTENT
                            : (int) (targetHeight * interpolatedTime);
                    v.requestLayout();
                }

                @Override
                public boolean willChangeBounds() {
                    return true;
                }
            };
            animation.setDuration(duration);
            v.startAnimation(animation);
        }

        @Override
        public void onClick(View v) {
            String tempTag = (String) v.getTag();
            if (rel == null) {
                rel = (RelativeLayout) tableLayout.findViewWithTag(tag);
                expand(rel, position);
                view.isDraw(true);
            } else {
                if (rel.getVisibility() == View.VISIBLE) {
                    collapse(rel);
                    view.isDraw(false);
                } else {
                    if (tempTag.equals(clickPosition)) {
                        expand(rel, position);
                    }
                    view.isDraw(true);
                }

                if (!tempTag.equals(clickPosition)) {
                    rel = (RelativeLayout) tableLayout.findViewWithTag(tag);
                    expand(rel, position);
                    // 上一次的箭头去除
                    clicktxt.isDraw(false);
                    view.isDraw(true);
                }
            }
            clickPosition = tempTag;
            clicktxt = view;
        }
    }

    @Override
    public void onClick(int dataId, String str) {
        Intent intent = new Intent();
        intent.putExtra("id", dataId);
        intent.putExtra("value", str);
        setResult(RESULT_OK, intent);
        finish();
    }

}


================================================
FILE: app/src/main/java/com/haibuzou/myapplication/Utils.java
================================================
package com.haibuzou.myapplication;

import android.content.Context;

import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import com.haibuzou.myapplication.entity.ZhaoPin;

import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.util.List;

/**
 * Created by AAA on 2015/6/16.
 */
public class Utils {
    public static List<ZhaoPin> getJobType(Context context) {
        String result = readFileFromRaw(context, R.raw.zhaopin);
        if (result != null) {
            Gson gson = new Gson();
            return gson.fromJson(result, new TypeToken<List<ZhaoPin>>() {
            }.getType());
        }
        return null;
    }

    /**
     * 读取Raw文件夹下文本类型文件
     *
     * @param context    上下文
     * @param resourceId 资源id
     * @return 返回的读取完成的数据 string格式
     */
    public static String readFileFromRaw(Context context, int resourceId) {
        if (null == context || resourceId < 0) {
            return null;
        }

        String result = null;
        try {
            InputStream input = context.getResources().openRawResource(resourceId);
            ByteArrayOutputStream output = new ByteArrayOutputStream();
            byte[] buffer = new byte[1024];
            int length;
            while ((length = input.read(buffer)) != -1) {
                output.write(buffer, 0, length);
            }
            output.close();
            input.close();
            return output.toString();
        } catch (Exception e) {
            e.printStackTrace();
        }

        return result;
    }
}


================================================
FILE: app/src/main/java/com/haibuzou/myapplication/adapter/CommonAdapter.java
================================================
package com.haibuzou.myapplication.adapter;

import java.util.ArrayList;
import java.util.List;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;

public abstract class CommonAdapter<T> extends BaseAdapter {
    protected LayoutInflater mInflater;
    protected Context mContext;
    protected List<T> mDatas;
    protected final int mItemLayoutId;

    public CommonAdapter(Context context, int itemLayoutId) {
        this.mContext = context;
        this.mInflater = LayoutInflater.from(mContext);
        this.mDatas = new ArrayList<T>();
        this.mItemLayoutId = itemLayoutId;
    }

    public CommonAdapter(Context context, List<T> mDatas, int itemLayoutId) {
        this.mContext = context;
        this.mInflater = LayoutInflater.from(mContext);
        this.mDatas = mDatas;
        this.mItemLayoutId = itemLayoutId;
    }

    @Override
    public int getCount() {
        return mDatas != null ? mDatas.size() : 0;
    }

    @Override
    public T getItem(int position) {
        return mDatas.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        final ViewHolder viewHolder = getViewHolder(position, convertView,
                parent);
        convert(viewHolder, getItem(position));
        return viewHolder.getConvertView();

    }

    public abstract void convert(ViewHolder helper, T item);

    private ViewHolder getViewHolder(int position, View convertView,
                                     ViewGroup parent) {
        return ViewHolder.get(mContext, convertView, parent, mItemLayoutId,
                position);
    }

}


================================================
FILE: app/src/main/java/com/haibuzou/myapplication/adapter/ExpandGridAdapter.java
================================================
package com.haibuzou.myapplication.adapter;

import java.util.List;

import android.content.Context;
import android.view.View;
import android.view.View.OnClickListener;

import com.haibuzou.myapplication.R;
import com.haibuzou.myapplication.entity.BaseData;

/**
 * Created by AAA on 2015/6/16.
 */
public class ExpandGridAdapter extends CommonAdapter<BaseData> {
    private OnClick listener;

    public ExpandGridAdapter(Context context, List<BaseData> mDatas,
                             int itemLayoutId) {
        super(context, mDatas, itemLayoutId);
    }

    @Override
    public void convert(ViewHolder helper, final BaseData item) {
        helper.setText(R.id.expand_grid_txt, item.getName());
        View view = helper.getView(R.id.expand_grid_txt);
        view.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                if (listener != null) {
                    listener.onClick(item.getDataId(), item.getName());
                }

            }
        });
    }

    public interface OnClick {
        void onClick(int dataId, String str);
    }

    public void setOnClick(OnClick listener) {
        this.listener = listener;
    }
}


================================================
FILE: app/src/main/java/com/haibuzou/myapplication/adapter/MyViewPagerAdapter.java
================================================
package com.haibuzou.myapplication.adapter;

import android.support.v4.view.ViewPager;
import android.view.View;

import java.util.List;

public class MyViewPagerAdapter extends android.support.v4.view.PagerAdapter {

    private final List<View> mlistViews;


    public MyViewPagerAdapter(List<View> mlistViews) {
        this.mlistViews = mlistViews;
    }

    @Override
    public int getCount() {
        return mlistViews.size();
    }


    @Override
    public int getItemPosition(Object object) {
        return super.getItemPosition(object);
    }

    @Override
    public Object instantiateItem(View container, int position) {
        ((ViewPager) container).addView(mlistViews.get(position));
        return mlistViews.get(position);
    }

    @Override
    public void destroyItem(View arg0, int arg1, Object arg2) {
        ((ViewPager) arg0).removeView(mlistViews.get(arg1));
    }

    @Override
    public boolean isViewFromObject(View arg0, Object arg1) {
        return arg0 == arg1;
    }

}


================================================
FILE: app/src/main/java/com/haibuzou/myapplication/adapter/ViewHolder.java
================================================
package com.haibuzou.myapplication.adapter;

import java.lang.ref.SoftReference;
import java.lang.reflect.Constructor;

import android.content.Context;
import android.graphics.Bitmap;
import android.util.SparseArray;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;

public class ViewHolder {
    private final SparseArray<SoftReference<View>> mViews;
    private final SparseArray<SoftReference<View>> childViews;
    private int mPosition;
    private final View mConvertView;
    private final ViewGroup parent;

    private ViewHolder(Context context, ViewGroup parent, int layoutId,
                       int position) {
        this.mPosition = position;
        this.parent = parent;
        this.mViews = new SparseArray<SoftReference<View>>();
        this.childViews = new SparseArray<SoftReference<View>>();
        mConvertView = LayoutInflater.from(context).inflate(layoutId, parent,
                false);
        // setTag
        mConvertView.setTag(this);
    }

    private ViewHolder(Context context, ViewGroup parent, View view,
                       int position) {
        this.mPosition = position;
        this.parent = parent;
        this.mViews = new SparseArray<SoftReference<View>>();
        this.childViews = new SparseArray<SoftReference<View>>();
        mConvertView = view;
        // setTag
        mConvertView.setTag(this);
    }

    @SuppressWarnings("unchecked")
    public static <T extends View> T get(View view, int id) {
        SparseArray<View> viewHolder = (SparseArray<View>) view.getTag();
        if (viewHolder == null) {
            viewHolder = new SparseArray<View>();
            view.setTag(viewHolder);
        }
        View childView = viewHolder.get(id);
        if (childView == null) {
            childView = view.findViewById(id);
            viewHolder.put(id, childView);
        }
        return (T) childView;
    }

    /**
     * 拿到一个ViewHolder对象
     *
     * @param context
     * @param convertView item view
     * @param parent      父控件
     * @param layoutId    布局id
     * @param position    位置
     * @return
     */
    public static ViewHolder get(Context context, View convertView,
                                 ViewGroup parent, int layoutId, int position) {
        ViewHolder holder;
        if (convertView == null) {
            holder = new ViewHolder(context, parent, layoutId, position);
        } else {
            holder = (ViewHolder) convertView.getTag();
            holder.mPosition = position;
        }
        return holder;
    }

    /**
     * 拿到一个ViewHolder对象
     *
     * @param context
     * @param convertView
     * @param parent      母控件
     * @param position    点击位置
     * @return
     */
    public static ViewHolder get(Context context, View convertView,
                                 ViewGroup parent, Class<? extends View> view, int position) throws Exception {
        ViewHolder holder;
        if (convertView == null) {
            Constructor<?> constructor = view.getConstructor(Context.class);
            View contentView = (View) constructor.newInstance(context);
            holder = new ViewHolder(context, parent, contentView, position);
        } else {
            holder = (ViewHolder) convertView.getTag();
            holder.mPosition = position;
        }
        return holder;
    }

    public View getConvertView() {
        return mConvertView;
    }

    /**
     * 通过控件的Id获取对于的控件,如果没有则加入views
     *
     * @param viewId
     * @return
     */
    public <T extends View> T getView(int viewId) {
        View view = mViews.get(viewId) != null ? mViews.get(viewId).get() : null;
        if (view == null) {
            view = mConvertView.findViewById(viewId);
            mViews.put(viewId, new SoftReference<View>(view));
        }
        return (T) view;
    }

    /**
     * 为TextView设置字符串
     *
     * @param viewId
     * @param text
     * @return
     */
    public ViewHolder setText(int viewId, String text) {
        TextView view = getView(viewId);
        view.setText(text);
        return this;
    }

    /**
     * 为ImageView设置图片
     *
     * @param viewId
     * @param drawableId
     * @return
     */
    public ViewHolder setImageResource(int viewId, int drawableId) {
        ImageView view = getView(viewId);
        view.setImageResource(drawableId);

        return this;
    }

    /**
     * 为ImageView设置图片
     *
     * @param viewId
     * @param bm
     * @return
     */
    public ViewHolder setImageBitmap(int viewId, Bitmap bm) {
        ImageView view = getView(viewId);
        view.setImageBitmap(bm);
        return this;
    }

    /**
     * 临时创建view,但不显示
     *
     * @param viewId    view的 id
     * @param childView 子view
     */
    public void setChildView(int viewId, View childView) {
        if (getView(viewId) == null) {
            return;
        }
        childViews.put(viewId, new SoftReference<View>(childView));
    }

    /**
     * 获取子view
     *
     * @param viewId
     */
    public <T extends View> T getChildView(int viewId) {
        View view = childViews.get(viewId) != null ? childViews.get(viewId).get() : null;
        return (T) view;
    }

    public ViewGroup getParent() {
        return parent;
    }

    public int getPosition() {
        return mPosition;
    }

}


================================================
FILE: app/src/main/java/com/haibuzou/myapplication/entity/BaseData.java
================================================
package com.haibuzou.myapplication.entity;

/**
 * Created by AAA on 2015/6/16.
 */
public class BaseData {

    private int dataId;
    private String name;

    public BaseData() {

    }

    public BaseData(int id, String name) {
        this.dataId = id;
        this.name = name;
    }

    public int getDataId() {
        return dataId;
    }

    public void setDataId(int dataId) {
        this.dataId = dataId;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }


}


================================================
FILE: app/src/main/java/com/haibuzou/myapplication/entity/GongZhong.java
================================================
package com.haibuzou.myapplication.entity;

import java.util.List;

/**
 * Created by AAA on 2015/6/16.
 */
public class GongZhong extends BaseData {

    public GongZhong(int id, String name) {
        super(id, name);
    }

    private List<BaseData> jobtype;

    public List<BaseData> getJobtype() {
        return jobtype;
    }

    public void setJobtype(List<BaseData> jobtype) {
        this.jobtype = jobtype;
    }

}


================================================
FILE: app/src/main/java/com/haibuzou/myapplication/entity/ZhaoPin.java
================================================
package com.haibuzou.myapplication.entity;

import java.util.List;

/**
 * Created by Administrator on 2015/6/16.
 */
public class ZhaoPin extends BaseData {

    public ZhaoPin(int id, String name) {
        super(id, name);
    }

    private List<GongZhong> jobtype;

    public List<GongZhong> getJobtype() {
        return jobtype;
    }

    public void setJobtype(List<GongZhong> jobtype) {
        this.jobtype = jobtype;
    }

}


================================================
FILE: app/src/main/java/com/haibuzou/myapplication/view/CurrenPositionView.java
================================================
package com.haibuzou.myapplication.view;

import android.content.Context;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.LinearLayout;
import android.widget.TableLayout;
import android.widget.TableRow;
import android.widget.TextView;

import com.haibuzou.myapplication.MainActivity;
import com.haibuzou.myapplication.R;
import com.haibuzou.myapplication.entity.ZhaoPin;


public class CurrenPositionView extends LinearLayout {
    //每行item个数
    private static final int ROW_NUM = 3;
    private TextView titleView;
    private ZhaoPin data;
    private TableLayout tableLayout;
    private LayoutInflater layoutInflater;
    private int viewId;

    public CurrenPositionView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    public CurrenPositionView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public CurrenPositionView(Context context) {
        super(context);
    }

    public ZhaoPin getData() {
        return data;
    }

    public void setData(ZhaoPin data) {
        this.data = data;
    }

    private void initView() {
        layoutInflater = LayoutInflater.from(getContext());
        View rootView = layoutInflater.inflate(R.layout.pulldown_view, this);
        titleView = (TextView) rootView.findViewById(R.id.job_name_text);
        tableLayout = (TableLayout) rootView.findViewById(R.id.job_name_table);
        tableLayout.setStretchAllColumns(true);
        setTitleStr(data.getName());
        //初始化表格数据
        int h = data.getJobtype().size() / ROW_NUM;
        int len = data.getJobtype().size() % ROW_NUM;
        int location = 0;
        if (len != 0)
            h += 1;
        for (int n = 1; n <= h; n++) {
            TableRow row = new TableRow(getContext());
            int length = n == h ? len : ROW_NUM;
            for (int m = 0; m < length; m++) {
                MyTextView mview = (MyTextView) layoutInflater.inflate(R.layout.table_row_item, null);
                mview.setText(data.getJobtype().get(location).getName());
                mview.setTag("" + viewId + location);
                mview.setOnClickListener(((MainActivity) getContext()).new OnItemClick(data, location, n, tableLayout, mview));
                row.addView(mview);
                location++;
            }
            // 每一列 tablerow 增加一个 下拉的layout
            View view = layoutInflater.inflate(R.layout.expand_item, null);
            view.setTag(n);
            view.setVisibility(View.GONE);
            tableLayout.addView(row);
            tableLayout.addView(view);
        }
    }

    public void init() {
        initView();
    }

    public void setTitleStr(CharSequence text) {
        titleView.setText(text);
    }

    public int getViewId() {
        return viewId;
    }

    public void setViewId(int viewId) {
        this.viewId = viewId;
    }
}


================================================
FILE: app/src/main/java/com/haibuzou/myapplication/view/ItemTextView.java
================================================
package com.haibuzou.myapplication.view;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.widget.TextView;

/**
 * Created by Administrator on 2015/6/17.
 */
public class ItemTextView extends TextView {

    private final Paint paint;
    private int mwidth;
    private int mheight;

    public ItemTextView(Context context, AttributeSet attrs) {
        super(context, attrs);
        paint = new Paint();
        paint.setColor(Color.BLACK);
        paint.setStyle(Paint.Style.STROKE);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        canvas.drawLine(0, mheight - 1, mwidth - 1, mheight - 1, paint);
        canvas.drawLine(mwidth - 1, mheight - 1, mwidth - 1, 0, paint);
        super.onDraw(canvas);
    }

    @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
        super.onSizeChanged(w, h, oldw, oldh);
        mwidth = w;
        mheight = h;
    }
}


================================================
FILE: app/src/main/java/com/haibuzou/myapplication/view/MyTextView.java
================================================
package com.haibuzou.myapplication.view;

import android.content.Context;
import android.widget.TextView;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Paint.Align;
import android.graphics.Path;
import android.util.AttributeSet;
import android.util.TypedValue;

/**
 * Created by AAA on 2015/6/16.
 */
public class MyTextView extends TextView {


    private Paint txtpaint;
    private Paint linepaint;
    private Paint tripaint;
    private Path path;
    private Boolean isDraw;
    private float textSize;

    public MyTextView(Context context) {
        super(context);
    }

    public MyTextView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init(context, attrs);
    }

    public MyTextView(Context context, AttributeSet attrs) {
        super(context, attrs);
        init(context, attrs);
    }

    private void init(Context context, AttributeSet attrs) {

        txtpaint = new Paint();
        path = new Path();
        txtpaint.setColor(Color.BLACK);
        txtpaint.setTextSize(textSize);
        txtpaint.setTextAlign(Align.LEFT);

        linepaint = new Paint();
        linepaint.setColor(Color.LTGRAY);
        linepaint.setStyle(Paint.Style.STROKE);

        tripaint = new Paint();
        tripaint.setColor(Color.GRAY);

        isDraw = false;

    }

    @Override
    protected void onDraw(Canvas canvas) {
        canvas.drawRect(0, 0, getWidth(), getHeight(), linepaint);
        int len = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,
                7, getResources().getDisplayMetrics());
        if (isDraw) {
            path.moveTo(getWidth() / 2, getHeight() - len);
            path.lineTo(getWidth() / 2 - len, getHeight());
            path.lineTo(getWidth() / 2 + len, getHeight());
            canvas.drawPath(path, tripaint);
        }
        super.onDraw(canvas);
    }

    public void isDraw(boolean isDraw) {
        this.isDraw = isDraw;
        postInvalidate();
    }


}


================================================
FILE: app/src/main/res/drawable/main_click_selector.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_focused="true" android:drawable="@color/click" />
    <item android:state_pressed="true" android:drawable="@color/click" />
    <item android:drawable="@color/white" />
</selector> 


================================================
FILE: app/src/main/res/layout/activity_main.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#f0eff4"
    android:orientation="vertical">

    <ScrollView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:scrollbars="none">

        <LinearLayout
            android:id="@+id/zp_curr_potion_linear"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginLeft="16dp"
            android:layout_marginRight="16dp"
            android:layout_marginTop="16dp"
            android:orientation="vertical" />
    </ScrollView>
</LinearLayout>    


================================================
FILE: app/src/main/res/layout/expand_grid_item.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<com.haibuzou.myapplication.view.ItemTextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:id="@+id/expand_grid_txt"
    android:textSize="13sp"
    android:textColor="#ffffff"
    android:gravity="center"
    android:background="#606469"
    android:layout_height="42dp"></com.haibuzou.myapplication.view.ItemTextView>


================================================
FILE: app/src/main/res/layout/expand_item.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#ffffff"
    android:visibility="gone">

    <android.support.v4.view.ViewPager
        android:id="@+id/expand_item"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

    <LinearLayout
        android:id="@+id/circle_layout"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@id/expand_item"
        android:layout_centerHorizontal="true"
        android:orientation="horizontal"
        android:paddingBottom="6dp"
        android:paddingTop="6dp"
        android:visibility="gone"></LinearLayout>
</RelativeLayout>

================================================
FILE: app/src/main/res/layout/pulldown_view.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginBottom="10dp"
        android:layout_marginLeft="2dp"
        android:orientation="horizontal">

        <ImageView
            android:layout_width="8dp"
            android:layout_height="8dp"
            android:layout_marginTop="6dp"
            android:src="@mipmap/square" />

        <TextView
            android:id="@+id/job_name_text"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="5dp"
            android:textColor="#333333"
            android:textSize="16sp" />
    </LinearLayout>

    <TableLayout
        android:id="@+id/job_name_table"
        android:layout_width="match_parent"
        android:background="#f0eff4"
        android:layout_height="wrap_content"></TableLayout>
</LinearLayout>


================================================
FILE: app/src/main/res/layout/table_row_item.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<com.haibuzou.myapplication.view.MyTextView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:android_custom="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="50dp"
    android:background="@drawable/main_click_selector"
    android:paddingBottom="14dp"
    android:paddingLeft="14dp"
    android:paddingTop="14dp"
    android:textSize="16sp"></com.haibuzou.myapplication.view.MyTextView>

================================================
FILE: app/src/main/res/layout/viewpager.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<GridView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:id="@+id/expand_grid"
    android:numColumns="3"
    android:listSelector="@null"
    android:scrollbars="none"
    android:background="#606469"
    android:layout_height="match_parent"></GridView>


================================================
FILE: app/src/main/res/menu/menu_main.xml
================================================
<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    tools:context=".MainActivity">
    <item
        android:id="@+id/action_settings"
        android:title="@string/action_settings"
        android:orderInCategory="100"
        app:showAsAction="never" />
</menu>


================================================
FILE: app/src/main/res/raw/zhaopin.json
================================================
[
  {
    "dataId": "120000",
    "name": "技术/制造岗位",
    "jobtype": [
      {
        "dataId": "120100",
        "name": "技工/普工",
        "jobtype": [
          {
            "dataId": "120101",
            "name": "普工/操作工"
          },
          {
            "dataId": "120102",
            "name": "车床工"
          },
          {
            "dataId": "120103",
            "name": "铣刨"
          },
          {
            "dataId": "120104",
            "name": "钣铆冲铸"
          },
          {
            "dataId": "120105",
            "name": "钳工"
          },
          {
            "dataId": "120106",
            "name": "焊工"
          },
          {
            "dataId": "120107",
            "name": "磨床工"
          },
          {
            "dataId": "120108",
            "name": "火花机工"
          },
          {
            "dataId": "120109",
            "name": "裁剪车"
          },
          {
            "dataId": "120110",
            "name": "缝熨烫"
          },
          {
            "dataId": "120111",
            "name": "打磨/抛光"
          },
          {
            "dataId": "120112",
            "name": "空调/电梯工"
          },
          {
            "dataId": "120113",
            "name": "汽摩维修员"
          },
          {
            "dataId": "120114",
            "name": "水/木/油漆工"
          },
          {
            "dataId": "120115",
            "name": "电工"
          },
          {
            "dataId": "120116",
            "name": "锅炉工"
          },
          {
            "dataId": "120117",
            "name": "锁具修理工"
          },
          {
            "dataId": "120118",
            "name": "叉车工"
          },
          {
            "dataId": "120119",
            "name": "模具工"
          },
          {
            "dataId": "120120",
            "name": "手机维修"
          },
          {
            "dataId": "120121",
            "name": "包装工"
          },
          {
            "dataId": "120122",
            "name": "水泥工"
          },
          {
            "dataId": "120123",
            "name": "钢筋工"
          },
          {
            "dataId": "120124",
            "name": "管道工"
          },
          {
            "dataId": "120125",
            "name": "瓦工"
          },
          {
            "dataId": "120126",
            "name": "组装工"
          },
          {
            "dataId": "120127",
            "name": "样衣工"
          },
          {
            "dataId": "120128",
            "name": "染工"
          },
          {
            "dataId": "120129",
            "name": "纺织工"
          },
          {
            "dataId": "120130",
            "name": "印花工"
          },
          {
            "dataId": "120131",
            "name": "其他"
          }
        ]
      },
      {
        "dataId": "120200",
        "name": "生产/研发",
        "jobtype": [
          {
            "dataId": "120201",
            "name": "生产文员 "
          },
          {
            "dataId": "120202",
            "name": "组长/拉长 "
          },
          {
            "dataId": "120203",
            "name": "物控/物料员"
          },
          {
            "dataId": "120204",
            "name": "储备干部"
          },
          {
            "dataId": "120205",
            "name": "质量管理"
          },
          {
            "dataId": "120206",
            "name": "生产组长"
          },
          {
            "dataId": "120207",
            "name": "主任"
          },
          {
            "dataId": "120208",
            "name": "高级工程师"
          },
          {
            "dataId": "120209",
            "name": "设备管理"
          },
          {
            "dataId": "120210",
            "name": "工艺设计"
          },
          {
            "dataId": "120211",
            "name": "生产计划"
          },
          {
            "dataId": "120212",
            "name": "化验/检验"
          },
          {
            "dataId": "120213",
            "name": "厂长/副厂长"
          },
          {
            "dataId": "120214",
            "name": "生产总监"
          },
          {
            "dataId": "120215",
            "name": "维修工程师"
          },
          {
            "dataId": "120216",
            "name": "工业工程师"
          },
          {
            "dataId": "120217",
            "name": "材料工程师"
          },
          {
            "dataId": "120218",
            "name": "技术工程师"
          },
          {
            "dataId": "120219",
            "name": "其他"
          }
        ]
      },
      {
        "dataId": "120300",
        "name": "机械/仪表",
        "jobtype": [
          {
            "dataId": "120301",
            "name": "机械工程"
          },
          {
            "dataId": "120302",
            "name": "仪器仪表"
          },
          {
            "dataId": "120303",
            "name": "机电"
          },
          {
            "dataId": "120304",
            "name": "版图设计"
          },
          {
            "dataId": "120305",
            "name": "研发工程师"
          },
          {
            "dataId": "120306",
            "name": "机械测试"
          },
          {
            "dataId": "120307",
            "name": "其他"
          }
        ]
      },
      {
        "dataId": "120400",
        "name": "建筑/装修",
        "jobtype": [
          {
            "dataId": "120401",
            "name": "土木工程"
          },
          {
            "dataId": "120402",
            "name": "工程监理"
          },
          {
            "dataId": "120403",
            "name": "项目管理"
          },
          {
            "dataId": "120404",
            "name": "总工程师"
          },
          {
            "dataId": "120405",
            "name": "造价师"
          },
          {
            "dataId": "120406",
            "name": "幕墙工程师"
          },
          {
            "dataId": "120407",
            "name": "安防工程师"
          },
          {
            "dataId": "120408",
            "name": "安全管理"
          },
          {
            "dataId": "120409",
            "name": "道路桥梁"
          },
          {
            "dataId": "120410",
            "name": "给排水暖通"
          },
          {
            "dataId": "120411",
            "name": "测绘员"
          },
          {
            "dataId": "120412",
            "name": "园林设计"
          },
          {
            "dataId": "120413",
            "name": "资料员"
          },
          {
            "dataId": "120414",
            "name": "综合布线"
          },
          {
            "dataId": "120415",
            "name": "市政工程师"
          },
          {
            "dataId": "120416",
            "name": "其他"
          }
        ]
      },
      {
        "dataId": "120500",
        "name": "电子/电气",
        "jobtype": [
          {
            "dataId": "120501",
            "name": "电子电气"
          },
          {
            "dataId": "120502",
            "name": "自动化"
          },
          {
            "dataId": "120503",
            "name": "电路工程师"
          },
          {
            "dataId": "120504",
            "name": "无线电"
          },
          {
            "dataId": "120505",
            "name": "电气测试"
          },
          {
            "dataId": "120506",
            "name": "产品工艺"
          },
          {
            "dataId": "120507",
            "name": "音频/视频"
          },
          {
            "dataId": "120508",
            "name": "灯光照明"
          },
          {
            "dataId": "120509",
            "name": "研发工程师"
          },
          {
            "dataId": "120510",
            "name": "电子维修"
          },
          {
            "dataId": "120511",
            "name": "其他"
          }
        ]
      },
      {
        "dataId": "120600",
        "name": "质控/安防",
        "jobtype": [
          {
            "dataId": "120601",
            "name": "质量管理"
          },
          {
            "dataId": "120602",
            "name": "安全消防"
          },
          {
            "dataId": "120603",
            "name": "质检"
          },
          {
            "dataId": "120604",
            "name": "安防测试"
          },
          {
            "dataId": "120605",
            "name": "认证工程师"
          },
          {
            "dataId": "120606",
            "name": "安防管理"
          },
          {
            "dataId": "120607",
            "name": "其他"
          }
        ]
      },
      {
        "dataId": "120700",
        "name": "制药/生工",
        "jobtype": [
          {
            "dataId": "120701",
            "name": "临床研究"
          },
          {
            "dataId": "120702",
            "name": "医药研发"
          },
          {
            "dataId": "120703",
            "name": "生工"
          },
          {
            "dataId": "120704",
            "name": "医疗器械"
          },
          {
            "dataId": "120705",
            "name": "其他"
          }
        ]
      },
      {
        "dataId": "120800",
        "name": "服装/食品",
        "jobtype": [
          {
            "dataId": "120801",
            "name": "服装设计师"
          },
          {
            "dataId": "120802",
            "name": "打样制版"
          },
          {
            "dataId": "120803",
            "name": "样衣工"
          },
          {
            "dataId": "120804",
            "name": "生产管理"
          },
          {
            "dataId": "120805",
            "name": "食品研发"
          },
          {
            "dataId": "120806",
            "name": "样板出格师"
          },
          {
            "dataId": "120807",
            "name": "电脑放码员"
          },
          {
            "dataId": "120808",
            "name": "纸样师"
          },
          {
            "dataId": "120809",
            "name": "纺织品设计"
          },
          {
            "dataId": "120810",
            "name": "其他"
          }
        ]
      },
      {
        "dataId": "120900",
        "name": "农林牧渔",
        "jobtype": [
          {
            "dataId": "120901",
            "name": "养殖人员"
          },
          {
            "dataId": "120902",
            "name": "饲料业务"
          },
          {
            "dataId": "120903",
            "name": "农艺师"
          },
          {
            "dataId": "120904",
            "name": "畜牧师"
          },
          {
            "dataId": "120905",
            "name": "场长"
          },
          {
            "dataId": "120906",
            "name": "养殖部主管"
          },
          {
            "dataId": "120907",
            "name": "饲料研发"
          },
          {
            "dataId": "120908",
            "name": "其他"
          }
        ]
      },
      {
        "dataId": "121100",
        "name": "环境保护",
        "jobtype": [
          {
            "dataId": "121101",
            "name": "污水处理"
          },
          {
            "dataId": "121102",
            "name": "环保检测"
          },
          {
            "dataId": "121103",
            "name": "工程师"
          },
          {
            "dataId": "121104",
            "name": "环境管理"
          },
          {
            "dataId": "121105",
            "name": "环保技术"
          },
          {
            "dataId": "121106",
            "name": "EHS管理"
          },
          {
            "dataId": "121107",
            "name": "环保工程师"
          },
          {
            "dataId": "121108",
            "name": "水质检测员"
          },
          {
            "dataId": "121109",
            "name": "环境绿化"
          },
          {
            "dataId": "121110",
            "name": "其他"
          }
        ]
      },
      {
        "dataId": "121000",
        "name": "汽车",
        "jobtype": [
          {
            "dataId": "121001",
            "name": "汽车修理"
          },
          {
            "dataId": "121002",
            "name": "汽车美容"
          },
          {
            "dataId": "121003",
            "name": "洗车工"
          },
          {
            "dataId": "121004",
            "name": "轮胎工"
          },
          {
            "dataId": "121005",
            "name": "汽车设计"
          },
          {
            "dataId": "121006",
            "name": "装配工艺"
          },
          {
            "dataId": "121007",
            "name": "机械工程师"
          },
          {
            "dataId": "121008",
            "name": "电子工程师"
          },
          {
            "dataId": "121009",
            "name": "4S店管理"
          },
          {
            "dataId": "121010",
            "name": "汽车检验"
          },
          {
            "dataId": "121011",
            "name": "二手车评估"
          },
          {
            "dataId": "121012",
            "name": "总装工程师"
          },
          {
            "dataId": "121013",
            "name": "安全性能"
          },
          {
            "dataId": "121014",
            "name": "理赔专员"
          },
          {
            "dataId": "121015",
            "name": "停车管理员"
          },
          {
            "dataId": "121016",
            "name": "加油站工人"
          },
          {
            "dataId": "121017",
            "name": "其他"
          }
        ]
      }
    ]
  },
  {
    "dataId": "110000",
    "name": "生活服务岗位",
    "jobtype": [
      {
        "dataId": "110100",
        "name": "餐饮服务",
        "jobtype": [
          {
            "dataId": "110101",
            "name": "厨师"
          },
          {
            "dataId": "110102",
            "name": "面点师"
          },
          {
            "dataId": "110103",
            "name": "服务员"
          },
          {
            "dataId": "110104",
            "name": "传菜员"
          },
          {
            "dataId": "110105",
            "name": "配菜打荷"
          },
          {
            "dataId": "110106",
            "name": "洗碗工"
          },
          {
            "dataId": "110107",
            "name": "后厨"
          },
          {
            "dataId": "110108",
            "name": "茶艺师"
          },
          {
            "dataId": "110109",
            "name": "咖啡师"
          },
          {
            "dataId": "110110",
            "name": "迎宾"
          },
          {
            "dataId": "110111",
            "name": "大堂经理"
          },
          {
            "dataId": "110112",
            "name": "预订员"
          },
          {
            "dataId": "110113",
            "name": "送餐员"
          },
          {
            "dataId": "110114",
            "name": "餐饮管理"
          },
          {
            "dataId": "110115",
            "name": "学徒"
          },
          {
            "dataId": "110116",
            "name": "杂工"
          },
          {
            "dataId": "110117",
            "name": "其他"
          }
        ]
      },
      {
        "dataId": "110200",
        "name": "酒店/旅游",
        "jobtype": [
          {
            "dataId": "110201",
            "name": "酒店前台"
          },
          {
            "dataId": "110202",
            "name": "客房服务员"
          },
          {
            "dataId": "110203",
            "name": "楼面经理"
          },
          {
            "dataId": "110204",
            "name": "行李员"
          },
          {
            "dataId": "110205",
            "name": "救生员"
          },
          {
            "dataId": "110206",
            "name": "酒店管理"
          },
          {
            "dataId": "110207",
            "name": "订票员"
          },
          {
            "dataId": "110208",
            "name": "导游"
          },
          {
            "dataId": "110209",
            "name": "计调"
          },
          {
            "dataId": "110210",
            "name": "签证专员"
          },
          {
            "dataId": "110211",
            "name": "旅游顾问"
          },
          {
            "dataId": "110212",
            "name": "其他"
          }
        ]
      },
      {
        "dataId": "110300",
        "name": "超市/零售",
        "jobtype": [
          {
            "dataId": "110301",
            "name": "促销导购"
          },
          {
            "dataId": "110302",
            "name": "营业员"
          },
          {
            "dataId": "110303",
            "name": "收银员"
          },
          {
            "dataId": "110304",
            "name": "理货员"
          },
          {
            "dataId": "110305",
            "name": "防损员"
          },
          {
            "dataId": "110306",
            "name": "店长"
          },
          {
            "dataId": "110307",
            "name": "招商经理"
          },
          {
            "dataId": "110308",
            "name": "奢侈品业务"
          },
          {
            "dataId": "110309",
            "name": "品类管理"
          },
          {
            "dataId": "110310",
            "name": "食品加工"
          },
          {
            "dataId": "110311",
            "name": "督导"
          },
          {
            "dataId": "110312",
            "name": "其他"
          }
        ]
      },
      {
        "dataId": "110400",
        "name": "美容/美发",
        "jobtype": [
          {
            "dataId": "110401",
            "name": "发型师"
          },
          {
            "dataId": "110402",
            "name": "美容师"
          },
          {
            "dataId": "110403",
            "name": "化妆师"
          },
          {
            "dataId": "110404",
            "name": "美发助理"
          },
          {
            "dataId": "110405",
            "name": "洗头工"
          },
          {
            "dataId": "110406",
            "name": "美容助理"
          },
          {
            "dataId": "110407",
            "name": "美甲师"
          },
          {
            "dataId": "110408",
            "name": "美体师"
          },
          {
            "dataId": "110409",
            "name": "美容导师"
          },
          {
            "dataId": "110410",
            "name": "美容店长"
          },
          {
            "dataId": "110411",
            "name": "美容顾问"
          },
          {
            "dataId": "110412",
            "name": "彩妆培训师"
          },
          {
            "dataId": "110413",
            "name": "宠物美容"
          },
          {
            "dataId": "110414",
            "name": "其他"
          }
        ]
      },
      {
        "dataId": "110500",
        "name": "保健/按摩",
        "jobtype": [
          {
            "dataId": "110501",
            "name": "按摩师"
          },
          {
            "dataId": "110502",
            "name": "针灸推拿"
          },
          {
            "dataId": "110503",
            "name": "足疗师"
          },
          {
            "dataId": "110504",
            "name": "搓澡工"
          },
          {
            "dataId": "110505",
            "name": "其他"
          }
        ]
      },
      {
        "dataId": "110600",
        "name": "运动/健身",
        "jobtype": [
          {
            "dataId": "110601",
            "name": "健身教练"
          },
          {
            "dataId": "110602",
            "name": "瑜伽老师"
          },
          {
            "dataId": "110603",
            "name": "舞蹈师"
          },
          {
            "dataId": "110604",
            "name": "游泳教练"
          },
          {
            "dataId": "110605",
            "name": "台球教练"
          },
          {
            "dataId": "110606",
            "name": "高尔夫助理"
          },
          {
            "dataId": "110607",
            "name": "其他"
          }
        ]
      },
      {
        "dataId": "110700",
        "name": "淘宝招聘",
        "jobtype": [
          {
            "dataId": "110701",
            "name": "淘宝客服"
          },
          {
            "dataId": "110702",
            "name": "淘宝美工"
          },
          {
            "dataId": "110703",
            "name": "淘宝店长"
          },
          {
            "dataId": "110704",
            "name": "店铺编辑"
          },
          {
            "dataId": "110705",
            "name": "店铺推广"
          },
          {
            "dataId": "110706",
            "name": "活动策划"
          },
          {
            "dataId": "110707",
            "name": "其他"
          }
        ]
      },
      {
        "dataId": "110800",
        "name": "家政/安保",
        "jobtype": [
          {
            "dataId": "110801",
            "name": "保洁"
          },
          {
            "dataId": "110802",
            "name": "保姆"
          },
          {
            "dataId": "110803",
            "name": "保安"
          },
          {
            "dataId": "110804",
            "name": "月嫂"
          },
          {
            "dataId": "110805",
            "name": "育婴师"
          },
          {
            "dataId": "110806",
            "name": "洗衣工"
          },
          {
            "dataId": "110807",
            "name": "钟点工"
          },
          {
            "dataId": "110808",
            "name": "送水工"
          },
          {
            "dataId": "110809",
            "name": "护工"
          },
          {
            "dataId": "110810",
            "name": "其他"
          }
        ]
      },
      {
        "dataId": "110900",
        "name": "物业管理",
        "jobtype": [
          {
            "dataId": "110901",
            "name": "物业维修"
          },
          {
            "dataId": "110902",
            "name": "物业经理"
          },
          {
            "dataId": "110903",
            "name": "物业管理员"
          },
          {
            "dataId": "110904",
            "name": "合同管理"
          },
          {
            "dataId": "110905",
            "name": "招商经理"
          },
          {
            "dataId": "110906",
            "name": "其他"
          }
        ]
      },
      {
        "dataId": "111000",
        "name": "教育/培训",
        "jobtype": [
          {
            "dataId": "111001",
            "name": "教师/助教"
          },
          {
            "dataId": "111002",
            "name": "家教"
          },
          {
            "dataId": "111003",
            "name": "培训师"
          },
          {
            "dataId": "111004",
            "name": "幼教"
          },
          {
            "dataId": "111005",
            "name": "培训策划"
          },
          {
            "dataId": "111006",
            "name": "培训助理"
          },
          {
            "dataId": "111007",
            "name": "教务管理"
          },
          {
            "dataId": "111008",
            "name": "教具开发"
          },
          {
            "dataId": "111009",
            "name": "学术研究"
          },
          {
            "dataId": "111010",
            "name": "课程顾问"
          },
          {
            "dataId": "111011",
            "name": "校长"
          },
          {
            "dataId": "111012",
            "name": "拓展训练师"
          },
          {
            "dataId": "111013",
            "name": "其他"
          }
        ]
      },
      {
        "dataId": "111100",
        "name": "娱乐/影视",
        "jobtype": [
          {
            "dataId": "111101",
            "name": "礼仪"
          },
          {
            "dataId": "111102",
            "name": "调酒师"
          },
          {
            "dataId": "111103",
            "name": "摄影师"
          },
          {
            "dataId": "111104",
            "name": "酒吧服务员"
          },
          {
            "dataId": "111105",
            "name": "歌厅服务员"
          },
          {
            "dataId": "111106",
            "name": "主持人"
          },
          {
            "dataId": "111107",
            "name": "音效师"
          },
          {
            "dataId": "111108",
            "name": "后期制作"
          },
          {
            "dataId": "111109",
            "name": "配音员"
          },
          {
            "dataId": "111110",
            "name": "放映员"
          },
          {
            "dataId": "111111",
            "name": "灯光师"
          },
          {
            "dataId": "111112",
            "name": "其他"
          }
        ]
      },
      {
        "dataId": "111200",
        "name": "医疗/药剂",
        "jobtype": [
          {
            "dataId": "111201",
            "name": "医生"
          },
          {
            "dataId": "111202",
            "name": "护士"
          },
          {
            "dataId": "111203",
            "name": "药剂师"
          },
          {
            "dataId": "111204",
            "name": "保健医生"
          },
          {
            "dataId": "111205",
            "name": "心理医生"
          },
          {
            "dataId": "111206",
            "name": "导医"
          },
          {
            "dataId": "111207",
            "name": "护士长"
          },
          {
            "dataId": "111208",
            "name": "理疗师"
          },
          {
            "dataId": "111209",
            "name": "医药质检"
          },
          {
            "dataId": "111210",
            "name": "医疗管理"
          },
          {
            "dataId": "111211",
            "name": "美容整形师"
          },
          {
            "dataId": "111212",
            "name": "验光师"
          },
          {
            "dataId": "111213",
            "name": "营养师"
          },
          {
            "dataId": "111214",
            "name": "宠物医生"
          },
          {
            "dataId": "111215",
            "name": "其他"
          }
        ]
      }
    ]
  },
  {
    "dataId": "100000",
    "name": "商务服务岗位",
    "jobtype": [
      {
        "dataId": "100100",
        "name": "销售",
        "jobtype": [
          {
            "dataId": "100101",
            "name": "销售代表"
          },
          {
            "dataId": "100102",
            "name": "电话销售"
          },
          {
            "dataId": "100103",
            "name": "销售经理"
          },
          {
            "dataId": "100104",
            "name": "销售助理"
          },
          {
            "dataId": "100105",
            "name": "销售总监"
          },
          {
            "dataId": "100106",
            "name": "销售支持"
          },
          {
            "dataId": "100107",
            "name": "汽车销售"
          },
          {
            "dataId": "100108",
            "name": "医药代表"
          },
          {
            "dataId": "100109",
            "name": "器械销售"
          },
          {
            "dataId": "100110",
            "name": "网络销售"
          },
          {
            "dataId": "100111",
            "name": "团购销售"
          },
          {
            "dataId": "100112",
            "name": "区域销售"
          },
          {
            "dataId": "100113",
            "name": "渠道专员"
          },
          {
            "dataId": "100114",
            "name": "渠道经理"
          },
          {
            "dataId": "100115",
            "name": "客户经理"
          },
          {
            "dataId": "100116",
            "name": "大客户经理"
          },
          {
            "dataId": "100117",
            "name": "会籍顾问"
          },
          {
            "dataId": "100118",
            "name": "其他"
          }
        ]
      },
      {
        "dataId": "100200",
        "name": "客服",
        "jobtype": [
          {
            "dataId": "100201",
            "name": "客服专员"
          },
          {
            "dataId": "100202",
            "name": "电话客服"
          },
          {
            "dataId": "100203",
            "name": "客服经理"
          },
          {
            "dataId": "100204",
            "name": "客服总监"
          },
          {
            "dataId": "100205",
            "name": "售后服务"
          },
          {
            "dataId": "100206",
            "name": "客户关系"
          },
          {
            "dataId": "100207",
            "name": "其他"
          }
        ]
      },
      {
        "dataId": "100300",
        "name": "人事/行政",
        "jobtype": [
          {
            "dataId": "100301",
            "name": "文员"
          },
          {
            "dataId": "100302",
            "name": "前台"
          },
          {
            "dataId": "100303",
            "name": "秘书"
          },
          {
            "dataId": "100304",
            "name": "人事专员"
          },
          {
            "dataId": "100305",
            "name": "人事经理"
          },
          {
            "dataId": "100306",
            "name": "人事总监"
          },
          {
            "dataId": "100307",
            "name": "行政助理"
          },
          {
            "dataId": "100308",
            "name": "行政主管"
          },
          {
            "dataId": "100309",
            "name": "行政总监"
          },
          {
            "dataId": "100310",
            "name": "薪酬绩效"
          },
          {
            "dataId": "100311",
            "name": "招聘专员"
          },
          {
            "dataId": "100312",
            "name": "招聘经理"
          },
          {
            "dataId": "100313",
            "name": "猎头顾问"
          },
          {
            "dataId": "100314",
            "name": "培训专员"
          },
          {
            "dataId": "100315",
            "name": "培训经理"
          },
          {
            "dataId": "100316",
            "name": "后期管理"
          },
          {
            "dataId": "100317",
            "name": "其他"
          }
        ]
      },
      {
        "dataId": "100400",
        "name": "司机",
        "jobtype": [
          {
            "dataId": "100401",
            "name": "商务司机"
          },
          {
            "dataId": "100402",
            "name": "货运司机"
          },
          {
            "dataId": "100403",
            "name": "客运司机"
          },
          {
            "dataId": "100404",
            "name": "出租车司机"
          },
          {
            "dataId": "100405",
            "name": "班车司机"
          },
          {
            "dataId": "100406",
            "name": "特种车司机"
          },
          {
            "dataId": "100407",
            "name": "驾校教练"
          },
          {
            "dataId": "100408",
            "name": "其他"
          }
        ]
      },
      {
        "dataId": "100500",
        "name": "物流/仓储",
        "jobtype": [
          {
            "dataId": "100501",
            "name": "快递员"
          },
          {
            "dataId": "100502",
            "name": "仓库管理员"
          },
          {
            "dataId": "100503",
            "name": "搬运工"
          },
          {
            "dataId": "100504",
            "name": "物流专员"
          },
          {
            "dataId": "100505",
            "name": "物流经理"
          },
          {
            "dataId": "100506",
            "name": "物流总监"
          },
          {
            "dataId": "100507",
            "name": "调度员"
          },
          {
            "dataId": "100508",
            "name": "仓库经理"
          },
          {
            "dataId": "100509",
            "name": "供应链管理"
          },
          {
            "dataId": "100510",
            "name": "单证员"
          },
          {
            "dataId": "100511",
            "name": "国际货运"
          },
          {
            "dataId": "100512",
            "name": "其他"
          }
        ]
      },
      {
        "dataId": "100600",
        "name": "贸易/采购",
        "jobtype": [
          {
            "dataId": "100601",
            "name": "外贸专员"
          },
          {
            "dataId": "100602",
            "name": "外贸经理"
          },
          {
            "dataId": "100603",
            "name": "采购员"
          },
          {
            "dataId": "100604",
            "name": "采购助理"
          },
          {
            "dataId": "100605",
            "name": "采购经理"
          },
          {
            "dataId": "100606",
            "name": "报关员"
          },
          {
            "dataId": "100607",
            "name": "商务专员"
          },
          {
            "dataId": "100608",
            "name": "买手"
          },
          {
            "dataId": "100609",
            "name": "其他"
          }
        ]
      },
      {
        "dataId": "100700",
        "name": "翻译",
        "jobtype": [
          {
            "dataId": "100701",
            "name": "英语"
          },
          {
            "dataId": "100702",
            "name": "日语"
          },
          {
            "dataId": "100703",
            "name": "俄语"
          },
          {
            "dataId": "100704",
            "name": "韩语"
          },
          {
            "dataId": "100705",
            "name": "法语"
          },
          {
            "dataId": "100706",
            "name": "德语"
          },
          {
            "dataId": "100707",
            "name": "西班牙语"
          },
          {
            "dataId": "100708",
            "name": "意大利语"
          },
          {
            "dataId": "100709",
            "name": "葡萄牙语"
          },
          {
            "dataId": "100710",
            "name": "阿拉伯语"
          },
          {
            "dataId": "100711",
            "name": "小语种"
          },
          {
            "dataId": "100712",
            "name": "其他"
          }
        ]
      },
      {
        "dataId": "100800",
        "name": "律师/法务",
        "jobtype": [
          {
            "dataId": "100801",
            "name": "律师助理"
          },
          {
            "dataId": "100802",
            "name": "法务专员"
          },
          {
            "dataId": "100803",
            "name": "律师"
          },
          {
            "dataId": "100804",
            "name": "专利顾问"
          },
          {
            "dataId": "100805",
            "name": "合规管理"
          },
          {
            "dataId": "100806",
            "name": "其他"
          }
        ]
      },
      {
        "dataId": "100900",
        "name": "财务/审计",
        "jobtype": [
          {
            "dataId": "100901",
            "name": "财务经理"
          },
          {
            "dataId": "100902",
            "name": "会计"
          },
          {
            "dataId": "100903",
            "name": "出纳"
          },
          {
            "dataId": "100904",
            "name": "会计助理"
          },
          {
            "dataId": "100905",
            "name": "财务总监"
          },
          {
            "dataId": "100906",
            "name": "审计专员"
          },
          {
            "dataId": "100907",
            "name": "审计经理"
          },
          {
            "dataId": "100908",
            "name": "统计员"
          },
          {
            "dataId": "100909",
            "name": "税务专员"
          },
          {
            "dataId": "100910",
            "name": "税务经理"
          },
          {
            "dataId": "100911",
            "name": "财务分析员"
          },
          {
            "dataId": "100912",
            "name": "成本管理员"
          },
          {
            "dataId": "100913",
            "name": "其他"
          }
        ]
      },
      {
        "dataId": "101000",
        "name": "广告/咨询",
        "jobtype": [
          {
            "dataId": "101001",
            "name": "咨询顾问"
          },
          {
            "dataId": "101002",
            "name": "广告制作"
          },
          {
            "dataId": "101003",
            "name": "广告文案"
          },
          {
            "dataId": "101004",
            "name": "广告创意"
          },
          {
            "dataId": "101005",
            "name": "创意总监"
          },
          {
            "dataId": "101006",
            "name": "会展策划"
          },
          {
            "dataId": "101007",
            "name": "客户主管"
          },
          {
            "dataId": "101008",
            "name": "企业策划"
          },
          {
            "dataId": "101009",
            "name": "媒介策划"
          },
          {
            "dataId": "101010",
            "name": "婚礼策划"
          },
          {
            "dataId": "101011",
            "name": "咨询经理"
          },
          {
            "dataId": "101012",
            "name": "其他"
          }
        ]
      },
      {
        "dataId": "101100",
        "name": "美术/设计",
        "jobtype": [
          {
            "dataId": "101101",
            "name": "服装设计"
          },
          {
            "dataId": "101102",
            "name": "平面设计"
          },
          {
            "dataId": "101103",
            "name": "美编"
          },
          {
            "dataId": "101104",
            "name": "家居设计"
          },
          {
            "dataId": "101105",
            "name": "美术指导"
          },
          {
            "dataId": "101106",
            "name": "店面设计"
          },
          {
            "dataId": "101107",
            "name": "珠宝设计"
          },
          {
            "dataId": "101108",
            "name": "动画设计"
          },
          {
            "dataId": "101109",
            "name": "包装设计"
          },
          {
            "dataId": "101110",
            "name": "室内设计"
          },
          {
            "dataId": "101111",
            "name": "CAD制图"
          },
          {
            "dataId": "101112",
            "name": "其他"
          }
        ]
      },
      {
        "dataId": "101200",
        "name": "编辑/出版",
        "jobtype": [
          {
            "dataId": "101201",
            "name": "编辑"
          },
          {
            "dataId": "101202",
            "name": "记者"
          },
          {
            "dataId": "101203",
            "name": "总编辑"
          },
          {
            "dataId": "101204",
            "name": "出版发行"
          },
          {
            "dataId": "101205",
            "name": "排版设计"
          },
          {
            "dataId": "101206",
            "name": "印刷操作"
          },
          {
            "dataId": "101207",
            "name": "装订烫金"
          },
          {
            "dataId": "101208",
            "name": "其他"
          }
        ]
      },
      {
        "dataId": "101300",
        "name": "网络/IT",
        "jobtype": [
          {
            "dataId": "101301",
            "name": "网页设计"
          },
          {
            "dataId": "101302",
            "name": "网站编辑"
          },
          {
            "dataId": "101303",
            "name": "程序员"
          },
          {
            "dataId": "101304",
            "name": "技术专员"
          },
          {
            "dataId": "101305",
            "name": "软件工程师"
          },
          {
            "dataId": "101306",
            "name": "技术支持"
          },
          {
            "dataId": "101307",
            "name": "技术经理"
          },
          {
            "dataId": "101308",
            "name": "硬件工程师"
          },
          {
            "dataId": "101309",
            "name": "质量工程师"
          },
          {
            "dataId": "101310",
            "name": "测试工程师"
          },
          {
            "dataId": "101311",
            "name": "系统架构师"
          },
          {
            "dataId": "101312",
            "name": "项目经理"
          },
          {
            "dataId": "101313",
            "name": "产品经理"
          },
          {
            "dataId": "101314",
            "name": "网站运营"
          },
          {
            "dataId": "101315",
            "name": "网站策划"
          },
          {
            "dataId": "101316",
            "name": "网络管理员"
          },
          {
            "dataId": "101317",
            "name": "信息安全"
          },
          {
            "dataId": "101318",
            "name": "通信工程师"
          },
          {
            "dataId": "101319",
            "name": "实施工程师"
          },
          {
            "dataId": "101320",
            "name": "DBA"
          },
          {
            "dataId": "101321",
            "name": "游戏设计"
          },
          {
            "dataId": "101322",
            "name": "视频设计"
          },
          {
            "dataId": "101323",
            "name": "其他"
          }
        ]
      },
      {
        "dataId": "101400",
        "name": "金融/证券",
        "jobtype": [
          {
            "dataId": "101401",
            "name": "理财顾问"
          },
          {
            "dataId": "101402",
            "name": "证券分析"
          },
          {
            "dataId": "101403",
            "name": "柜员"
          },
          {
            "dataId": "101404",
            "name": "证券经纪人"
          },
          {
            "dataId": "101405",
            "name": "证券经理"
          },
          {
            "dataId": "101406",
            "name": "信用卡业务"
          },
          {
            "dataId": "101407",
            "name": "银行经理"
          },
          {
            "dataId": "101408",
            "name": "信贷管理"
          },
          {
            "dataId": "101409",
            "name": "资产评估"
          },
          {
            "dataId": "101410",
            "name": "担保典当"
          },
          {
            "dataId": "101411",
            "name": "拍卖师"
          },
          {
            "dataId": "101412",
            "name": "外汇经纪人"
          },
          {
            "dataId": "101413",
            "name": "融资专员"
          },
          {
            "dataId": "101414",
            "name": "融资经理"
          },
          {
            "dataId": "101415",
            "name": "风险管理"
          },
          {
            "dataId": "101416",
            "name": "操盘手"
          },
          {
            "dataId": "101417",
            "name": "其他"
          }
        ]
      },
      {
        "dataId": "101500",
        "name": "市场/公关",
        "jobtype": [
          {
            "dataId": "101501",
            "name": "市场专员"
          },
          {
            "dataId": "101502",
            "name": "市场经理"
          },
          {
            "dataId": "101503",
            "name": "公关员"
          },
          {
            "dataId": "101504",
            "name": "市场拓展"
          },
          {
            "dataId": "101505",
            "name": "市场调研"
          },
          {
            "dataId": "101506",
            "name": "市场策划"
          },
          {
            "dataId": "101507",
            "name": "媒介专员"
          },
          {
            "dataId": "101508",
            "name": "媒介经理"
          },
          {
            "dataId": "101509",
            "name": "会展专员"
          },
          {
            "dataId": "101510",
            "name": "品牌经理"
          },
          {
            "dataId": "101511",
            "name": "公关经理"
          },
          {
            "dataId": "101512",
            "name": "企划经理"
          },
          {
            "dataId": "101513",
            "name": "其他"
          }
        ]
      },
      {
        "dataId": "101600",
        "name": "保险/理赔",
        "jobtype": [
          {
            "dataId": "101601",
            "name": "保险顾问"
          },
          {
            "dataId": "101602",
            "name": "储备经理"
          },
          {
            "dataId": "101603",
            "name": "经纪人"
          },
          {
            "dataId": "101604",
            "name": "保险内勤"
          },
          {
            "dataId": "101605",
            "name": "项目经理"
          },
          {
            "dataId": "101606",
            "name": "核保理赔"
          },
          {
            "dataId": "101607",
            "name": "保险精算师"
          },
          {
            "dataId": "101608",
            "name": "产品开发"
          },
          {
            "dataId": "101609",
            "name": "续期管理"
          },
          {
            "dataId": "101610",
            "name": "保险培训师"
          },
          {
            "dataId": "101611",
            "name": "契约管理"
          },
          {
            "dataId": "101612",
            "name": "其他"
          }
        ]
      },
      {
        "dataId": "101700",
        "name": "房地产",
        "jobtype": [
          {
            "dataId": "101701",
            "name": "房产经纪人"
          },
          {
            "dataId": "101702",
            "name": "置业顾问"
          },
          {
            "dataId": "101703",
            "name": "置业店长"
          },
          {
            "dataId": "101704",
            "name": "房产店员"
          },
          {
            "dataId": "101705",
            "name": "房产客服"
          },
          {
            "dataId": "101706",
            "name": "房产内勤"
          },
          {
            "dataId": "101707",
            "name": "房地产策划"
          },
          {
            "dataId": "101708",
            "name": "房产评估师"
          },
          {
            "dataId": "101709",
            "name": "其他房产职位"
          },
          {
            "dataId": "101710",
            "name": "其他"
          }
        ]
      },
      {
        "dataId": "101800",
        "name": "高级管理",
        "jobtype": [
          {
            "dataId": "101801",
            "name": "总监"
          },
          {
            "dataId": "101802",
            "name": "总裁助理"
          },
          {
            "dataId": "101803",
            "name": "副总裁"
          },
          {
            "dataId": "101804",
            "name": "分公司经理"
          },
          {
            "dataId": "101805",
            "name": "首席执行官"
          },
          {
            "dataId": "101806",
            "name": "首席运营官"
          },
          {
            "dataId": "101807",
            "name": "首席财务官"
          },
          {
            "dataId": "101808",
            "name": "首席技术官"
          },
          {
            "dataId": "101809",
            "name": "合伙人"
          },
          {
            "dataId": "101810",
            "name": "其他"
          }
        ]
      }
    ]
  }
]

================================================
FILE: app/src/main/res/values/colors.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="click">#f1f1f1</color>
    <color name="white">#ffffff</color>
</resources>

================================================
FILE: app/src/main/res/values/dimens.xml
================================================
<resources>
    <!-- Default screen margins, per the Android Design guidelines. -->
    <dimen name="activity_horizontal_margin">16dp</dimen>
    <dimen name="activity_vertical_margin">16dp</dimen>
</resources>


================================================
FILE: app/src/main/res/values/strings.xml
================================================
<resources>
    <string name="app_name">ExpandTable</string>

    <string name="hello_world">Hello world!</string>
    <string name="action_settings">Settings</string>
</resources>


================================================
FILE: app/src/main/res/values/styles.xml
================================================
<resources>

    <!-- Base application theme. -->
    <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
        <!-- Customize your theme here. -->
    </style>

</resources>


================================================
FILE: app/src/main/res/values-w820dp/dimens.xml
================================================
<resources>
    <!-- Example customization of dimensions originally defined in res/values/dimens.xml
         (such as screen margins) for screens with more than 820dp of available width. This
         would include 7" and 10" devices in landscape (~960dp and ~1280dp respectively). -->
    <dimen name="activity_horizontal_margin">64dp</dimen>
</resources>


================================================
FILE: build.gradle
================================================
// Top-level build file where you can add configuration options common to all sub-projects/modules.

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:2.1.0'

        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

allprojects {
    repositories {
        jcenter()
    }
}


================================================
FILE: gradle/wrapper/gradle-wrapper.properties
================================================
#Mon May 23 08:59:39 CST 2016
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-2.10-all.zip


================================================
FILE: gradle.properties
================================================
# Project-wide Gradle settings.

# IDE (e.g. Android Studio) users:
# Gradle settings configured through the IDE *will override*
# any settings specified in this file.

# For more details on how to configure your build environment visit
# http://www.gradle.org/docs/current/userguide/build_environment.html

# Specifies the JVM arguments used for the daemon process.
# The setting is particularly useful for tweaking memory settings.
# Default value: -Xmx10248m -XX:MaxPermSize=256m
# org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8

# When configured, Gradle will run in incubating parallel mode.
# This option should only be used with decoupled projects. More details, visit
# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
# org.gradle.parallel=true

================================================
FILE: gradlew
================================================
#!/usr/bin/env bash

##############################################################################
##
##  Gradle start up script for UN*X
##
##############################################################################

# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
DEFAULT_JVM_OPTS=""

APP_NAME="Gradle"
APP_BASE_NAME=`basename "$0"`

# Use the maximum available, or set MAX_FD != -1 to use that value.
MAX_FD="maximum"

warn ( ) {
    echo "$*"
}

die ( ) {
    echo
    echo "$*"
    echo
    exit 1
}

# OS specific support (must be 'true' or 'false').
cygwin=false
msys=false
darwin=false
case "`uname`" in
  CYGWIN* )
    cygwin=true
    ;;
  Darwin* )
    darwin=true
    ;;
  MINGW* )
    msys=true
    ;;
esac

# For Cygwin, ensure paths are in UNIX format before anything is touched.
if $cygwin ; then
    [ -n "$JAVA_HOME" ] && JAVA_HOME=`cygpath --unix "$JAVA_HOME"`
fi

# Attempt to set APP_HOME
# Resolve links: $0 may be a link
PRG="$0"
# Need this for relative symlinks.
while [ -h "$PRG" ] ; do
    ls=`ls -ld "$PRG"`
    link=`expr "$ls" : '.*-> \(.*\)$'`
    if expr "$link" : '/.*' > /dev/null; then
        PRG="$link"
    else
        PRG=`dirname "$PRG"`"/$link"
    fi
done
SAVED="`pwd`"
cd "`dirname \"$PRG\"`/" >&-
APP_HOME="`pwd -P`"
cd "$SAVED" >&-

CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar

# Determine the Java command to use to start the JVM.
if [ -n "$JAVA_HOME" ] ; then
    if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
        # IBM's JDK on AIX uses strange locations for the executables
        JAVACMD="$JAVA_HOME/jre/sh/java"
    else
        JAVACMD="$JAVA_HOME/bin/java"
    fi
    if [ ! -x "$JAVACMD" ] ; then
        die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME

Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
    fi
else
    JAVACMD="java"
    which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.

Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi

# Increase the maximum file descriptors if we can.
if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then
    MAX_FD_LIMIT=`ulimit -H -n`
    if [ $? -eq 0 ] ; then
        if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
            MAX_FD="$MAX_FD_LIMIT"
        fi
        ulimit -n $MAX_FD
        if [ $? -ne 0 ] ; then
            warn "Could not set maximum file descriptor limit: $MAX_FD"
        fi
    else
        warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
    fi
fi

# For Darwin, add options to specify how the application appears in the dock
if $darwin; then
    GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
fi

# For Cygwin, switch paths to Windows format before running java
if $cygwin ; then
    APP_HOME=`cygpath --path --mixed "$APP_HOME"`
    CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`

    # We build the pattern for arguments to be converted via cygpath
    ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
    SEP=""
    for dir in $ROOTDIRSRAW ; do
        ROOTDIRS="$ROOTDIRS$SEP$dir"
        SEP="|"
    done
    OURCYGPATTERN="(^($ROOTDIRS))"
    # Add a user-defined pattern to the cygpath arguments
    if [ "$GRADLE_CYGPATTERN" != "" ] ; then
        OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
    fi
    # Now convert the arguments - kludge to limit ourselves to /bin/sh
    i=0
    for arg in "$@" ; do
        CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
        CHECK2=`echo "$arg"|egrep -c "^-"`                                 ### Determine if an option

        if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then                    ### Added a condition
            eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
        else
            eval `echo args$i`="\"$arg\""
        fi
        i=$((i+1))
    done
    case $i in
        (0) set -- ;;
        (1) set -- "$args0" ;;
        (2) set -- "$args0" "$args1" ;;
        (3) set -- "$args0" "$args1" "$args2" ;;
        (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
        (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
        (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
        (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
        (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
        (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
    esac
fi

# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules
function splitJvmOpts() {
    JVM_OPTS=("$@")
}
eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS
JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME"

exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@"


================================================
FILE: gradlew.bat
================================================
@if "%DEBUG%" == "" @echo off
@rem ##########################################################################
@rem
@rem  Gradle startup script for Windows
@rem
@rem ##########################################################################

@rem Set local scope for the variables with windows NT shell
if "%OS%"=="Windows_NT" setlocal

@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
set DEFAULT_JVM_OPTS=

set DIRNAME=%~dp0
if "%DIRNAME%" == "" set DIRNAME=.
set APP_BASE_NAME=%~n0
set APP_HOME=%DIRNAME%

@rem Find java.exe
if defined JAVA_HOME goto findJavaFromJavaHome

set JAVA_EXE=java.exe
%JAVA_EXE% -version >NUL 2>&1
if "%ERRORLEVEL%" == "0" goto init

echo.
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.

goto fail

:findJavaFromJavaHome
set JAVA_HOME=%JAVA_HOME:"=%
set JAVA_EXE=%JAVA_HOME%/bin/java.exe

if exist "%JAVA_EXE%" goto init

echo.
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.

goto fail

:init
@rem Get command-line arguments, handling Windowz variants

if not "%OS%" == "Windows_NT" goto win9xME_args
if "%@eval[2+2]" == "4" goto 4NT_args

:win9xME_args
@rem Slurp the command line arguments.
set CMD_LINE_ARGS=
set _SKIP=2

:win9xME_args_slurp
if "x%~1" == "x" goto execute

set CMD_LINE_ARGS=%*
goto execute

:4NT_args
@rem Get arguments from the 4NT Shell from JP Software
set CMD_LINE_ARGS=%$

:execute
@rem Setup the command line

set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar

@rem Execute Gradle
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%

:end
@rem End local scope for the variables with windows NT shell
if "%ERRORLEVEL%"=="0" goto mainEnd

:fail
rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
rem the _cmd.exe /c_ return code!
if  not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
exit /b 1

:mainEnd
if "%OS%"=="Windows_NT" endlocal

:omega


================================================
FILE: settings.gradle
================================================
include 'app'
Download .txt
gitextract_edkb4w1x/

├── .gitignore
├── README.md
├── app/
│   ├── .gitignore
│   ├── build.gradle
│   ├── libs/
│   │   └── gson-2.2.1.jar
│   ├── proguard-rules.pro
│   └── src/
│       └── main/
│           ├── AndroidManifest.xml
│           ├── java/
│           │   └── com/
│           │       └── haibuzou/
│           │           └── myapplication/
│           │               ├── MainActivity.java
│           │               ├── Utils.java
│           │               ├── adapter/
│           │               │   ├── CommonAdapter.java
│           │               │   ├── ExpandGridAdapter.java
│           │               │   ├── MyViewPagerAdapter.java
│           │               │   └── ViewHolder.java
│           │               ├── entity/
│           │               │   ├── BaseData.java
│           │               │   ├── GongZhong.java
│           │               │   └── ZhaoPin.java
│           │               └── view/
│           │                   ├── CurrenPositionView.java
│           │                   ├── ItemTextView.java
│           │                   └── MyTextView.java
│           └── res/
│               ├── drawable/
│               │   └── main_click_selector.xml
│               ├── layout/
│               │   ├── activity_main.xml
│               │   ├── expand_grid_item.xml
│               │   ├── expand_item.xml
│               │   ├── pulldown_view.xml
│               │   ├── table_row_item.xml
│               │   └── viewpager.xml
│               ├── menu/
│               │   └── menu_main.xml
│               ├── raw/
│               │   └── zhaopin.json
│               ├── values/
│               │   ├── colors.xml
│               │   ├── dimens.xml
│               │   ├── strings.xml
│               │   └── styles.xml
│               └── values-w820dp/
│                   └── dimens.xml
├── build.gradle
├── gradle/
│   └── wrapper/
│       ├── gradle-wrapper.jar
│       └── gradle-wrapper.properties
├── gradle.properties
├── gradlew
├── gradlew.bat
└── settings.gradle
Download .txt
SYMBOL INDEX (91 symbols across 12 files)

FILE: app/src/main/java/com/haibuzou/myapplication/MainActivity.java
  class MainActivity (line 32) | public class MainActivity extends Activity implements ExpandGridAdapter....
    method onCreate (line 50) | @Override
    method initView (line 58) | private void initView() {
    method initData (line 80) | private void initData() {
    class OnItemClick (line 89) | public class OnItemClick implements OnClickListener, OnPageChangeListe...
      method OnItemClick (line 96) | public OnItemClick(ZhaoPin zhaoPin, int position, int tag, TableLayo...
      method onPageScrollStateChanged (line 104) | @Override
      method onPageScrolled (line 109) | @Override
      method onPageSelected (line 128) | @Override
      method init (line 133) | private void init(View v, int location) {
      method collapse (line 198) | private void collapse(final View v) {
      method expand (line 226) | private void expand(final View v, int location) {
      method onClick (line 253) | @Override
    method onClick (line 284) | @Override

FILE: app/src/main/java/com/haibuzou/myapplication/Utils.java
  class Utils (line 16) | public class Utils {
    method getJobType (line 17) | public static List<ZhaoPin> getJobType(Context context) {
    method readFileFromRaw (line 34) | public static String readFileFromRaw(Context context, int resourceId) {

FILE: app/src/main/java/com/haibuzou/myapplication/adapter/CommonAdapter.java
  class CommonAdapter (line 12) | public abstract class CommonAdapter<T> extends BaseAdapter {
    method CommonAdapter (line 18) | public CommonAdapter(Context context, int itemLayoutId) {
    method CommonAdapter (line 25) | public CommonAdapter(Context context, List<T> mDatas, int itemLayoutId) {
    method getCount (line 32) | @Override
    method getItem (line 37) | @Override
    method getItemId (line 42) | @Override
    method getView (line 47) | @Override
    method convert (line 56) | public abstract void convert(ViewHolder helper, T item);
    method getViewHolder (line 58) | private ViewHolder getViewHolder(int position, View convertView,

FILE: app/src/main/java/com/haibuzou/myapplication/adapter/ExpandGridAdapter.java
  class ExpandGridAdapter (line 15) | public class ExpandGridAdapter extends CommonAdapter<BaseData> {
    method ExpandGridAdapter (line 18) | public ExpandGridAdapter(Context context, List<BaseData> mDatas,
    method convert (line 23) | @Override
    type OnClick (line 38) | public interface OnClick {
      method onClick (line 39) | void onClick(int dataId, String str);
    method setOnClick (line 42) | public void setOnClick(OnClick listener) {

FILE: app/src/main/java/com/haibuzou/myapplication/adapter/MyViewPagerAdapter.java
  class MyViewPagerAdapter (line 8) | public class MyViewPagerAdapter extends android.support.v4.view.PagerAda...
    method MyViewPagerAdapter (line 13) | public MyViewPagerAdapter(List<View> mlistViews) {
    method getCount (line 17) | @Override
    method getItemPosition (line 23) | @Override
    method instantiateItem (line 28) | @Override
    method destroyItem (line 34) | @Override
    method isViewFromObject (line 39) | @Override

FILE: app/src/main/java/com/haibuzou/myapplication/adapter/ViewHolder.java
  class ViewHolder (line 15) | public class ViewHolder {
    method ViewHolder (line 22) | private ViewHolder(Context context, ViewGroup parent, int layoutId,
    method ViewHolder (line 34) | private ViewHolder(Context context, ViewGroup parent, View view,
    method get (line 45) | @SuppressWarnings("unchecked")
    method get (line 70) | public static ViewHolder get(Context context, View convertView,
    method get (line 91) | public static ViewHolder get(Context context, View convertView,
    method getConvertView (line 105) | public View getConvertView() {
    method getView (line 115) | public <T extends View> T getView(int viewId) {
    method setText (line 131) | public ViewHolder setText(int viewId, String text) {
    method setImageResource (line 144) | public ViewHolder setImageResource(int viewId, int drawableId) {
    method setImageBitmap (line 158) | public ViewHolder setImageBitmap(int viewId, Bitmap bm) {
    method setChildView (line 170) | public void setChildView(int viewId, View childView) {
    method getChildView (line 182) | public <T extends View> T getChildView(int viewId) {
    method getParent (line 187) | public ViewGroup getParent() {
    method getPosition (line 191) | public int getPosition() {

FILE: app/src/main/java/com/haibuzou/myapplication/entity/BaseData.java
  class BaseData (line 6) | public class BaseData {
    method BaseData (line 11) | public BaseData() {
    method BaseData (line 15) | public BaseData(int id, String name) {
    method getDataId (line 20) | public int getDataId() {
    method setDataId (line 24) | public void setDataId(int dataId) {
    method getName (line 28) | public String getName() {
    method setName (line 32) | public void setName(String name) {

FILE: app/src/main/java/com/haibuzou/myapplication/entity/GongZhong.java
  class GongZhong (line 8) | public class GongZhong extends BaseData {
    method GongZhong (line 10) | public GongZhong(int id, String name) {
    method getJobtype (line 16) | public List<BaseData> getJobtype() {
    method setJobtype (line 20) | public void setJobtype(List<BaseData> jobtype) {

FILE: app/src/main/java/com/haibuzou/myapplication/entity/ZhaoPin.java
  class ZhaoPin (line 8) | public class ZhaoPin extends BaseData {
    method ZhaoPin (line 10) | public ZhaoPin(int id, String name) {
    method getJobtype (line 16) | public List<GongZhong> getJobtype() {
    method setJobtype (line 20) | public void setJobtype(List<GongZhong> jobtype) {

FILE: app/src/main/java/com/haibuzou/myapplication/view/CurrenPositionView.java
  class CurrenPositionView (line 17) | public class CurrenPositionView extends LinearLayout {
    method CurrenPositionView (line 26) | public CurrenPositionView(Context context, AttributeSet attrs, int def...
    method CurrenPositionView (line 30) | public CurrenPositionView(Context context, AttributeSet attrs) {
    method CurrenPositionView (line 34) | public CurrenPositionView(Context context) {
    method getData (line 38) | public ZhaoPin getData() {
    method setData (line 42) | public void setData(ZhaoPin data) {
    method initView (line 46) | private void initView() {
    method init (line 79) | public void init() {
    method setTitleStr (line 83) | public void setTitleStr(CharSequence text) {
    method getViewId (line 87) | public int getViewId() {
    method setViewId (line 91) | public void setViewId(int viewId) {

FILE: app/src/main/java/com/haibuzou/myapplication/view/ItemTextView.java
  class ItemTextView (line 13) | public class ItemTextView extends TextView {
    method ItemTextView (line 19) | public ItemTextView(Context context, AttributeSet attrs) {
    method onDraw (line 26) | @Override
    method onSizeChanged (line 33) | @Override

FILE: app/src/main/java/com/haibuzou/myapplication/view/MyTextView.java
  class MyTextView (line 16) | public class MyTextView extends TextView {
    method MyTextView (line 26) | public MyTextView(Context context) {
    method MyTextView (line 30) | public MyTextView(Context context, AttributeSet attrs, int defStyleAtt...
    method MyTextView (line 35) | public MyTextView(Context context, AttributeSet attrs) {
    method init (line 40) | private void init(Context context, AttributeSet attrs) {
    method onDraw (line 59) | @Override
    method isDraw (line 73) | public void isDraw(boolean isDraw) {
Condensed preview — 40 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (108K chars).
[
  {
    "path": ".gitignore",
    "chars": 410,
    "preview": "#built application files\n*.apk\n*.ap_\n\n# files for the dex VM\n*.dex\n\n# Java class files\n*.class\n\n# generated files\nbin/\ng"
  },
  {
    "path": "README.md",
    "chars": 136,
    "preview": "# ExpandTable\n完全高仿58同城 点击展开的表格效果\n使用tablelayout 来实现\n\n### 效果图:\n![](https://github.com/haibuzou/ExpandTable/raw/master/art/"
  },
  {
    "path": "app/.gitignore",
    "chars": 7,
    "preview": "/build\n"
  },
  {
    "path": "app/build.gradle",
    "chars": 633,
    "preview": "apply plugin: 'com.android.application'\n\nandroid {\n    compileSdkVersion 22\n    buildToolsVersion \"23.0.1\"\n\n    defaultC"
  },
  {
    "path": "app/proguard-rules.pro",
    "chars": 672,
    "preview": "# Add project specific ProGuard rules here.\n# By default, the flags in this file are appended to flags specified\n# in D:"
  },
  {
    "path": "app/src/main/AndroidManifest.xml",
    "chars": 689,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    package="
  },
  {
    "path": "app/src/main/java/com/haibuzou/myapplication/MainActivity.java",
    "chars": 11327,
    "preview": "package com.haibuzou.myapplication;\n\nimport android.app.Activity;\nimport android.content.Intent;\nimport android.os.Bundl"
  },
  {
    "path": "app/src/main/java/com/haibuzou/myapplication/Utils.java",
    "chars": 1564,
    "preview": "package com.haibuzou.myapplication;\n\nimport android.content.Context;\n\nimport com.google.gson.Gson;\nimport com.google.gso"
  },
  {
    "path": "app/src/main/java/com/haibuzou/myapplication/adapter/CommonAdapter.java",
    "chars": 1824,
    "preview": "package com.haibuzou.myapplication.adapter;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\nimport android.content."
  },
  {
    "path": "app/src/main/java/com/haibuzou/myapplication/adapter/ExpandGridAdapter.java",
    "chars": 1223,
    "preview": "package com.haibuzou.myapplication.adapter;\n\nimport java.util.List;\n\nimport android.content.Context;\nimport android.view"
  },
  {
    "path": "app/src/main/java/com/haibuzou/myapplication/adapter/MyViewPagerAdapter.java",
    "chars": 1015,
    "preview": "package com.haibuzou.myapplication.adapter;\n\nimport android.support.v4.view.ViewPager;\nimport android.view.View;\n\nimport"
  },
  {
    "path": "app/src/main/java/com/haibuzou/myapplication/adapter/ViewHolder.java",
    "chars": 5411,
    "preview": "package com.haibuzou.myapplication.adapter;\n\nimport java.lang.ref.SoftReference;\nimport java.lang.reflect.Constructor;\n\n"
  },
  {
    "path": "app/src/main/java/com/haibuzou/myapplication/entity/BaseData.java",
    "chars": 562,
    "preview": "package com.haibuzou.myapplication.entity;\n\n/**\n * Created by AAA on 2015/6/16.\n */\npublic class BaseData {\n\n    private"
  },
  {
    "path": "app/src/main/java/com/haibuzou/myapplication/entity/GongZhong.java",
    "chars": 430,
    "preview": "package com.haibuzou.myapplication.entity;\n\nimport java.util.List;\n\n/**\n * Created by AAA on 2015/6/16.\n */\npublic class"
  },
  {
    "path": "app/src/main/java/com/haibuzou/myapplication/entity/ZhaoPin.java",
    "chars": 439,
    "preview": "package com.haibuzou.myapplication.entity;\n\nimport java.util.List;\n\n/**\n * Created by Administrator on 2015/6/16.\n */\npu"
  },
  {
    "path": "app/src/main/java/com/haibuzou/myapplication/view/CurrenPositionView.java",
    "chars": 2956,
    "preview": "package com.haibuzou.myapplication.view;\n\nimport android.content.Context;\nimport android.util.AttributeSet;\nimport andro"
  },
  {
    "path": "app/src/main/java/com/haibuzou/myapplication/view/ItemTextView.java",
    "chars": 1041,
    "preview": "package com.haibuzou.myapplication.view;\n\nimport android.content.Context;\nimport android.graphics.Canvas;\nimport android"
  },
  {
    "path": "app/src/main/java/com/haibuzou/myapplication/view/MyTextView.java",
    "chars": 2079,
    "preview": "package com.haibuzou.myapplication.view;\n\nimport android.content.Context;\nimport android.widget.TextView;\nimport android"
  },
  {
    "path": "app/src/main/res/drawable/main_click_selector.xml",
    "chars": 315,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<selector xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <item a"
  },
  {
    "path": "app/src/main/res/layout/activity_main.xml",
    "chars": 794,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    andr"
  },
  {
    "path": "app/src/main/res/layout/expand_grid_item.xml",
    "chars": 425,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<com.haibuzou.myapplication.view.ItemTextView xmlns:android=\"http://schemas.andro"
  },
  {
    "path": "app/src/main/res/layout/expand_item.xml",
    "chars": 848,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    an"
  },
  {
    "path": "app/src/main/res/layout/pulldown_view.xml",
    "chars": 1167,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    andr"
  },
  {
    "path": "app/src/main/res/layout/table_row_item.xml",
    "chars": 504,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<com.haibuzou.myapplication.view.MyTextView xmlns:android=\"http://schemas.android"
  },
  {
    "path": "app/src/main/res/layout/viewpager.xml",
    "chars": 358,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<GridView xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:"
  },
  {
    "path": "app/src/main/res/menu/menu_main.xml",
    "chars": 389,
    "preview": "<menu xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\""
  },
  {
    "path": "app/src/main/res/raw/zhaopin.json",
    "chars": 45291,
    "preview": "[\n  {\n    \"dataId\": \"120000\",\n    \"name\": \"技术/制造岗位\",\n    \"jobtype\": [\n      {\n        \"dataId\": \"120100\",\n        \"name\""
  },
  {
    "path": "app/src/main/res/values/colors.xml",
    "chars": 143,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <color name=\"click\">#f1f1f1</color>\n    <color name=\"white\">#ffff"
  },
  {
    "path": "app/src/main/res/values/dimens.xml",
    "chars": 211,
    "preview": "<resources>\n    <!-- Default screen margins, per the Android Design guidelines. -->\n    <dimen name=\"activity_horizontal"
  },
  {
    "path": "app/src/main/res/values/strings.xml",
    "chars": 181,
    "preview": "<resources>\n    <string name=\"app_name\">ExpandTable</string>\n\n    <string name=\"hello_world\">Hello world!</string>\n    <"
  },
  {
    "path": "app/src/main/res/values/styles.xml",
    "chars": 194,
    "preview": "<resources>\n\n    <!-- Base application theme. -->\n    <style name=\"AppTheme\" parent=\"Theme.AppCompat.Light.DarkActionBar"
  },
  {
    "path": "app/src/main/res/values-w820dp/dimens.xml",
    "chars": 358,
    "preview": "<resources>\n    <!-- Example customization of dimensions originally defined in res/values/dimens.xml\n         (such as s"
  },
  {
    "path": "build.gradle",
    "chars": 436,
    "preview": "// Top-level build file where you can add configuration options common to all sub-projects/modules.\n\nbuildscript {\n    r"
  },
  {
    "path": "gradle/wrapper/gradle-wrapper.properties",
    "chars": 231,
    "preview": "#Mon May 23 08:59:39 CST 2016\ndistributionBase=GRADLE_USER_HOME\ndistributionPath=wrapper/dists\nzipStoreBase=GRADLE_USER_"
  },
  {
    "path": "gradle.properties",
    "chars": 855,
    "preview": "# Project-wide Gradle settings.\n\n# IDE (e.g. Android Studio) users:\n# Gradle settings configured through the IDE *will o"
  },
  {
    "path": "gradlew",
    "chars": 5080,
    "preview": "#!/usr/bin/env bash\n\n##############################################################################\n##\n##  Gradle start "
  },
  {
    "path": "gradlew.bat",
    "chars": 2314,
    "preview": "@if \"%DEBUG%\" == \"\" @echo off\n@rem ##########################################################################\n@rem\n@rem "
  },
  {
    "path": "settings.gradle",
    "chars": 13,
    "preview": "include 'app'"
  }
]

// ... and 2 more files (download for full content)

About this extraction

This page contains the full source code of the haibuzou/ExpandTable GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 40 files (90.4 KB), approximately 24.7k tokens, and a symbol index with 91 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!