package test.pinnedheaderlistview.demo; import java.util.List; import test.pinnedheaderlistview.demo.PinnedHeaderListView.PinnedHeaderAdapter; import test.pinnedheaderlistview.demo.PinnedHeaderListViewActivity.ItemEntity; import android.content.Context; import android.text.TextUtils; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.AbsListView; import android.widget.AbsListView.OnScrollListener; import android.widget.BaseAdapter; import android.widget.ImageView; import android.widget.TextView; public class CustomAdapter extends BaseAdapter implements OnScrollListener , PinnedHeaderAdapter { // =========================================================== // Constants // =========================================================== private static final String TAG = CustomAdapter.class.getSimpleName(); // =========================================================== // Fields // =========================================================== private Context mContext; private List<ItemEntity> mData; private LayoutInflater mLayoutInflater; // =========================================================== // Constructors // =========================================================== public CustomAdapter(Context pContext, List<ItemEntity> pData) { mContext = pContext; mData = pData; mLayoutInflater = LayoutInflater.from(mContext); } // =========================================================== // Getter & Setter // =========================================================== // =========================================================== // Methods for/from SuperClass/Interfaces // =========================================================== @Override public View getView(int position, View convertView, ViewGroup parent) { // �������Ż�ViewHolder ViewHolder viewHolder = null; if (null == convertView) { convertView = mLayoutInflater.inflate(R.layout.listview_item, null); viewHolder = new ViewHolder(); viewHolder.title = (TextView) convertView.findViewById(R.id.title); viewHolder.content = (TextView) convertView.findViewById(R.id.content); viewHolder.contentIcon = (ImageView) convertView.findViewById(R.id.content_icon); convertView.setTag(viewHolder); } else { viewHolder = (ViewHolder) convertView.getTag(); } // ��ȡ���� ItemEntity itemEntity = (ItemEntity) getItem(position); viewHolder.content.setText(itemEntity.getContent()); viewHolder.contentIcon.setImageResource(R.drawable.ic_launcher); if ( needTitle(position) ) { // ��ʾ���Ⲣ�������� viewHolder.title.setText(itemEntity.getTitle()); viewHolder.title.setVisibility(View.VISIBLE); } else { // ���������ر��� viewHolder.title.setVisibility(View.GONE); } return convertView; } @Override public int getCount() { if (null != mData) { return mData.size(); } return 0; } @Override public Object getItem(int position) { if (null != mData && position < getCount()) { return mData.get(position); } return null; } @Override public long getItemId(int position) { return position; } @Override public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { if ( view instanceof PinnedHeaderListView) { ((PinnedHeaderListView) view).controlPinnedHeader(firstVisibleItem); } } @Override public void onScrollStateChanged(AbsListView view, int scrollState) { } @Override public int getPinnedHeaderState(int position) { if (getCount() == 0 || position < 0) { return PinnedHeaderAdapter.PINNED_HEADER_GONE; } if (isMove(position) == true) { return PinnedHeaderAdapter.PINNED_HEADER_PUSHED_UP; } return PinnedHeaderAdapter.PINNED_HEADER_VISIBLE; } @Override public void configurePinnedHeader(View headerView, int position, int alpaha) { // ���ñ�������� ItemEntity itemEntity = (ItemEntity) getItem(position); String headerValue = itemEntity.getTitle(); Log.e(TAG, "header = " + headerValue); if (!TextUtils.isEmpty(headerValue)) { TextView headerTextView = (TextView) headerView.findViewById(R.id.header); headerTextView.setText( headerValue ); } } // =========================================================== // Methods // =========================================================== /** * �ж��Ƿ���Ҫ��ʾ���� * * @param position * @return */ private boolean needTitle(int position) { // ��һ���϶��Ƿ��� if (position == 0) { return true; } // �쳣���� if (position < 0) { return false; } // ��ǰ // ��һ�� ItemEntity currentEntity = (ItemEntity) getItem(position); ItemEntity previousEntity = (ItemEntity) getItem(position - 1); if (null == currentEntity || null == previousEntity) { return false; } String currentTitle = currentEntity.getTitle(); String previousTitle = previousEntity.getTitle(); if (null == previousTitle || null == currentTitle) { return false; } // ��ǰitem����������һ��item��������ͬ�����ʾ��item���ڲ�ͬ���� if (currentTitle.equals(previousTitle)) { return false; } return true; } private boolean isMove(int position) { // ��ȡ��ǰ����һ�� ItemEntity currentEntity = (ItemEntity) getItem(position); ItemEntity nextEntity = (ItemEntity) getItem(position + 1); if (null == currentEntity || null == nextEntity) { return false; } // ��ȡ����header���� String currentTitle = currentEntity.getTitle(); String nextTitle = nextEntity.getTitle(); if (null == currentTitle || null == nextTitle) { return false; } // ��ǰ��������һ��header����ǰ����Ҫ�ƶ��� if (!currentTitle.equals(nextTitle)) { return true; } return false; } // =========================================================== // Inner and Anonymous Classes // =========================================================== private class ViewHolder { TextView title; TextView content; ImageView contentIcon; } }