package com.topnews.adapter; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import com.topnews.R; import com.topnews.bean.CityEntity; import com.topnews.tool.DateTools; import com.topnews.view.HeadListView; import com.topnews.view.HeadListView.HeaderAdapter; import android.content.Context; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.AbsListView; import android.widget.BaseAdapter; import android.widget.LinearLayout; import android.widget.SectionIndexer; import android.widget.TextView; import android.widget.AbsListView.OnScrollListener; public class CityAdapter extends BaseAdapter implements SectionIndexer, HeaderAdapter, OnScrollListener { private Context mContext; private ArrayList<CityEntity> cityList; private LayoutInflater inflater = null; private List<Integer> mPositions; private List<String> mSections; public CityAdapter(Context mContext, ArrayList<CityEntity> cityList) { this.mContext = mContext; this.cityList = cityList; inflater = LayoutInflater.from(mContext); initDateHead(); } /* 获取头部head标签数据 */ private void initDateHead() { mSections = new ArrayList<String>(); mPositions = new ArrayList<Integer>(); for (int i = 0; i < cityList.size(); i++) { if (i == 0) { mSections.add(String.valueOf(cityList.get(i).getPinyin())); mPositions.add(i); continue; } if (i != cityList.size()) { if (cityList.get(i).getPinyin() != cityList.get(i - 1).getPinyin()) { mSections.add(String.valueOf(cityList.get(i).getPinyin())); mPositions.add(i); } } } } @Override public int getCount() { // TODO Auto-generated method stub return cityList == null ? 0 : cityList.size(); } @Override public CityEntity getItem(int position) { // TODO Auto-generated method stub if (cityList != null && cityList.size() != 0) { return cityList.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) { ViewHolder mHolder; View view = convertView; if (view == null) { view = inflater.inflate(R.layout.city_item_content, null); mHolder = new ViewHolder(); mHolder.city_name = (TextView) view.findViewById(R.id.city_name); //header mHolder.layout_city_section = (LinearLayout) view.findViewById(R.id.layout_city_section); mHolder.city_item_section_text = (TextView) view.findViewById(R.id.city_item_section_text); view.setTag(mHolder); } else { mHolder = (ViewHolder) view.getTag(); } CityEntity city = getItem(position); mHolder.city_name.setText(city.getName()); //头部的相关东西 int section = getSectionForPosition(position); if (getPositionForSection(section) == position) { mHolder.layout_city_section.setVisibility(View.VISIBLE); // head_title.setText(news.getDate()); mHolder.city_item_section_text.setText(mSections.get(section)); } else { mHolder.layout_city_section.setVisibility(View.GONE); } return view; } class ViewHolder { TextView city_name; //header LinearLayout layout_city_section; TextView city_item_section_text; } @Override public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { if (view instanceof HeadListView) { ((HeadListView) view).configureHeaderView(firstVisibleItem); } } @Override public int getHeaderState(int position) { // TODO Auto-generated method stub int realPosition = position; 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.city_item_section_text)).setText(title); } @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; } @Override public void onScrollStateChanged(AbsListView view, int scrollState) { // TODO Auto-generated method stub } }