package com.topnews.adapter; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.zip.Inflater; import com.nostra13.universalimageloader.core.DisplayImageOptions; import com.nostra13.universalimageloader.core.ImageLoader; import com.nostra13.universalimageloader.core.assist.ImageScaleType; import com.nostra13.universalimageloader.core.display.FadeInBitmapDisplayer; import com.topnews.R; import com.topnews.bean.NewsEntity; import com.topnews.tool.Constants; import com.topnews.tool.DateTools; import com.topnews.tool.Options; import com.topnews.view.HeadListView; import com.topnews.view.HeadListView.HeaderAdapter; import android.app.Activity; import android.graphics.Bitmap; import android.graphics.drawable.ColorDrawable; import android.text.TextUtils; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup.LayoutParams; import android.view.ViewGroup; import android.widget.AbsListView; import android.widget.BaseAdapter; import android.widget.Button; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.PopupWindow; import android.widget.RelativeLayout; import android.widget.SectionIndexer; import android.widget.TextView; import android.widget.AbsListView.OnScrollListener; public class NewsAdapter extends BaseAdapter implements SectionIndexer, HeaderAdapter, OnScrollListener{ ArrayList<NewsEntity> newsList; Activity activity; LayoutInflater inflater = null; protected ImageLoader imageLoader = ImageLoader.getInstance(); DisplayImageOptions options; /** 弹出的更多选择框 */ private PopupWindow popupWindow; public NewsAdapter(Activity activity, ArrayList<NewsEntity> newsList) { this.activity = activity; this.newsList = newsList; inflater = LayoutInflater.from(activity); options = Options.getListOptions(); initPopWindow(); initDateHead(); } private List<Integer> mPositions; private List<String> mSections; private void initDateHead() { mSections = new ArrayList<String>(); mPositions= new ArrayList<Integer>(); for(int i = 0; i <newsList.size();i++){ if(i == 0){ mSections.add(DateTools.getSection(String.valueOf(newsList.get(i).getPublishTime()))); mPositions.add(i); continue; } if(i != newsList.size()){ if(!newsList.get(i).getPublishTime().equals(newsList.get(i - 1).getPublishTime())){ mSections.add(DateTools.getSection(String.valueOf(newsList.get(i).getPublishTime()))); mPositions.add(i); } } } } @Override public int getCount() { // TODO Auto-generated method stub return newsList == null ? 0 : newsList.size(); } @Override public NewsEntity getItem(int position) { // TODO Auto-generated method stub if (newsList != null && newsList.size() != 0) { return newsList.get(position); } return null; } @Override public long getItemId(int position) { // TODO Auto-generated method stub return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { // TODO Auto-generated method stub ViewHolder mHolder; View view = convertView; if (view == null) { view = inflater.inflate(R.layout.list_item, null); mHolder = new ViewHolder(); mHolder.item_layout = (LinearLayout)view.findViewById(R.id.item_layout); mHolder.comment_layout = (RelativeLayout)view.findViewById(R.id.comment_layout); mHolder.item_title = (TextView)view.findViewById(R.id.item_title); mHolder.item_source = (TextView)view.findViewById(R.id.item_source); mHolder.list_item_local = (TextView)view.findViewById(R.id.list_item_local); mHolder.comment_count = (TextView)view.findViewById(R.id.comment_count); mHolder.publish_time = (TextView)view.findViewById(R.id.publish_time); mHolder.item_abstract = (TextView)view.findViewById(R.id.item_abstract); mHolder.alt_mark = (ImageView)view.findViewById(R.id.alt_mark); mHolder.right_image = (ImageView)view.findViewById(R.id.right_image); mHolder.item_image_layout = (LinearLayout)view.findViewById(R.id.item_image_layout); mHolder.item_image_0 = (ImageView)view.findViewById(R.id.item_image_0); mHolder.item_image_1 = (ImageView)view.findViewById(R.id.item_image_1); mHolder.item_image_2 = (ImageView)view.findViewById(R.id.item_image_2); mHolder.large_image = (ImageView)view.findViewById(R.id.large_image); mHolder.popicon = (ImageView)view.findViewById(R.id.popicon); mHolder.comment_content = (TextView)view.findViewById(R.id.comment_content); mHolder.right_padding_view = (View)view.findViewById(R.id.right_padding_view); //头部的日期部分 mHolder.layout_list_section = (LinearLayout)view.findViewById(R.id.layout_list_section); mHolder.section_text = (TextView)view.findViewById(R.id.section_text); mHolder.section_day = (TextView)view.findViewById(R.id.section_day); view.setTag(mHolder); } else { mHolder = (ViewHolder) view.getTag(); } //获取position对应的数据 NewsEntity news = getItem(position); mHolder.item_title.setText(news.getTitle()); mHolder.item_source.setText(news.getSource()); mHolder.comment_count.setText("评论" + news.getCommentNum()); mHolder.publish_time.setText(news.getPublishTime() + "小时前"); List<String> imgUrlList = news.getPicList(); mHolder.popicon.setVisibility(View.VISIBLE); mHolder.comment_count.setVisibility(View.VISIBLE); mHolder.right_padding_view.setVisibility(View.VISIBLE); if(imgUrlList !=null && imgUrlList.size() !=0){ if(imgUrlList.size() == 1){ mHolder.item_image_layout.setVisibility(View.GONE); //是否是大图 if(news.getIsLarge()){ mHolder.large_image.setVisibility(View.VISIBLE); mHolder.right_image.setVisibility(View.GONE); imageLoader.displayImage(imgUrlList.get(0), mHolder.large_image, options); mHolder.popicon.setVisibility(View.GONE); mHolder.comment_count.setVisibility(View.GONE); mHolder.right_padding_view.setVisibility(View.GONE); }else{ mHolder.large_image.setVisibility(View.GONE); mHolder.right_image.setVisibility(View.VISIBLE); imageLoader.displayImage(imgUrlList.get(0), mHolder.right_image, options); } }else{ mHolder.large_image.setVisibility(View.GONE); mHolder.right_image.setVisibility(View.GONE); mHolder.item_image_layout.setVisibility(View.VISIBLE); imageLoader.displayImage(imgUrlList.get(0), mHolder.item_image_0, options); imageLoader.displayImage(imgUrlList.get(1), mHolder.item_image_1, options); imageLoader.displayImage(imgUrlList.get(2), mHolder.item_image_2, options); } }else{ mHolder.right_image.setVisibility(View.GONE); mHolder.item_image_layout.setVisibility(View.GONE); } int markResID = getAltMarkResID(news.getMark(),news.getCollectStatus()); if(markResID != -1){ mHolder.alt_mark.setVisibility(View.VISIBLE); mHolder.alt_mark.setImageResource(markResID); }else{ mHolder.alt_mark.setVisibility(View.GONE); } //判断该新闻概述是否为空 if (!TextUtils.isEmpty(news.getNewsAbstract())) { mHolder.item_abstract.setVisibility(View.VISIBLE); mHolder.item_abstract.setText(news.getNewsAbstract()); } else { mHolder.item_abstract.setVisibility(View.GONE); } //判断该新闻是否是特殊标记的,推广等,为空就是新闻 if(!TextUtils.isEmpty(news.getLocal())){ mHolder.list_item_local.setVisibility(View.VISIBLE); mHolder.list_item_local.setText(news.getLocal()); }else{ mHolder.list_item_local.setVisibility(View.GONE); } //判断评论字段是否为空,不为空显示对应布局 if(!TextUtils.isEmpty(news.getComment())){ //news.getLocal() != null && mHolder.comment_layout.setVisibility(View.VISIBLE); mHolder.comment_content.setText(news.getComment()); }else{ mHolder.comment_layout.setVisibility(View.GONE); } //判断该新闻是否已读 if(!news.getReadStatus()){ mHolder.item_layout.setSelected(true); }else{ mHolder.item_layout.setSelected(false); } //设置+按钮点击效果 mHolder.popicon.setOnClickListener(new popAction(position)); //头部的相关东西 int section = getSectionForPosition(position); if (getPositionForSection(section) == position) { mHolder.layout_list_section.setVisibility(View.VISIBLE); // head_title.setText(news.getDate()); mHolder.section_text.setText(mSections.get(section)); mHolder.section_day.setText("今天"); } else { mHolder.layout_list_section.setVisibility(View.GONE); } return view; } static class ViewHolder { LinearLayout item_layout; //title TextView item_title; //图片源 TextView item_source; //类似推广之类的标签 TextView list_item_local; //评论数量 TextView comment_count; //发布时间 TextView publish_time; //新闻摘要 TextView item_abstract; //右上方TAG标记图片 ImageView alt_mark; //右边图片 ImageView right_image; //3张图片布局 LinearLayout item_image_layout; //3张图片时候的布局 ImageView item_image_0; ImageView item_image_1; ImageView item_image_2; //大图的图片的话布局 ImageView large_image; //pop按钮 ImageView popicon; //评论布局 RelativeLayout comment_layout; TextView comment_content; //paddingview View right_padding_view; //头部的日期部分 LinearLayout layout_list_section; TextView section_text; TextView section_day; } /** 根据属性获取对应的资源ID */ public int getAltMarkResID(int mark,boolean isfavor){ if(isfavor){ return R.drawable.ic_mark_favor; } switch (mark) { case Constants.mark_recom: return R.drawable.ic_mark_recommend; case Constants.mark_hot: return R.drawable.ic_mark_hot; case Constants.mark_frist: return R.drawable.ic_mark_first; case Constants.mark_exclusive: return R.drawable.ic_mark_exclusive; case Constants.mark_favor: return R.drawable.ic_mark_favor; default: break; } return -1; } /** popWindow 关闭按钮 */ private ImageView btn_pop_close; /** * 初始化弹出的pop * */ private void initPopWindow() { View popView = inflater.inflate(R.layout.list_item_pop, null); popupWindow = new PopupWindow(popView, LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); popupWindow.setBackgroundDrawable(new ColorDrawable(0)); //设置popwindow出现和消失动画 popupWindow.setAnimationStyle(R.style.PopMenuAnimation); btn_pop_close = (ImageView) popView.findViewById(R.id.btn_pop_close); } /** * 显示popWindow * */ public void showPop(View parent, int x, int y,int postion) { //设置popwindow显示位置 popupWindow.showAtLocation(parent, 0, x, y); //获取popwindow焦点 popupWindow.setFocusable(true); //设置popwindow如果点击外面区域,便关闭。 popupWindow.setOutsideTouchable(true); popupWindow.update(); if (popupWindow.isShowing()) { } btn_pop_close.setOnClickListener(new OnClickListener() { public void onClick(View paramView) { popupWindow.dismiss(); } }); } /** * 每个ITEM中more按钮对应的点击动作 * */ public class popAction implements OnClickListener{ int position; public popAction(int position){ this.position = position; } @Override public void onClick(View v) { int[] arrayOfInt = new int[2]; //获取点击按钮的坐标 v.getLocationOnScreen(arrayOfInt); int x = arrayOfInt[0]; int y = arrayOfInt[1]; showPop(v, x , y, position); } } /* 是不是城市频道, true:是 false :不是*/ public boolean isCityChannel = false; /* 是不是第一个ITEM, true:是 false :不是*/ public boolean isfirst = true; /* * 设置是不是特殊的频道(城市频道) */ public void setCityChannel(boolean iscity){ isCityChannel = iscity; } @Override public void onScrollStateChanged(AbsListView view, int scrollState) { } //滑动监听 @Override public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { // TODO Auto-generated method stub if (view instanceof HeadListView) { Log.d("first", "first:" + view.getFirstVisiblePosition()); if(isCityChannel){ if(view.getFirstVisiblePosition() == 0){ isfirst = true; }else{ isfirst = false; } ((HeadListView) view).configureHeaderView(firstVisibleItem - 1); }else{ ((HeadListView) view).configureHeaderView(firstVisibleItem); } } } @Override public int getHeaderState(int position) { // TODO Auto-generated method stub int realPosition = position; if(isCityChannel){ if(isfirst){ return HEADER_GONE; } } if (realPosition < 0 || position >= getCount()) { return HEADER_GONE; } int section = getSectionForPosition(realPosition); int nextSectionPosition = getPositionForSection(section + 1); if (nextSectionPosition != -1 && realPosition == nextSectionPosition - 1) { return HEADER_PUSHED_UP; } return HEADER_VISIBLE; } @Override public void configureHeader(View header, int position, int alpha) { int realPosition = position; int section = getSectionForPosition(realPosition); String title = (String) getSections()[section]; ((TextView) header.findViewById(R.id.section_text)).setText(title); ((TextView) header.findViewById(R.id.section_day)).setText("今天"); } @Override public Object[] getSections() { // TODO Auto-generated method stub return mSections.toArray(); } @Override public int getPositionForSection(int sectionIndex) { if (sectionIndex < 0 || sectionIndex >= mPositions.size()) { return -1; } return mPositions.get(sectionIndex); } @Override public int getSectionForPosition(int position) { if (position < 0 || position >= getCount()) { return -1; } int index = Arrays.binarySearch(mPositions.toArray(), position); return index >= 0 ? index : -index - 2; } }