Created
December 22, 2014 18:53
-
-
Save spennyf/3241dd694af464c7e576 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| <?xml version="1.0" encoding="utf-8"?> | |
| <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" | |
| android:layout_width="match_parent" android:layout_height="match_parent"> | |
| <com.spencerfontein.ueat.HeaderListView | |
| android:id="@+id/HeaderListView_MainActivity" | |
| android:layout_width="match_parent" | |
| android:layout_height="match_parent" | |
| android:listSelector="@android:color/transparent" /> | |
| </LinearLayout> |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| //This is my custom list view and adapter | |
| mHeaderListView = (HeaderListView)findViewById(R.id.HeaderListView_MainActivity); | |
| mHeaderListView.setAdapter(new SectionAdapter() { | |
| @Override | |
| public int numberOfSections() { | |
| return mLinkedHashMap.keySet().toArray().length; | |
| } | |
| @Override | |
| public int numberOfRows(int section) { | |
| if(section >=0){ | |
| String sectionKey = (String)mLinkedHashMap.keySet().toArray()[section]; | |
| int numOfRows = mLinkedHashMap.get(sectionKey).size(); | |
| return numOfRows; | |
| }else{ | |
| return 0; | |
| } | |
| } | |
| @Override | |
| public boolean hasSectionHeaderView(int section) { | |
| return true; | |
| } | |
| @Override | |
| public View getRowView(int section, int row, View convertView, ViewGroup parent) { | |
| ViewHolder holder = null; | |
| if (convertView == null) { | |
| holder = new ViewHolder(); | |
| LayoutInflater mLayoutInflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE); | |
| convertView = mLayoutInflater.inflate(R.layout.item_cell_view, parent, false); | |
| holder.textView = (TextView)convertView.findViewById(R.id.text); | |
| convertView.setTag(holder); | |
| } else { | |
| holder = (ViewHolder)convertView.getTag(); | |
| } | |
| String sectionKey = (String)mLinkedHashMap.keySet().toArray()[section]; | |
| holder.textView.setText(mLinkedHashMap.get(sectionKey).get(row)); | |
| return convertView; | |
| } | |
| @Override | |
| public Object getRowItem(int section, int row) { | |
| // return ((String[])mLinkedHashMap.keySet().toArray()[section])[row]; | |
| return mLinkedHashMap.keySet().toArray()[section]; | |
| } | |
| @Override | |
| public View getSectionHeaderView(int section, View convertView, | |
| ViewGroup parent) { | |
| ViewHolder holder = null; | |
| LayoutInflater mLayoutInflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE); | |
| if (convertView == null) { | |
| holder = new ViewHolder(); | |
| convertView = mLayoutInflater.inflate(R.layout.header_cell_view, parent, false); | |
| holder.textView = (TextView)convertView.findViewById(R.id.textSeparator); | |
| convertView.setBackgroundColor((colorBar)); | |
| convertView.setTag(holder); | |
| } else { | |
| holder = (ViewHolder)convertView.getTag(); | |
| } | |
| holder.textView.setText((String)(mLinkedHashMap.keySet().toArray()[section])); | |
| return convertView; | |
| } | |
| @Override | |
| public void onRowItemClick(AdapterView<?> parent, View view, int section, int row, long id) { | |
| super.onRowItemClick(parent, view, section, row, id); | |
| String sectionName = getRowItem(section, row).toString(); | |
| String itemText = mLinkedHashMap.get(sectionName).get(row); | |
| Toast.makeText(DiningItemsActivity.this, "Section " + section + " Row " + row + "Name: " + itemText, | |
| Toast.LENGTH_SHORT).show(); | |
| } | |
| }); |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| package com.spencerfontein.ueat; | |
| import android.view.View; | |
| import android.view.ViewGroup; | |
| import android.widget.AdapterView; | |
| import android.widget.AdapterView.OnItemClickListener; | |
| import android.widget.BaseAdapter; | |
| public abstract class SectionAdapter extends BaseAdapter implements OnItemClickListener { | |
| private int mCount = -1; | |
| public abstract int numberOfSections(); | |
| public abstract int numberOfRows(int section); | |
| public abstract View getRowView(int section, int row, View convertView, ViewGroup parent); | |
| public abstract Object getRowItem(int section, int row); | |
| public boolean hasSectionHeaderView(int section) { | |
| return false; | |
| } | |
| public View getSectionHeaderView(int section, View convertView, ViewGroup parent) { | |
| return null; | |
| } | |
| public Object getSectionHeaderItem(int section) { | |
| return null; | |
| } | |
| public int getRowViewTypeCount() { | |
| return 1; | |
| } | |
| public int getSectionHeaderViewTypeCount() { | |
| return 1; | |
| } | |
| /** | |
| * Must return a value between 0 and getRowViewTypeCount() (excluded) | |
| */ | |
| public int getRowItemViewType(int section, int row) { | |
| return 0; | |
| } | |
| /** | |
| * Must return a value between 0 and getSectionHeaderViewTypeCount() (excluded, if > 0) | |
| */ | |
| public int getSectionHeaderItemViewType(int section) { | |
| return 0; | |
| } | |
| @Override | |
| /** | |
| * Dispatched to call onRowItemClick | |
| */ | |
| public final void onItemClick(AdapterView<?> parent, View view, int position, long id) { | |
| onRowItemClick(parent, view, getSection(position), getRowInSection(position), id); | |
| } | |
| public void onRowItemClick(AdapterView<?> parent, View view, int section, int row, long id) { | |
| } | |
| @Override | |
| /** | |
| * Counts the amount of cells = headers + rows | |
| */ | |
| public final int getCount() { | |
| if (mCount < 0) { | |
| mCount = numberOfCellsBeforeSection(numberOfSections()); | |
| } | |
| return mCount; | |
| } | |
| @Override | |
| public boolean isEmpty() { | |
| return getCount() == 0; | |
| } | |
| @Override | |
| /** | |
| * Dispatched to call getRowItem or getSectionHeaderItem | |
| */ | |
| public final Object getItem(int position) { | |
| int section = getSection(position); | |
| if (isSectionHeader(position)) { | |
| if (hasSectionHeaderView(section)) { | |
| return getSectionHeaderItem(section); | |
| } | |
| return null; | |
| } | |
| return getRowItem(section, getRowInSection(position)); | |
| } | |
| @Override | |
| public long getItemId(int position) { | |
| return position; | |
| } | |
| @Override | |
| /** | |
| * Dispatched to call getRowView or getSectionHeaderView | |
| */ | |
| public final View getView(int position, View convertView, ViewGroup parent) { | |
| int section = getSection(position); | |
| if (isSectionHeader(position)) { | |
| if (hasSectionHeaderView(section)) { | |
| return getSectionHeaderView(section, convertView, parent); | |
| } | |
| return null; | |
| } | |
| return getRowView(section, getRowInSection(position), convertView, parent); | |
| } | |
| /** | |
| * Returns the section number of the indicated cell | |
| */ | |
| protected int getSection(int position) { | |
| int section = 0; | |
| int cellCounter = 0; | |
| while (cellCounter <= position && section <= numberOfSections()) { | |
| cellCounter += numberOfCellsInSection(section); | |
| section++; | |
| } | |
| return section - 1; | |
| } | |
| /** | |
| * Returns the row index of the indicated cell Should not be call with | |
| * positions directing to section headers | |
| */ | |
| protected int getRowInSection(int position) { | |
| int section = getSection(position); | |
| int row = position - numberOfCellsBeforeSection(section); | |
| if (hasSectionHeaderView(section)) { | |
| return row - 1; | |
| } else { | |
| return row; | |
| } | |
| } | |
| /** | |
| * Returns true if the cell at this index is a section header | |
| */ | |
| protected boolean isSectionHeader(int position) { | |
| int section = getSection(position); | |
| return hasSectionHeaderView(section) && numberOfCellsBeforeSection(section) == position; | |
| } | |
| /** | |
| * Returns the number of cells (= headers + rows) before the indicated | |
| * section | |
| */ | |
| protected int numberOfCellsBeforeSection(int section) { | |
| int count = 0; | |
| for (int i = 0; i < Math.min(numberOfSections(), section); i++) { | |
| count += numberOfCellsInSection(i); | |
| } | |
| return count; | |
| } | |
| private int numberOfCellsInSection(int section) { | |
| return numberOfRows(section) + (hasSectionHeaderView(section) ? 1 : 0); | |
| } | |
| @Override | |
| public void notifyDataSetChanged() { | |
| mCount = numberOfCellsBeforeSection(numberOfSections()); | |
| super.notifyDataSetChanged(); | |
| } | |
| @Override | |
| public void notifyDataSetInvalidated() { | |
| mCount = numberOfCellsBeforeSection(numberOfSections()); | |
| super.notifyDataSetInvalidated(); | |
| } | |
| @Override | |
| /** | |
| * Dispatched to call getRowItemViewType or getSectionHeaderItemViewType | |
| */ | |
| public final int getItemViewType(int position) { | |
| int section = getSection(position); | |
| if (isSectionHeader(position)) { | |
| return getRowViewTypeCount() + getSectionHeaderItemViewType(section); | |
| } else { | |
| return getRowItemViewType(section, getRowInSection(position)); | |
| } | |
| } | |
| @Override | |
| /** | |
| * Dispatched to call getRowViewTypeCount and getSectionHeaderViewTypeCount | |
| */ | |
| public final int getViewTypeCount() { | |
| return getRowViewTypeCount() + getSectionHeaderViewTypeCount(); | |
| } | |
| @Override | |
| /** | |
| * By default, disables section headers | |
| */ | |
| public boolean isEnabled(int position) { | |
| return (disableHeaders() || !isSectionHeader(position)) && isRowEnabled(getSection(position), getRowInSection(position)); | |
| } | |
| public boolean disableHeaders() { | |
| return false; | |
| } | |
| public boolean isRowEnabled(int section, int row) { | |
| return true; | |
| } | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment