emilsjolander / StickyListHeaders

An android library for section headers that stick to the top
Apache License 2.0
5.51k stars 1.52k forks source link

How to return the headerId? #494

Closed DubheBroken closed 5 years ago

DubheBroken commented 5 years ago

In my project, there is a Date type of data in the list. I want the header to be distinguished by year and month. But the result is that different years and months are under the same header.

↓My current result

7e2909fd31ce5e84a0ebe8e5d7d3b187

↓The result I want

_20181115120655

This is my Adapter

I think my getHeader method seems to return the wrong parameter. ` public class HistoryAdapter extends BaseAdapter implements StickyListHeadersAdapter {

private Context context;
private List<HistoryBills> list;
private LayoutInflater inflater;

public HistoryAdapter(Context context, List<HistoryBills> list) {
    inflater = LayoutInflater.from(context);
    this.context = context;
    this.list = list;
}

@Override
public int getCount() {
    return list.size();
}

@Override
public Object getItem(int position) {
    return list.get(position);
}

@Override
public long getItemId(int position) {
    return position;
}

@SuppressLint("SetTextI18n")
@Override
public View getView(int position, View view, ViewGroup parent) {
    if(view ==null) {
        ViewHolder holder;
        view = inflater.inflate(R.layout.bill_item_item, parent, false);
        holder = new ViewHolder(view);
        Glide.with(context).load(list.get(position).getSellerImage()).into(holder.imgSellterBillItemItem);
        holder.textTypeBillItemItem.setText(list.get(position).getBillType());
        holder.textMoneyBillItemItem.setText(Double.toString(list.get(position).getBillMoney()));
        SimpleDateFormat sdf = new SimpleDateFormat("MM-dd");
        holder.textTimeBillItemItem.setText(sdf.format(list.get(position).getOrderOverTime()));
        holder.textBillNumberItemItemTag.setText(Long.toString(list.get(position).getTransactionNumber()));
    }
    return view;
}

@Override
public View getHeaderView(int position, View view, ViewGroup parent) {
    HeaderViewHolder headerViewHolder = null;
    if (view == null) {
        view = inflater.inflate(R.layout.bill_item_header, parent, false);
        headerViewHolder = new HeaderViewHolder(view);
        String headerText = null;
        try {
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM");
            headerText = "" + sdf.format(list.get(position).getOrderOverTime());
            headerViewHolder.mTextYearMonthBillItem.setText(headerText);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    return view;
}

@Override
public long getHeaderId(int position) {
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM");
    String headerText = "" + sdf.format(list.get(position).getOrderOverTime());
    return headerText.subSequence(0, 6).charAt(0);
}

class HeaderViewHolder {
    View view;
    TextView mTextYearMonthBillItem;

    HeaderViewHolder(View view) {
        this.view = view;
        this.mTextYearMonthBillItem = view.findViewById(R.id.text_year_month_bill_item);
    }
}

class ViewHolder {
    View view;
    ImageView imgSellterBillItemItem;
    TextView textTypeBillItemItem;
    TextView textMoneyBillItemItem;
    TextView textTimeBillItemItem;
    TextView textBillNumberItemItemTag;

    ViewHolder(View view) {
        this.view = view;
        this.imgSellterBillItemItem = view.findViewById(R.id.img_sellter_bill_item_item);
        this.textTypeBillItemItem = view.findViewById(R.id.text_type_bill_item_item);
        this.textMoneyBillItemItem = view.findViewById(R.id.text_money_bill_item_item);
        this.textTimeBillItemItem = view.findViewById(R.id.text_time_bill_item_item);
        this.textBillNumberItemItemTag = view.findViewById(R.id.text_bill_number_item_item_tag);
    }
}

}`

DubheBroken commented 5 years ago

I git it. @Override public long getHeaderId(int position) { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM"); String headerText = "" + sdf.format(list.get(position).getOrderOverTime()); return headerText.subSequence(0, 7).charAt(6); }