package com.ustc.dystu.dandelion; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.Date; import java.util.HashMap; import java.util.Set; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import android.app.Activity; import android.app.ProgressDialog; import android.content.Intent; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.text.TextUtils; import android.view.Gravity; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.view.ViewGroup.LayoutParams; import android.widget.AbsListView; import android.widget.AbsListView.OnScrollListener; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.BaseAdapter; import android.widget.CheckBox; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.ProgressBar; import android.widget.RelativeLayout; import android.widget.TextView; import android.widget.Toast; import com.emilsjolander.components.stickylistheaders.StickyListHeadersAdapter; import com.emilsjolander.components.stickylistheaders.StickyListHeadersListView; import com.emilsjolander.components.stickylistheaders.StickyListHeadersListView.OnHeaderClickListener; import com.ustc.dystu.dandelion.bean.FootInfo; import com.ustc.dystu.dandelion.bean.NoteInfo; import com.ustc.dystu.dandelion.constant.Constants; import com.ustc.dystu.dandelion.fragment.BaseFragment; import com.ustc.dystu.dandelion.net.APIUtils; import com.ustc.dystu.dandelion.net.DandRequestListener; import com.ustc.dystu.dandelion.net.DandelionAPI; import com.ustc.dystu.dandelion.utils.LocationTask; import com.ustc.dystu.dandelion.utils.Logger; import com.ustc.dystu.dandelion.utils.SharePrefUtils; import com.ustc.dystu.dandelion.utils.image.ImageCache; import com.ustc.dystu.dandelion.utils.image.ImageFetcher; import com.ustc.dystu.dandelion.utils.image.Utils; public class AddNoteActivity extends Activity implements OnScrollListener { private static final String TAG = AddNoteActivity.class.getSimpleName(); private static final int REQUEST_GET_FOOT_LIST = 0x1; private static final int REQUEST_CREATE_NOTE = 0x2; FootListAdapter mAdapter; ArrayList<FootInfo> mFootList = new ArrayList<FootInfo>(); private ArrayList<Integer> groupIds = new ArrayList<Integer>(); // private View mFootView; ProgressBar footBar; private ImageView mBtnBack; private ImageView mBtnAdd; private TextView mTvTitle; ProgressBar pbRefresh; private int mCurrentPage = 1; private int mTotalNum; private ProgressDialog mProgress; private TextView mEmptyView; Handler mHandler = new Handler() { @Override public void handleMessage(Message msg) { pbRefresh.setVisibility(View.GONE); mBtnAdd.setVisibility(View.VISIBLE); if (mProgress != null) { mProgress.dismiss(); } switch (msg.what) { case REQUEST_GET_FOOT_LIST: if (msg.obj != null) { ArrayList<FootInfo> list = (ArrayList<FootInfo>) msg.obj; if (mCurrentPage == 1) { mFootList.clear(); } mFootList.addAll(list); Logger.d(TAG, "total num-->" + mTotalNum); if (mFootList.size() < mTotalNum) { // 仍需要加载 needLoadMore = true; } else { // 不需要加载了... needLoadMore = false; } mCurrentPage++; mAdapter.notifyDataSetChanged(); getGroupIds(); } else { Toast.makeText(AddNoteActivity.this, "足迹列表为空!", Toast.LENGTH_SHORT).show(); mStickyList.setEmptyView(mEmptyView); } break; case REQUEST_CREATE_NOTE: if (msg.obj != null) { Toast.makeText(AddNoteActivity.this, "创建成功!", Toast.LENGTH_SHORT).show(); createNoteSuccess((NoteInfo) msg.obj); } break; case BaseFragment.ERROR_RESPONSE: if (msg.obj != null) { Toast.makeText(AddNoteActivity.this, (String) msg.obj, Toast.LENGTH_SHORT).show(); } break; default: break; } } }; private StickyListHeadersListView mStickyList; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_add_note); mStickyList = (StickyListHeadersListView) findViewById(R.id.lv_sticky_list); pbRefresh = (ProgressBar) findViewById(R.id.pb_refresh); mProgress = new ProgressDialog(this); mProgress.setCanceledOnTouchOutside(false); mAdapter = new FootListAdapter(); mStickyList.setAdapter(mAdapter); mStickyList.setOnScrollListener(this); mStickyList.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { Logger.d(TAG, "item clicked-->" + position); mAdapter.toggleChecked(position, view); } }); mStickyList.setOnHeaderClickListener(new OnHeaderClickListener() { @Override public void onHeaderClick(StickyListHeadersListView l, View header, int itemPosition, long headerId, boolean currentlySticky) { Logger.d(TAG, "header clicked-->" + headerId + "; item position-->" + itemPosition + "; current sticky-->" + currentlySticky); mAdapter.toggleHeaderChecked(headerId, header); } }); mBtnBack = (ImageView) findViewById(R.id.iv_back); mBtnBack.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { finish(); } }); mBtnAdd = (ImageView) findViewById(R.id.iv_add); mBtnAdd.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { createTravleNote(); } }); mTvTitle = (TextView) findViewById(R.id.tv_title); mEmptyView = new TextView(this); mEmptyView.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT)); mEmptyView.setGravity(Gravity.CENTER); mEmptyView.setTextColor(getResources().getColor(R.color.black)); mEmptyView.setText("没有找到好友的足迹..."); ((ViewGroup) mStickyList.getParent()).addView(mEmptyView); mEmptyView.setVisibility(View.GONE); initList(); } private void createTravleNote() { ArrayList<FootInfo> selectedList = new ArrayList<FootInfo>(); for (FootInfo info : mFootList) { if (info.isChecked) { selectedList.add(info); } } if (selectedList.isEmpty()) { Toast.makeText(AddNoteActivity.this, "您没有选择任何微博!", Toast.LENGTH_SHORT).show(); return; } else if (selectedList.size() > 50) { Toast.makeText(AddNoteActivity.this, "选择的微博数量不能超过50个!", Toast.LENGTH_SHORT).show(); return; } mProgress.setMessage("正在创建游记, 请稍候..."); mProgress.show(); ArrayList<Date> dateList = new ArrayList<Date>(); HashMap<String, String> locationMap = new HashMap<String, String>(); String picUrl = null; for (FootInfo info : selectedList) { dateList.add(info.date); if (info.formate_loaction != null) { locationMap.put(info.formate_loaction, null); } if (!TextUtils.isEmpty(info.original_pic)) { picUrl = info.original_pic; } } Comparator<Date> comparator = new Comparator<Date>() { @Override public int compare(Date lhs, Date rhs) { return lhs.before(rhs) ? -1 : 1; } }; Collections.sort(dateList, comparator); Date before = dateList.get(0); Date after = dateList.get(dateList.size() - 1); String time_from = String.valueOf(before.getTime()); String time_to = String.valueOf(after.getTime()); Set<String> keySet = locationMap.keySet(); if (keySet.isEmpty()) { Toast.makeText(AddNoteActivity.this, "网络繁忙, 请稍后重试!", Toast.LENGTH_SHORT).show(); return; } StringBuffer sb = new StringBuffer(); for (String string : keySet) { sb.append(string).append(","); } String location = sb.substring(0, sb.length() - 1); String title = getIntent().getStringExtra("note_title"); if (TextUtils.isEmpty(title) || TextUtils.isEmpty(location)) { Toast.makeText(this, "信息不全, 无法提交!", Toast.LENGTH_SHORT).show(); mProgress.dismiss(); } else { Logger.d(TAG, "title:" + title); Logger.d(TAG, "location:" + location); Logger.d(TAG, "weibo_uid:" + SharePrefUtils.getUid(this)); Logger.d(TAG, "folder_url:" + picUrl); NoteInfo noteInfo = new NoteInfo(); noteInfo.note_folder_url = picUrl; noteInfo.note_location = location; noteInfo.note_title = title; noteInfo.note_uid = SharePrefUtils.getUid(this); noteInfo.note_is_suggest = 0; noteInfo.note_time_from = time_from; noteInfo.note_time_to = time_to; String json = APIUtils.buildJson(selectedList, 1, this); DandelionAPI.getInstance(this).createTravelNote( new DandRequestListener(mHandler) { @Override public void onComplete(String response) { Message msg = Message.obtain(); try { NoteInfo info = NoteInfo.create(new JSONObject( response)); msg.what = REQUEST_CREATE_NOTE; msg.obj = info; } catch (Exception e) { e.printStackTrace(); msg.what = BaseFragment.ERROR_RESPONSE; msg.obj = "数据解析异常"; } mHandler.sendMessage(msg); } }, noteInfo, json); } } private void createNoteSuccess(NoteInfo info) { Intent intent = new Intent(); intent.putExtra("note_info", info); intent.putExtra("isfromMe", true); intent.setClass(this, NoteInfoActivity.class); startActivity(intent); Intent broadcast = new Intent(); broadcast.putExtra("note_info", info); broadcast.setAction(Constants.ACTION_CREATE_NOTE_SUCCESS); sendBroadcast(broadcast); finish(); } private void initList() { if (mCurrentPage == 1) { mProgress.setMessage("正在加载, 请稍候..."); mProgress.show(); } pbRefresh.setVisibility(View.VISIBLE); mBtnAdd.setVisibility(View.GONE); DandelionAPI.getInstance(this).getLocationStatus( new DandRequestListener(mHandler) { @Override public void onComplete(String response) { Message msg = Message.obtain(); try { if (TextUtils.isEmpty(response) || response.contains("error_code")) { msg.what = BaseFragment.ERROR_RESPONSE; JSONObject obj = new JSONObject(response); msg.obj = obj.getString("error"); Logger.d(TAG, "error-->" + msg.obj); } else { Logger.d(TAG, "response-->" + response); if (!response.equals("[]")) { JSONObject obj = new JSONObject(response); String total = obj.getString("total_number"); mTotalNum = Integer.parseInt(total); if (mTotalNum > 0) { JSONArray jsonArray = obj .getJSONArray("statuses"); ArrayList<FootInfo> list = FootInfo .create(jsonArray, mFootList.size()); msg.obj = list; } } msg.what = REQUEST_GET_FOOT_LIST; } mHandler.sendMessage(msg); } catch (JSONException e) { e.printStackTrace(); msg.what = BaseFragment.ERROR_RESPONSE; msg.obj = "数据解析异常"; mHandler.sendMessage(msg); } } }, DandelionAPI.getInstance(this).getUid(), mCurrentPage); } class FootListAdapter extends BaseAdapter implements StickyListHeadersAdapter { private ImageFetcher mImageWorker; private LocationTask locationUtils; int padding; public FootListAdapter() { int[] wh = Utils.getMidPicWidthAndHeight(AddNoteActivity.this); mImageWorker = new ImageFetcher(AddNoteActivity.this, wh[0], wh[1]); mImageWorker.setImageCache(new ImageCache(AddNoteActivity.this, Constants.THUMNAIL_CACHE_PATH)); mImageWorker.setLoadingImage(R.drawable.share_public_headview_bg); mImageWorker.setImageFadeIn(false); locationUtils = new LocationTask(AddNoteActivity.this); padding = Utils.dip2px(AddNoteActivity.this, 3); } @Override public int getCount() { return mFootList.size(); } @Override public FootInfo getItem(int position) { return mFootList.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder; if (convertView == null) { convertView = getLayoutInflater().inflate( R.layout.child_item_add_note, null); holder = new ViewHolder(); holder.tvLocation = (TextView) convertView .findViewById(R.id.tv_location); holder.ivIcon = (ImageView) convertView .findViewById(R.id.iv_icon); holder.tvText = (TextView) convertView .findViewById(R.id.tv_text); holder.tvTime = (TextView) convertView .findViewById(R.id.tv_time); holder.tvPicNum = (TextView) convertView .findViewById(R.id.tv_pic_num); holder.rlIcon = (RelativeLayout) convertView .findViewById(R.id.rl_icon); holder.llCard = (LinearLayout) convertView .findViewById(R.id.ll_card); convertView.setTag(holder); } holder = (ViewHolder) convertView.getTag(); FootInfo info = mFootList.get(position); if (!TextUtils.isEmpty(info.formate_loaction)) { holder.tvLocation.setText(info.getFormatLoaciton()); } else { holder.tvLocation.setText(""); locationUtils.loadLocation(info, holder.tvLocation); } holder.tvText.setText(info.text); // holder.cbCheck.setChecked(info.isChecked); if (info.isChecked) { holder.llCard .setBackgroundResource(R.drawable.note_info_item_bg_s); holder.llCard.setPadding(padding, padding, padding, padding); } else { holder.llCard .setBackgroundResource(R.drawable.note_info_item_bg); holder.llCard.setPadding(padding, padding, padding, padding); } holder.tvText.setText(info.text); holder.tvTime.setText(info.getDetailFormatTime()); if (!TextUtils.isEmpty(info.original_pic)) { holder.rlIcon.setVisibility(View.VISIBLE); mImageWorker.loadImage(info.original_pic, holder.ivIcon, true); } else { holder.rlIcon.setVisibility(View.GONE); } if (info.picIds != null && info.picIds.length > 1) { holder.tvPicNum.setVisibility(View.VISIBLE); holder.tvPicNum.setText(info.picIds.length + "P"); } else { holder.tvPicNum.setVisibility(View.INVISIBLE); } return convertView; } @Override public View getHeaderView(int position, View convertView, ViewGroup parent) { HeaderViewHolder holder; if (convertView == null) { holder = new HeaderViewHolder(); convertView = getLayoutInflater().inflate( R.layout.head_item_add_note, parent, false); holder.tvHeaderName = (TextView) convertView .findViewById(R.id.tv_head); holder.cbHeaderCheck = (CheckBox) convertView .findViewById(R.id.cb_header_check); convertView.setTag(holder); } else { holder = (HeaderViewHolder) convertView.getTag(); } holder.tvHeaderName.setText(getItem(position).created_at); boolean isChecked = true; for (FootInfo info : mFootList) { if (info.headerId == getHeaderPosition(position) && !info.isChecked) { isChecked = false; break; } } Logger.d(TAG, "header is checked-->" + isChecked + "; pos->" + position + "; info-->" + getItem(position).created_at); holder.cbHeaderCheck.setChecked(isChecked); return convertView; } @Override public long getHeaderId(int position) { return getItem(position).headerId; } public void toggleChecked(int position, View view) { FootInfo entry = (FootInfo) getItem(position); entry.isChecked = !entry.isChecked; Logger.d(TAG, "entry is checked-->" + entry.isChecked); LinearLayout llCard = (LinearLayout) view .findViewById(R.id.ll_card); if (entry.isChecked) { llCard.setBackgroundResource(R.drawable.note_info_item_bg_s); llCard.setPadding(padding, padding, padding, padding); } else { llCard.setBackgroundResource(R.drawable.note_info_item_bg); llCard.setPadding(padding, padding, padding, padding); } if (entry.isChecked) { mSelectedNum++; } else { mSelectedNum--; } updateTitle(); notifyDataSetChanged(); } public void toggleHeaderChecked(long headerId, View view) { CheckBox checkBox = (CheckBox) view .findViewById(R.id.cb_header_check); boolean isChecked = checkBox.isChecked(); checkBox.setChecked(!isChecked); for (FootInfo info : mFootList) { if (info.headerId == headerId) { if (info.isChecked != !isChecked) { info.isChecked = !isChecked; if (info.isChecked) { mSelectedNum++; } else { mSelectedNum--; } } } } updateTitle(); notifyDataSetChanged(); } } private int mSelectedNum; private void updateTitle() { if (mSelectedNum > 0) { mTvTitle.setText(String.format("已选择(%s)", mSelectedNum)); } else { mTvTitle.setText("添加游记"); mSelectedNum = 0; } } class ViewHolder { public TextView tvTime; public TextView tvLocation; public TextView tvText; public TextView tvPicNum; public ImageView ivIcon; public RelativeLayout rlIcon; public LinearLayout llCard; } class HeaderViewHolder { TextView tvHeaderName; CheckBox cbHeaderCheck; } private void getGroupIds() { HashMap<Integer, String> map = new HashMap<Integer, String>(); for (FootInfo info : mFootList) { map.put(info.headerId, null); } Set<Integer> keySet = map.keySet(); groupIds.clear(); groupIds.addAll(keySet); Collections.sort(groupIds, comparator); Logger.d(TAG, "groupIds-->" + groupIds); } private int getHeaderPosition(int pos) { int size = groupIds.size(); for (int i = 0; i < size; i++) { if (i < size - 1) { if (pos >= groupIds.get(i) && pos < groupIds.get(i + 1)) { return groupIds.get(i); } } else { return groupIds.get(i); } } return 0; } Comparator<Integer> comparator = new Comparator<Integer>() { @Override public int compare(Integer lhs, Integer rhs) { return lhs - rhs; } }; boolean needLoadMore = true; @Override public void onScrollStateChanged(AbsListView view, int scrollState) { switch (scrollState) { // 当不滚动时 case OnScrollListener.SCROLL_STATE_IDLE: // 判断滚动到底部 if (mStickyList.getLastVisiblePosition() == (mStickyList.getCount() - 1)) { Logger.d(TAG, "reach bottom..."); if (needLoadMore) { initList(); } } // 判断滚动到顶部 if (mStickyList.getFirstVisiblePosition() == 0) { Logger.d(TAG, "reach top..."); } break; } } boolean flag; @Override public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { if (firstVisibleItem + visibleItemCount == totalItemCount && !flag) { flag = true; } else { flag = false; } } }