package net.coding.program.project; import android.app.Activity; import android.content.Intent; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentActivity; import android.support.v4.widget.SwipeRefreshLayout; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.Button; import android.widget.ImageView; import android.widget.RelativeLayout; import android.widget.TextView; import com.loopj.android.http.RequestParams; import com.readystatesoftware.viewbadger.BadgeView; import net.coding.program.R; import net.coding.program.common.BlankViewDisplay; import net.coding.program.common.Global; import net.coding.program.common.ImageLoadTool; import net.coding.program.common.UnreadNotify; import net.coding.program.common.network.RefreshBaseFragment; import net.coding.program.event.EventRefresh; import net.coding.program.model.ProjectObject; import net.coding.program.project.detail.ProjectActivity; import net.coding.program.project.init.InitProUtils; import net.coding.program.project.init.create.ProjectCreateActivity_; import org.androidannotations.annotations.AfterViews; import org.androidannotations.annotations.EFragment; import org.androidannotations.annotations.FragmentArg; import org.androidannotations.annotations.ItemClick; import org.androidannotations.annotations.ViewById; import org.json.JSONException; import org.json.JSONObject; import java.util.ArrayList; import de.greenrobot.event.EventBus; import se.emilsjolander.stickylistheaders.ExpandableStickyListHeadersListView; import se.emilsjolander.stickylistheaders.StickyListHeadersAdapter; @EFragment(R.layout.project_list_fragment) public class ProjectListFragment extends RefreshBaseFragment implements View.OnClickListener, ProjectActionUtil.OnSettingListener { private static final String URL_PIN_DELETE = Global.HOST_API + "/user/projects/pin?ids=%d"; private static final String URL_PIN_SET = Global.HOST_API + "/user/projects/pin"; private static final String TAG = ProjectListFragment.class.getSimpleName(); @FragmentArg ArrayList<ProjectObject> mData = new ArrayList<>(); ArrayList<ProjectObject> mDataBackup = new ArrayList<>(); @FragmentArg ProjectFragment.Type type = ProjectFragment.Type.Main; boolean mRequestOk; @ViewById ExpandableStickyListHeadersListView listView; private ProjectActionUtil projectActionUtil; private String title = ""; private int pos = 0; @ViewById View blankLayout; @ViewById Button btn_action; @ViewById SwipeRefreshLayout swipeRefreshLayout; @ViewById RelativeLayout project_create_layout; @ViewById TextView tv_msg_tip; MyAdapter myAdapter = null; int msectionId = 0; private View.OnClickListener mOnClickRetry = new View.OnClickListener() { @Override public void onClick(View v) { onRefresh(); } }; public void setData(ArrayList<ProjectObject> data, boolean requestOk) { mData = data; mDataBackup = data; mRequestOk = requestOk; } public void setPos(int pos) { this.pos = pos; } public void setDataAndUpdate(ArrayList<ProjectObject> data) { mRequestOk = true; mData = data; mDataBackup = data; myAdapter.notifyDataSetChanged(); // 不让空白画面出现 BlankViewDisplay.setBlank(1, this, true, blankLayout, mOnClickRetry); } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } @AfterViews protected final void init() { projectActionUtil = new ProjectActionUtil(getActivity().getBaseContext()); projectActionUtil.setListener(this); initRefreshLayout(); btn_action.setOnClickListener(this); msectionId = 0; for (ProjectObject item : mData) { if (!item.isPin()) { break; } ++msectionId; } View listViewFooter = getActivity().getLayoutInflater().inflate(R.layout.divide_15_top, null); listView.addFooterView(listViewFooter, null, false); if (myAdapter == null) { myAdapter = new MyAdapter(); } listView.setAdapter(myAdapter); if (getParentFragment() == null) { // 搜索 disableRefreshing(); } } private void notifyEmputy() { if (mData.size() == 0) { tv_msg_tip.setText(getTitle()); project_create_layout.setVisibility(View.VISIBLE); btn_action.setText("+ 去创建"); } else { project_create_layout.setVisibility(View.GONE); } } // 用于处理推送 public void onEventMainThread(EventRefresh event) { if (event.refresh) { notifyEmputy(); } } @Override public void onAttach(Activity activity) { super.onAttach(activity); EventBus.getDefault().register(this); } @Override public void onDetach() { super.onDetach(); EventBus.getDefault().unregister(this); } @Override public void onRefresh() { ((SwipeRefreshLayout.OnRefreshListener) getParentFragment()).onRefresh(); } public void setRead(int id) { for (int i = 0; i < mData.size(); ++i) { if (mData.get(i).getId() == id) { mData.get(i).un_read_activities_count = 0; myAdapter.notifyDataSetChanged(); break; } } } public void setPin(int id, boolean pin) { for (int i = 0; i < mData.size(); ++i) { if (mData.get(i).getId() == id) { mData.get(i).setPin(pin); ProjectObject item = mData.remove(i); if (pin) { ++msectionId; mData.add(0, item); } else { --msectionId; mData.add(msectionId, item); } myAdapter.notifyDataSetChanged(); break; } } } @Override public void parseJson(int code, JSONObject respanse, String tag, int pos, Object data) throws JSONException { if (tag.equals(URL_PIN_SET)) { if (code == 0) { int id = (int) data; ((UpdateData) getParentFragment()).updatePin(id, true); } else { showErrorMsg(code, respanse); } } else if (tag.equals(URL_PIN_DELETE)) { if (code == 0) { int id = (int) data; ((UpdateData) getParentFragment()).updatePin(id, false); } else { showErrorMsg(code, respanse); } } } @ItemClick public void listView(ProjectObject item) { // if (item.un_read_activities_count > 0) { // 调用此函数,则按hot排序时项目会排序到有动态的项目后面 // String s = String.format(HOST_VISTIT, item.getId()); // getNetwork(s, HOST_VISTIT, 0, item.getId()); // } // 在搜索界面不是嵌套的,getParentFragment会返回null Fragment fragment = getParentFragment(); if (fragment == null) { fragment = this; } if (type == ProjectFragment.Type.Main) { ProjectActivity.ProjectJumpParam param = new ProjectActivity.ProjectJumpParam(item.project_path); ProjectHomeActivity_.intent(fragment).mJumpParam(param).startForResult(InitProUtils.REQUEST_PRO_UPDATE); } else { Intent intent = new Intent(); intent.putExtra("data", item); getActivity().setResult(Activity.RESULT_OK, intent); getActivity().finish(); } } @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == InitProUtils.REQUEST_PRO_UPDATE) { if (resultCode == Activity.RESULT_OK) { String action = data.getStringExtra("action"); if (action.equals(InitProUtils.FLAG_REFRESH)) { onRefresh(); } else if (action.equals(InitProUtils.FLAG_UPDATE_DYNAMIC)) { int projectId = data.getIntExtra("projectId", 0); if (projectId != 0) { Fragment parentFragment = getParentFragment(); FragmentActivity activity = getActivity(); if ((parentFragment instanceof UpdateData) && (activity != null)) { ((UpdateData) parentFragment).updateRead(projectId); UnreadNotify.update(activity); } } } } } super.onActivityResult(requestCode, resultCode, data); } @Override public void doAction(int pos) { final int projectId = mData.get(pos).getId(); if (mData.get(pos).isPin()) { String pinDeleteUrl = String.format(URL_PIN_DELETE, projectId); deleteNetwork(pinDeleteUrl, URL_PIN_DELETE, -1, projectId); } else { RequestParams params = new RequestParams(); params.put("ids", projectId); postNetwork(URL_PIN_SET, params, URL_PIN_SET, -1, projectId); } projectActionUtil.close(); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.btn_action: ProjectCreateActivity_.intent(this).start(); break; } } public interface UpdateData { void updateRead(int id); void updatePin(int id, boolean pin); } static class HeaderViewHolder { TextView mHead; } private static class ViewHolder { TextView name; ImageView image; TextView name2; TextView content; TextView desc; BadgeView badge; View privateIcon; ImageView privatePin; View fLayoutAction; } class MyAdapter extends BaseAdapter implements StickyListHeadersAdapter { @Override public int getCount() { return mData.size(); } @Override public Object getItem(int position) { return mData.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { View view = convertView; final ViewHolder holder; if (convertView == null) { view = mInflater.inflate(R.layout.project_all_list_item, parent, false); holder = new ViewHolder(); holder.name = (TextView) view.findViewById(R.id.name); holder.image = (ImageView) view.findViewById(R.id.icon); holder.content = (TextView) view.findViewById(R.id.comment); holder.badge = (BadgeView) view.findViewById(R.id.badge); holder.privateIcon = view.findViewById(R.id.privateIcon); holder.fLayoutAction = view.findViewById(R.id.flayoutAction); holder.desc = (TextView) view.findViewById(R.id.txtDesc); holder.privatePin = (ImageView) view.findViewById(R.id.privatePin); holder.name2 = (TextView) view.findViewById(R.id.name2); view.setTag(holder); } else { holder = (ViewHolder) view.getTag(); } ProjectObject item = (ProjectObject) getItem(position); holder.privatePin.setVisibility(item.isPin() ? View.VISIBLE : View.INVISIBLE); holder.privateIcon.setVisibility(item.isPublic() ? View.INVISIBLE : View.VISIBLE); String ownerName = item.owner_user_name; holder.content.setText(ownerName); if (!item.isPublic()) { holder.name.setVisibility(View.VISIBLE); holder.name.setText(item.name); holder.name2.setVisibility(View.INVISIBLE); } else { holder.name2.setVisibility(View.VISIBLE); holder.name2.setText(item.name); holder.name.setVisibility(View.INVISIBLE); } holder.desc.setText(item.getDescription()); setClickEvent(holder.fLayoutAction, position); if (type == ProjectFragment.Type.Pick) { holder.badge.setVisibility(View.INVISIBLE); } else { int count = item.un_read_activities_count; BadgeView badge = holder.badge; Global.setBadgeView(badge, count); } if (pos == 0) { holder.fLayoutAction.setVisibility(View.VISIBLE); } else { holder.privatePin.setVisibility(View.INVISIBLE); } iconfromNetwork(holder.image, item.icon, ImageLoadTool.optionsRounded2); return view; } private void setClickEvent(final View fLayoutAction, final int position) { fLayoutAction.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { projectActionUtil.show(fLayoutAction, position); if (!mData.get(position).isPin()) { projectActionUtil.getTxtSetting().setText("设为常用"); projectActionUtil.getTxtSetting().setTextColor(getActivity().getResources().getColor(R.color.white)); projectActionUtil.getTxtSetting().setBackgroundColor(getActivity().getResources().getColor(R.color.color_3BBD79)); } else { projectActionUtil.getTxtSetting().setText("取消常用"); projectActionUtil.getTxtSetting().setTextColor(getActivity().getResources().getColor(R.color.color_3BBD79)); projectActionUtil.getTxtSetting().setBackgroundColor(getActivity().getResources().getColor(R.color.color_E5E5E5)); } } }); } @Override public View getHeaderView(int position, View convertView, ViewGroup parent) { HeaderViewHolder holder; if (convertView == null) { holder = new HeaderViewHolder(); convertView = mInflater.inflate(R.layout.fragment_project_list_head, parent, false); holder.mHead = (TextView) convertView.findViewById(R.id.head); convertView.setTag(holder); } else { holder = (HeaderViewHolder) convertView.getTag(); } // int type = getSectionForPosition(position); // String title =titles[type]; holder.mHead.setText(getTitle()); return convertView; } @Override public long getHeaderId(int position) { return 0; } } }