package com.smartisanos.sidebar.view; import android.content.Context; import android.os.Handler; import android.os.Looper; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.LinearLayout; import android.widget.TextView; import com.smartisanos.sidebar.util.BookmarkManager; import com.smartisanos.sidebar.util.IEmpty; import com.smartisanos.sidebar.util.LOG; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import com.smartisanos.sidebar.R; import com.smartisanos.sidebar.util.Utils; public class BookmarkAdapter extends BaseAdapter { private static final LOG log = LOG.getInstance(BookmarkAdapter.class); private IEmpty mEmpty; private Context mContext; private BookmarkManager mBookmarkManager; private Handler mHandler; private List<BookmarkManager.BookmarkItem> mBookmarkList; private List mList = new ArrayList(); public BookmarkAdapter(Context context, IEmpty empty) { mContext = context; mEmpty = empty; mHandler = new Handler(Looper.getMainLooper()); mBookmarkManager = BookmarkManager.getInstance(mContext); mBookmarkList = mBookmarkManager.getBookmarks(); updateDataList(); mBookmarkManager.addListener(mUpdateListener); notifyEmpty(); } private BookmarkManager.RecentUpdateListener mUpdateListener = new BookmarkManager.RecentUpdateListener() { @Override public void onUpdate() { mHandler.post(new Runnable() { @Override public void run() { mBookmarkList = mBookmarkManager.getBookmarks(); updateDataList(); BookmarkAdapter.this.notifyDataSetChanged(); } }); } }; private void updateDataList() { if (mBookmarkList == null || mBookmarkList.size() == 0) { mList.clear(); return; } BookmarkManager.BookmarkItem[] items = new BookmarkManager.BookmarkItem[mBookmarkList.size()]; mBookmarkList.toArray(items); Arrays.sort(items); List list = new ArrayList(); String preLabel = null; long now = System.currentTimeMillis(); for (int i = 0; i < items.length; i++) { BookmarkManager.BookmarkItem item = items[i]; String label = Utils.convertDateToLabel(mContext, now, item.time); if (label != null && !label.equals(preLabel)) { preLabel = label; list.add(label); } list.add(item); } synchronized (mList) { mList.clear(); mList.addAll(list); } } private void notifyEmpty() { if (mEmpty != null) { mEmpty.setEmpty(getCount() == 0); } } @Override public void notifyDataSetChanged() { notifyEmpty(); super.notifyDataSetChanged(); } @Override public int getCount() { return mList.size(); } @Override public Object getItem(int position) { return mList.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup viewGroup) { ViewHolder holder; if (convertView == null || !(convertView instanceof LinearLayout)) { View view = View.inflate(mContext, R.layout.bookmark_item, null); LinearLayout dateLabel = (LinearLayout) view.findViewById(R.id.date_label); TextView dateContent = (TextView) view.findViewById(R.id.date_content); LinearLayout itemContent = (LinearLayout) view.findViewById(R.id.item_content); TextView title = (TextView) view.findViewById(R.id.title_text); TextView url = (TextView) view.findViewById(R.id.url_text); holder = new ViewHolder(); holder.view = view; holder.dateLabel = dateLabel; holder.dateContent = dateContent; holder.itemContent = itemContent; holder.title = title; holder.url = url; view.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } Object obj = mList.get(position); if (obj instanceof BookmarkManager.BookmarkItem) { holder.showItem((BookmarkManager.BookmarkItem) obj); } else { holder.showDate((String) obj); } return holder.view; } private class ViewHolder { public View view; public LinearLayout dateLabel; public TextView dateContent; public LinearLayout itemContent; public TextView title; public TextView url; public void showItem(BookmarkManager.BookmarkItem item) { if (dateLabel.getVisibility() == View.VISIBLE) { dateLabel.setVisibility(View.GONE); } if (itemContent.getVisibility() != View.VISIBLE) { itemContent.setVisibility(View.VISIBLE); } title.setText(item.title); url.setText(item.content_uri); } public void showDate(String date) { if (itemContent.getVisibility() == View.VISIBLE) { itemContent.setVisibility(View.GONE); } if (dateLabel.getVisibility() != View.VISIBLE) { dateLabel.setVisibility(View.VISIBLE); } dateContent.setText(date); } } }