package com.metis.meishuquan.activity; import android.content.Context; import android.content.Intent; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.os.Bundle; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.text.TextUtils; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.TextView; import com.google.gson.Gson; import com.google.gson.reflect.TypeToken; import com.metis.base.ActivityDispatcher; import com.metis.base.activity.TitleBarActivity; import com.metis.base.manager.DisplayManager; import com.metis.base.manager.RequestCallback; import com.metis.base.module.Footer; import com.metis.base.utils.Log; import com.metis.base.widget.adapter.DelegateAdapter; import com.metis.base.widget.adapter.delegate.BaseDelegate; import com.metis.base.widget.adapter.delegate.DelegateType; import com.metis.base.widget.adapter.delegate.FooterDelegate; import com.metis.base.widget.adapter.holder.AbsViewHolder; import com.metis.base.widget.adapter.holder.FooterHolder; import com.metis.base.widget.callback.OnScrollBottomListener; import com.metis.meishuquan.R; import com.metis.meishuquan.adapter.DiscoveryDelegateType; import com.metis.meishuquan.manager.DiscoveryManager; import com.metis.meishuquan.module.Area; import com.metis.meishuquan.module.College; import com.metis.msnetworklib.contract.ReturnInfo; import java.util.ArrayList; import java.util.List; public class ExamJoinActivity extends TitleBarActivity { private static final String TAG = ExamJoinActivity.class.getSimpleName(); private RecyclerView mAreaRv, mCollegeRv; private AreaAdapter mAreaAdapter; private CollegeAdapter mCollegeAdapter; private List<Area> mAreaList = new ArrayList<Area>(); private View mSearchView = null; private String mRequest = null; private int mIndex = 0; private boolean noMore = false; private boolean isLoading = false; private Footer mFooter = new Footer(); private FooterDelegate mFooterDelegate = null; private List<Area> mAreasFromServer = null; Area mAll = new Area(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_exam_join); mAreaRv = (RecyclerView)findViewById(R.id.exam_join_area); mCollegeRv = (RecyclerView)findViewById(R.id.exam_join_college); mAreaRv.addItemDecoration(new AreaDecoration()); mCollegeRv.addItemDecoration(new CollegeDecoration()); mAreaRv.setLayoutManager(new LinearLayoutManager(this)); mCollegeRv.setLayoutManager(new LinearLayoutManager(this)); mAll.id = 0; mAll.name = getString(R.string.filter_all); mAreaList.add(mAll); mAreaAdapter = new AreaAdapter(mAreaList); mCollegeAdapter = new CollegeAdapter(this); mAreaRv.setAdapter(mAreaAdapter); mCollegeRv.setAdapter(mCollegeAdapter); mCollegeRv.addOnScrollListener(new OnScrollBottomListener() { @Override public void onScrollBottom(RecyclerView recyclerView, int newState) { if (!isLoading && !noMore) { Area area = mAreaAdapter.getCurrentArea(); if (area != null) { loadCollege(area.id); } } } }); mSearchView = LayoutInflater.from(this).inflate(R.layout.layout_exam_join_search, null); getTitleBar().setCenterView(mSearchView); mSearchView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { startActivity(new Intent(ExamJoinActivity.this, ExamJoinSearchActivity.class)); } }); } @Override protected void onPostCreate(Bundle savedInstanceState) { super.onPostCreate(savedInstanceState); mFooterDelegate = new FooterDelegate(mFooter); showProgressDialog(R.string.text_please_wait, true); DiscoveryManager.getInstance(this).getAreaList(0, new RequestCallback<List<Area>>() { @Override public void callback(ReturnInfo<List<Area>> returnInfo, String callbackId) { dismissProgressDialog(); if (returnInfo != null && returnInfo.isSuccess()) { if (mAreasFromServer != null && mAreaAdapter.getCurrentArea() == null) { mAreaList.removeAll(mAreasFromServer); } mAreasFromServer = returnInfo.getData(); mAreaList.addAll(mAreasFromServer); mAreaAdapter.notifyDataSetChanged(); if (mAreaList.size() > 0) { mAreaAdapter.setCurrent(0); loadCollege(mAreaList.get(0).id); mAreaAdapter.notifyDataSetChanged(); } } } }); } @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); Log.v(TAG, "onSaveInstanceState"); if (mAreasFromServer != null) { String current = new Gson().toJson(mAreasFromServer); Log.v(TAG, "onSaveInstanceState current=" + current); outState.putString("areas", current); } } @Override protected void onRestoreInstanceState(Bundle savedInstanceState) { super.onRestoreInstanceState(savedInstanceState); String current = savedInstanceState.getString("areas"); Log.v(TAG, "onRestoreInstanceState current=" + current); if (!TextUtils.isEmpty(current)) { mAreasFromServer = new Gson().fromJson(current, new TypeToken<List<List<Area>>>(){}.getType()); if (mAreaList.size() == 1 && mAreaList.contains(mAll)) { mAreaList.addAll(mAreasFromServer); mAreaAdapter.notifyDataSetChanged(); } } } @Override public boolean showAsUpEnable() { return true; } private void loadCollege (final long collegeId) { isLoading = true; mFooter.setState(Footer.STATE_WAITTING); if (!mCollegeAdapter.endWith(mFooterDelegate)) { mCollegeAdapter.addDataItem(mFooterDelegate); } mCollegeAdapter.notifyDataSetChanged(); mRequest = DiscoveryManager.getInstance(ExamJoinActivity.this).getCollegeList(collegeId, mIndex, "", new RequestCallback<List<College>>() { @Override public void callback(ReturnInfo<List<College>> returnInfo, String callbackId) { isLoading = false; if (!callbackId.equals(mRequest)) { return; } if (returnInfo != null && returnInfo.isSuccess()) { mIndex++; List<BaseDelegate> delegates = new ArrayList<BaseDelegate>(); List<College> colleges = returnInfo.getData(); final int length = colleges.size(); if (length == 0) { noMore = true; mFooter.setState(Footer.STATE_NO_MORE); if (!mCollegeAdapter.endWith(mFooterDelegate)) { mCollegeAdapter.addDataItem(mFooterDelegate); } } else { for (int i = 0; i < length; i++) { delegates.add(new CollegeDelegate(colleges.get(i))); } mFooter.setState(Footer.STATE_SUCCESS); if (mCollegeAdapter.endWith(mFooterDelegate)) { mCollegeAdapter.addDataList(mCollegeAdapter.getItemCount() - 1, delegates); } else { mCollegeAdapter.addDataList(delegates); mCollegeAdapter.addDataItem(mFooterDelegate); } } } else { mFooter.setState(Footer.STATE_FAILED); if (mCollegeAdapter.endWith(mFooterDelegate)) { } else { mCollegeAdapter.addDataItem(mFooterDelegate); } } mCollegeAdapter.notifyDataSetChanged(); } }); } private class AreaHolder extends RecyclerView.ViewHolder { public TextView nameTv = null; public AreaHolder(View itemView) { super(itemView); nameTv = (TextView)itemView.findViewById(R.id.area_name); } } private class AreaAdapter extends RecyclerView.Adapter<AreaHolder> { private List<Area> mAreaList = null; private int mCurrent = -1; public AreaAdapter (List<Area> collegeList) { mAreaList = collegeList; } @Override public AreaHolder onCreateViewHolder(ViewGroup parent, int viewType) { return new AreaHolder(LayoutInflater.from(ExamJoinActivity.this).inflate(R.layout.layout_exam_area_item, null)); } @Override public void onBindViewHolder(final AreaHolder holder, final int position) { final Area college = mAreaList.get(position); holder.nameTv.setText(college.name); holder.itemView.setSelected(mCurrent == position); holder.itemView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (mCurrent == position) { return; } mCurrent = position; mAreaAdapter.notifyDataSetChanged(); mCollegeAdapter.clearDataList(); mCollegeAdapter.notifyDataSetChanged(); mIndex = 0; noMore = false; loadCollege(college.id); } }); } @Override public int getItemCount() { return mAreaList.size(); } public Area getCurrentArea () { if (mAreaList == null || mCurrent < 0 || mCurrent >= mAreaList.size()) { return null; } return mAreaList.get(mCurrent); } public void setCurrent (int current) { mCurrent = current; } } public static class CollegeDelegate extends BaseDelegate<College> { public CollegeDelegate(College college) { super(college); } @Override public int getDelegateType() { return DiscoveryDelegateType.TYPE_DISCOVERY_COLLEGE.getType(); } } public static class CollegeHolder extends AbsViewHolder<CollegeDelegate> { public ImageView profileIv; public TextView focusTv, nameTv, extrasTv; public CollegeHolder(View itemView) { super(itemView); profileIv = (ImageView)itemView.findViewById(R.id.college_profile); focusTv = (TextView)itemView.findViewById(R.id.college_focus); nameTv = (TextView)itemView.findViewById(R.id.college_name); extrasTv = (TextView)itemView.findViewById(R.id.college_extras); } @Override public void bindData(final Context context, CollegeDelegate coolegeDelegate, RecyclerView.Adapter adapter, int position) { final College college = coolegeDelegate.getSource(); DisplayManager.getInstance(context).display( college.avatar, profileIv, DisplayManager.getInstance(context).makeRoundDisplayImageOptions( context.getResources().getDimensionPixelSize(R.dimen.profile_size_middle) )); nameTv.setText(college.name); itemView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { ActivityDispatcher.innerBrowserActivity(context, "http://www.meishuquan.net/mobile/institutions/index.aspx?id=" + college.id, true); } }); } } public static class CollegeAdapter extends DelegateAdapter { public CollegeAdapter(Context context) { super(context); } @Override public AbsViewHolder onCreateAbsViewHolder(ViewGroup parent, int viewType, View view) { switch (viewType) { case DiscoveryDelegateType.ID.ID_DISCOVERY_COLLEGE: return new CollegeHolder(view); case DelegateType.ID.ID_FOOTER: return new FooterHolder(view); } return null; } } private class AreaDecoration extends RecyclerView.ItemDecoration { private Paint mPaint = null; public AreaDecoration () { mPaint = new Paint(); mPaint.setStyle(Paint.Style.STROKE); mPaint.setColor(Color.WHITE); mPaint.setAntiAlias(true); } @Override public void onDrawOver(Canvas c, RecyclerView parent, RecyclerView.State state) { super.onDrawOver(c, parent, state); final int count = parent.getChildCount(); for (int i = 0; i < count - 1; i++) { View child = parent.getChildAt(i); c.drawLine(child.getLeft(), child.getBottom(), child.getRight(), child.getBottom(), mPaint); } } } public class CollegeDecoration extends RecyclerView.ItemDecoration { private Paint mPaint = null; public CollegeDecoration () { mPaint = new Paint(); mPaint.setStyle(Paint.Style.STROKE); mPaint.setColor(Color.DKGRAY); mPaint.setAntiAlias(true); } @Override public void onDrawOver(Canvas c, RecyclerView parent, RecyclerView.State state) { super.onDrawOver(c, parent, state); final int count = parent.getChildCount(); for (int i = 1; i < count - 1; i++) { View child = parent.getChildAt(i); c.drawLine(child.getLeft(), child.getTop(), child.getRight(), child.getTop(), mPaint); /*final int position = parent.getChildAdapterPosition(child); RecyclerView.Adapter adapter = parent.getAdapter(); if (adapter instanceof CollegeAdapter) { if (((CollegeAdapter) adapter).getDataItem(position) instanceof CollegeDelegate) { c.drawLine(child.getLeft(), child.getBottom(), child.getRight(), child.getBottom(), mPaint); } }*/ } } } }