Aung Thiha
Aung Thiha

Reputation: 1215

Sticky List Header Using Cursor Adapter

need help!

How do implement a sticky list header in cursor adapter.

I want a list like this

Header: December, 2014
child: day1 3000Kyats
...
child: day30 4000Kyats

Header: January 2015
child: day1 10000Kyats
.....
child: day30 4000Kyats

Header: Feburay 2015
child: day1 10000Kyats
.....
child: day28 4000Kyats

query

SELECT SUM(KeyAmount), DAY(KeyDate), MONTHNAME(MONTH(KeyDate)), YEAR(KeyDate)
FROM tbl
GROUP BY DAY(KeyDate), MONTH(KeyDate), YEAR(KeyDate)
ORDER BY YEAR(KeyDate), MONTH(KeyDate), DAY(KeyDate)

query result

Amount Day Month Year

20 29 December 2014
44 30 December 2014
25 1 January 2015

The objective is to show the sum of daily revenue with a header. Under one header, there will be a list of days of that month. It's easy with base adapter but I'm afraid that it would be slow. How do I do it using cursor adapter? is there a way?

Thanks

Upvotes: 2

Views: 1002

Answers (2)

tread
tread

Reputation: 11098

If the cursor is ordered by alphabet, you need to use cursor.moveToPisition(i);:

public class MyAdapter extends CursorAdapter implements StickListHeadersAdapter{
  public long getHeaderId(int i){
    mCursor.moveToPosition(i);
    int j = mCursor.getColumnIndex("Column_of_name");
    String name = mCursor.getString(j);
    return name.charAt(0);
  }

  public View getHeaderView(int i, View convertView, ViewGroup viewGroup){
    HeaderViewHolder holder;
    if (convertView != null){
      holder = (HeaderViewHolder) convertView.getTag();
    }
    else{
      convertView = LayoutInflater.from(mContext).inflate(R.layout.list_header_tree, viewGroup, false);
      holder = new HeaderViewHolder(convertView);
      convertView.setTag(holder);
    }

    mCursor.moveToPosition(i);
    int j = mCursor.getColumnIndex("Column_of_name");
    String name = mCursor.getString(j);
    String headerText = "" + name.charAt(0);
    holder.tvHeader.setText(headerText);
    return convertView;
  }

  //Using butterknife so HeaderViewHolder:
   static class HeaderViewHolder {
        @InjectView(R.id.tvHeader) TextView tvHeader;

        public HeaderViewHolder(View view) {
            ButterKnife.inject(this, view);
        }
    }
}

Upvotes: 1

Swan
Swan

Reputation: 906

If you aren't using RecyclerView, use this library and override getHeaderId(int position) with your months data coming out from cursor adapter.

I think it would solve your needs.

Upvotes: 0

Related Questions