package com.anthony.citypicker.adapter; import android.content.Context; import android.text.TextUtils; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.BaseAdapter; import android.widget.TextView; import com.anthony.citypicker.R; import com.anthony.citypicker.model.City; import com.anthony.citypicker.model.LocateState; import com.anthony.citypicker.utils.PinyinUtils; import com.anthony.citypicker.view.WrapHeightGridView; import java.util.ArrayList; import java.util.HashMap; import java.util.List; public class CityListAdapter extends BaseAdapter { private static final int VIEW_TYPE_COUNT = 3; private Context mContext; private LayoutInflater inflater; private List<City> mCities; private HashMap<String, Integer> letterIndexes; private String[] sections; private OnCityClickListener onCityClickListener; private int locateState = LocateState.LOCATING; private String locatedCity; public CityListAdapter(Context mContext, List<City> mCities) { this.mContext = mContext; this.mCities = mCities; this.inflater = LayoutInflater.from(mContext); if (mCities == null){ mCities = new ArrayList<>(); } mCities.add(0, new City("定位", "0")); mCities.add(1, new City("热门", "1")); int size = mCities.size(); letterIndexes = new HashMap<>(); sections = new String[size]; for (int index = 0; index < size; index++){ //当前城市拼音首字母 String currentLetter = PinyinUtils.getFirstLetter(mCities.get(index).getPinyin()); //上个首字母,如果不存在设为"" String previousLetter = index >= 1 ? PinyinUtils.getFirstLetter(mCities.get(index - 1).getPinyin()) : ""; if (!TextUtils.equals(currentLetter, previousLetter)){ letterIndexes.put(currentLetter, index); sections[index] = currentLetter; } } } /** * 更新定位状态 * @param state */ public void updateLocateState(int state, String city){ this.locateState = state; this.locatedCity = city; notifyDataSetChanged(); } /** * 获取字母索引的位置 * @param letter * @return */ public int getLetterPosition(String letter){ Integer integer = letterIndexes.get(letter); return integer == null ? -1 : integer; } @Override public int getViewTypeCount() { return VIEW_TYPE_COUNT; } @Override public int getItemViewType(int position) { return position < VIEW_TYPE_COUNT - 1 ? position : VIEW_TYPE_COUNT - 1; } @Override public int getCount() { return mCities == null ? 0: mCities.size(); } @Override public City getItem(int position) { return mCities == null ? null : mCities.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(final int position, View view, ViewGroup parent) { CityViewHolder holder; int viewType = getItemViewType(position); switch (viewType){ case 0: //定位 view = inflater.inflate(R.layout.view_locate_city, parent, false); ViewGroup container = (ViewGroup) view.findViewById(R.id.layout_locate); TextView state = (TextView) view.findViewById(R.id.tv_located_city); switch (locateState){ case LocateState.LOCATING: state.setText(mContext.getString(R.string.locating)); break; case LocateState.FAILED: state.setText(R.string.located_failed); break; case LocateState.SUCCESS: state.setText(locatedCity); break; } container.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (locateState == LocateState.FAILED){ //重新定位 if (onCityClickListener != null){ onCityClickListener.onLocateClick(); } }else if (locateState == LocateState.SUCCESS){ //返回定位城市 if (onCityClickListener != null){ onCityClickListener.onCityClick(locatedCity); } } } }); break; case 1: //热门 view = inflater.inflate(R.layout.view_hot_city, parent, false); WrapHeightGridView gridView = (WrapHeightGridView) view.findViewById(R.id.gridview_hot_city); final HotCityGridAdapter hotCityGridAdapter = new HotCityGridAdapter(mContext); gridView.setAdapter(hotCityGridAdapter); gridView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { if (onCityClickListener != null){ onCityClickListener.onCityClick(hotCityGridAdapter.getItem(position)); } } }); break; case 2: //所有 if (view == null){ view = inflater.inflate(R.layout.item_city_listview, parent, false); holder = new CityViewHolder(); holder.letter = (TextView) view.findViewById(R.id.tv_item_city_listview_letter); holder.name = (TextView) view.findViewById(R.id.tv_item_city_listview_name); view.setTag(holder); }else{ holder = (CityViewHolder) view.getTag(); } if (position >= 1){ final String city = mCities.get(position).getName(); holder.name.setText(city); String currentLetter = PinyinUtils.getFirstLetter(mCities.get(position).getPinyin()); String previousLetter = position >= 1 ? PinyinUtils.getFirstLetter(mCities.get(position - 1).getPinyin()) : ""; if (!TextUtils.equals(currentLetter, previousLetter)){ holder.letter.setVisibility(View.VISIBLE); holder.letter.setText(currentLetter); }else{ holder.letter.setVisibility(View.GONE); } holder.name.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (onCityClickListener != null){ onCityClickListener.onCityClick(city); } } }); } break; } return view; } public static class CityViewHolder{ TextView letter; TextView name; } public void setOnCityClickListener(OnCityClickListener listener){ this.onCityClickListener = listener; } public interface OnCityClickListener{ void onCityClick(String name); void onLocateClick(); } }