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