package net.coding.program.project; import android.app.Activity; import android.content.Context; import android.content.Intent; import android.text.Spanned; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.ImageView; import android.widget.SectionIndexer; import android.widget.TextView; import net.coding.program.FootUpdate; import net.coding.program.R; import net.coding.program.common.ClickSmallImage; import net.coding.program.common.Global; import net.coding.program.common.ImageLoadTool; import net.coding.program.common.LongClickLinkMovementMethod; import net.coding.program.common.MyImageGetter; import net.coding.program.common.htmltext.URLSpanNoUnderline; import net.coding.program.common.network.RefreshBaseFragment; import net.coding.program.common.widget.DataAdapter; import net.coding.program.login.auth.Utilities; import net.coding.program.maopao.item.ContentAreaMuchImages; import net.coding.program.model.DynamicObject; import net.coding.program.user.UserDetailActivity_; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Calendar; import se.emilsjolander.stickylistheaders.StickyListHeadersAdapter; /** * Created by bill on 16/3/23. */ public class DateSectionDynamicAdapter<T extends DynamicObject.DynamicBaseObject> extends DataAdapter<T> implements StickyListHeadersAdapter, SectionIndexer { private final LayoutInflater mInflater; protected ImageLoadTool mImageLoader; private MyImageGetter myImageGetter; public boolean mNoMore = false; private int mLastId; FootUpdate.LoadMore mLoadMoreObj; private SimpleDateFormat mDataDyanmicItem = new SimpleDateFormat("HH:mm"); String sToday = ""; String sYesterday = ""; private Context mContext; protected View.OnClickListener mOnClickUser = new View.OnClickListener() { @Override public void onClick(View v) { String globalKey = (String) v.getTag(); Intent intent = new Intent(mContext, UserDetailActivity_.class); intent.putExtra("globalKey", globalKey); mContext.startActivity(intent); } }; View.OnClickListener onClickJump = new View.OnClickListener() { @Override public void onClick(View v) { String s = (String) v.getTag(); if (s.isEmpty()) { return; } URLSpanNoUnderline.openActivityByUri(v.getContext(), s, false); } }; View.OnClickListener onClickParent = new View.OnClickListener() { @Override public void onClick(View v) { ((ViewGroup) v.getParent()).callOnClick(); } }; private ArrayList<Long> mSectionTitle = new ArrayList<>(); private ArrayList<Integer> mSectionId = new ArrayList<>(); public DateSectionDynamicAdapter(Context context, MyImageGetter imageGetter, FootUpdate.LoadMore loader) { mContext = context; mInflater = LayoutInflater.from(context); mImageLoader = new ImageLoadTool(); myImageGetter = imageGetter; mLoadMoreObj = loader; Calendar calendar = Calendar.getInstance(); Long today = calendar.getTimeInMillis(); sToday = Global.mDateFormat.format(today); Long yesterday = calendar.getTimeInMillis() - 1000 * 60 * 60 * 24; sYesterday = Global.mDateFormat.format(yesterday); resetLastId(); } @Override public boolean isEnabled(int position) { return false; } public void initSection() { mSectionTitle.clear(); mSectionId.clear(); if (getCount() > 0) { mSectionId.add(0); Calendar lastTime = Calendar.getInstance(); lastTime.setTimeInMillis(getItem(0).created_at); Calendar nowTime = Calendar.getInstance(); mSectionTitle.add(lastTime.getTimeInMillis()); for (int i = 0; i < getCount(); ++i) { nowTime.setTimeInMillis(getItem(i).created_at); if (Utilities.isDifferentDay(lastTime, nowTime)) { lastTime.setTimeInMillis(nowTime.getTimeInMillis()); mSectionTitle.add(lastTime.getTimeInMillis()); mSectionId.add(i); } } } } @Override public T getItem(int position) { return (T) super.getItem(position); } public int getItemResource(int position) { return R.layout.fragment_project_dynamic_list_item; } public ViewHolder createHolder(int position, View convertView) { ViewHolder holder = new ViewHolder(); holder.mTitle = (TextView) convertView.findViewById(R.id.title); holder.mTitle.setMovementMethod(LongClickLinkMovementMethod.getInstance()); holder.mTitle.setFocusable(false); holder.mContent = (TextView) convertView.findViewById(R.id.content); holder.mContent.setMovementMethod(LongClickLinkMovementMethod.getInstance()); holder.mContent.setOnClickListener(onClickParent); holder.mContent.setFocusable(false); holder.mLayoutClick = (ViewGroup) convertView.findViewById(R.id.layout0); holder.mLayoutClick.setOnClickListener(onClickJump); holder.mIcon = (ImageView) convertView.findViewById(R.id.icon); holder.mTime = (TextView) convertView.findViewById(R.id.time); holder.timeLineUp = convertView.findViewById(R.id.timeLineUp); holder.timeLinePoint = convertView.findViewById(R.id.timeLinePoint); holder.timeLineDown = convertView.findViewById(R.id.timeLineDown); holder.divideLeft = convertView.findViewById(R.id.divideLeft); holder.divideRight = convertView.findViewById(R.id.divideRight); convertView.setTag(holder); return holder; } @Override public View getView(int position, View convertView, ViewGroup parent) { T data = getItem(position); ViewHolder holder; if (convertView == null) { convertView = mInflater.inflate(getItemResource(position), parent, false); holder = createHolder(position, convertView); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } holder.mTitle.setText(data.title()); Spanned contentSpanned = data.content(myImageGetter); if (contentSpanned.length() == 0) { holder.mContent.setVisibility(View.GONE); } else { holder.mContent.setVisibility(View.VISIBLE); holder.mContent.setText(contentSpanned); } holder.mTime.setText(mDataDyanmicItem.format(data.created_at)); holder.mLayoutClick.setTag(data.jump()); int nowSection = getSectionForPosition(position); if (position == 0) { holder.timeLineUp.setVisibility(View.INVISIBLE); } else { int upItemSection = getSectionForPosition(position - 1); if (nowSection == upItemSection) { holder.timeLineUp.setVisibility(View.VISIBLE); } else { holder.timeLineUp.setVisibility(View.INVISIBLE); } } if (position == getCount() - 1) { if (mNoMore) { holder.timeLineDown.setVisibility(View.INVISIBLE); } else { holder.timeLineDown.setVisibility(View.VISIBLE); } } else { int downItemSection = getSectionForPosition(position + 1); if (nowSection == downItemSection) { holder.timeLineDown.setVisibility(View.VISIBLE); } else { holder.timeLineDown.setVisibility(View.INVISIBLE); } } if (holder.mIcon != null) { holder.mIcon.setOnClickListener(mOnClickUser); mImageLoader.loadImage(holder.mIcon, data.user.avatar); holder.mIcon.setTag(data.user.global_key); } if (getCount() - position <= 3) { if (!mNoMore && mLoadMoreObj != null) { int lastId = getItem(getCount() - 1).id; if (mLastId != (lastId)) { mLastId = lastId; mLoadMoreObj.loadMore(); } } } afterGetView(position, convertView, parent, holder); return convertView; } public void afterGetView(int position, View convertView, ViewGroup parent, ViewHolder holder) { } @Override public View getHeaderView(int position, View convertView, ViewGroup parent) { HeaderViewHolder holder; if (convertView == null) { holder = new HeaderViewHolder(); convertView = mInflater.inflate(getListSectionResourceId(), parent, false); holder.mHead = (TextView) convertView.findViewById(R.id.head); convertView.setTag(holder); } else { holder = (HeaderViewHolder) convertView.getTag(); } Long time = mSectionTitle.get(getSectionForPosition(position)); String s = Global.mDateFormat.format(time); if (s.equals(sToday)) { s += " (今天)"; } else if (s.equals(sYesterday)) { s += " (昨天)"; } holder.mHead.setText(s); return convertView; } @Override public long getHeaderId(int position) { return getSectionForPosition(position); } @Override public int getPositionForSection(int section) { return section; } @Override public int getSectionForPosition(int position) { for (int i = 0; i < mSectionId.size(); ++i) { if (position < mSectionId.get(i)) { return i - 1; } } return mSectionId.size() - 1; } @Override public Object[] getSections() { return mSectionTitle.toArray(); } @Override public void notifyDataSetChanged() { initSection(); super.notifyDataSetChanged(); } class HeaderViewHolder { TextView mHead; } protected class ViewHolder { public ImageView mIcon; TextView mTitle; public TextView mContent; TextView mTime; ViewGroup mLayoutClick; public View timeLineUp; public View timeLinePoint; public View timeLineDown; public View divideLeft; protected View divideRight; } public void setDynamics(ArrayList<T> data) { super.setData(data); } protected int getListSectionResourceId() { return R.layout.fragment_project_dynamic_list_head; } public void setHasMore(boolean hasMore) { mNoMore = !hasMore; } public int lastId() { return mLastId; } public void resetLastId() { mLastId = RefreshBaseFragment.UPDATE_ALL_INT; } }