0

I have setup a list view I get some data from the web and then call my method handleData to use the data and put it in my list view but even though I have retrieved data and handleData is called I getView is not called. Here is my code I have put I bunch of log statements to see how far it gets.

    private void handleData( LinkedHashMap<String, List<String>> data) {

        Log.i(TAG, "handle data called");


        ArrayList<String> myKeys = new ArrayList<>(data.keySet());
        String[] desiredOrder = {"Entrée", "Entree"};

        int putPosition = 0;

        for (String currentString : desiredOrder) {
            for (int j = 0; j < myKeys.size(); j++) {
                if (myKeys.get(j).equals(currentString)) {
                    myKeys.remove(j);
                    myKeys.add(putPosition, currentString);
                    putPosition++;
                }

            }
        }

        LinkedHashMap<String, List<String>> linkedHashMap = new LinkedHashMap<String, List<String>>();


        for (int i = 0 ; i < myKeys.size() ; i++) {
            linkedHashMap.put(myKeys.get(i), data.get(myKeys.get(i)));

        }


        mLinkedHashMap = linkedHashMap;

        Log.i(TAG, mLinkedHashMap + "");


        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) {

                Log.i(TAG,  "GOT HERE");

                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();
            }
        });


    }

    public static class ViewHolder {
        public TextView textView;
    }

And I don't see GOT HEREm but I see my data filled with data and that handle data is not called?

Not sure why this is happening I have this all in a TabHost and if I set it like this

myTabHost.setCurrentTab(1);

or this

myTabHost.setCurrentTab(2);

I see my data but when it is not there or set to this

myTabHost.setCurrentTab(0);

I see no data I and GOT HERE isn't called I am very confused.

Here is the section Adapter

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;
}

}

Thanks for then help in advance.

iqueqiorio
  • 1,149
  • 2
  • 35
  • 78

2 Answers2

0

If you redefined the getView method like this:

@Override
/**
 * Dispatched to call getRowView or getSectionHeaderView
 */
public final View getView(int position, View convertView, ViewGroup parent) {
    Log.i(TAG,  "GETVIEW \o/");
    int section = getSection(position);
    if (isSectionHeader(position)) {
        if (hasSectionHeaderView(section)) {
            return getSectionHeaderView(section, convertView, parent);
        }
        return null;
    }
    return getRowView(section, getRowInSection(position), convertView, parent);
}

getRowView should be called.

Groco
  • 1,301
  • 15
  • 19
  • when I add this I get compile error `getView cannot override getView in Section Adapter` – iqueqiorio Dec 19 '14 at 22:32
  • oups I didn't see that getView was defined in the SectionAdapter. It's a final method. – Groco Dec 20 '14 at 00:31
  • I think the problem might be with my tab host if you wouldn't mind take a look at this problem I am going to post bounty on it when I can in 12 hours http://stackoverflow.com/questions/27559989/listview-with-three-options-on-same-activity – iqueqiorio Dec 20 '14 at 06:10
0

I had meet once this situation when I used listView in fragment.

Make sure your fragment is exactly the same fragment. It means that the fragment stack should be always the same -- no new Fragment.

you can use FragmentTransation.hide().show().commit() to switch fragment

If you don't do so, the new Fragment will block the getView().

But sorry, I don't know why...

Philo_z
  • 31
  • 1