如何根据日期对 RecyclerView 中的项目进行排序

在此处输入图片说明

这就是我的屏幕应该是什么样子。

我添加了这个库https://github.com/ShamylZakariya/StickyHeaders并尝试以类似的方式做到这一点。

我的模型看起来像这样:

公共类交易{

private int id;
private Date createdDate;
private String description;
private int amount;
private float newCredits;
}

public class Transactions {

private int totalCount;
private List<Transaction> transactions = new ArrayList<>();
}

所以在我获取所有交易后,我在适配器中设置了数据..这就是我的适配器的样子:

public class WalletAdapter extends SectioningAdapter {

private static final boolean USE_DEBUG_APPEARANCE = false;

private Transactions transactions;
private List<Section> sections = new ArrayList<>();

public WalletAdapter() {
}

private class Section {
    String alpha;
    Transactions transactions;
}

public Transactions getTransactions() {
    return transactions;
}

public void setTransactions(Transactions transactions) {
    this.transactions = transactions;
    sections.clear();

    char alpha = 0;

    Section currentSection = null;
    for (Transaction transaction : transactions.getTransactions()) {
        String date = parseDate(transaction.getCreatedDate());
        if (date.charAt(0) != alpha) {
            if (currentSection != null) {
                sections.add(currentSection);
            }

            currentSection = new Section();
            alpha = date.charAt(0);
            currentSection.alpha = String.valueOf(alpha);
        }

        if (currentSection != null) {
            currentSection.transactions = this.transactions;
        }
    }

    sections.add(currentSection);
    notifyAllSectionsDataSetChanged();
}

private String parseDate(Date date) {
    DateFormat df = new SimpleDateFormat("dd.MM.yyyy", Locale.getDefault());
    String formattedDate = "";
    formattedDate = df.format(date);
    return formattedDate;
}

@Override
public int getNumberOfSections() {
    return sections.size();
}

@Override
public boolean doesSectionHaveHeader(int sectionIndex) {
    return true;
}

@Override
public boolean doesSectionHaveFooter(int sectionIndex) {
    return false;
}

@Override
public int getNumberOfItemsInSection(int sectionIndex) {
    return sections.get(sectionIndex).transactions.getTransactions().size();
}

@Override
public ItemViewHolder onCreateItemViewHolder(ViewGroup parent, int itemUserType) {
    LayoutInflater inflater = LayoutInflater.from(parent.getContext());
    View v = inflater.inflate(R.layout.wallet_item, parent, false);
    return new ItemViewHolder(v);
}

@Override
public HeaderViewHolder onCreateHeaderViewHolder(ViewGroup parent, int headerUserType) {
    LayoutInflater inflater = LayoutInflater.from(parent.getContext());
    View v = inflater.inflate(R.layout.wallet_header, parent, false);
    return new HeaderViewHolder(v);
}

@Override
public void onBindItemViewHolder(SectioningAdapter.ItemViewHolder viewHolder, int sectionIndex, int itemIndex, int itemType) {
    Section section = sections.get(sectionIndex);
    ItemViewHolder holder = (ItemViewHolder) viewHolder;
    Transaction transaction = section.transactions.getTransactions().get(itemIndex);
    holder.description.setText(transaction.getDescription());
    holder.ammount.setText(String.valueOf(transaction.getAmount()));
    holder.time.setText(parseDate(transaction.getCreatedDate()));
    holder.total.setText(String.valueOf(transaction.getNewCredits()));

}

@Override
public void onBindHeaderViewHolder(SectioningAdapter.HeaderViewHolder viewHolder, int sectionIndex, int headerType) {
    Section s = sections.get(sectionIndex);
    HeaderViewHolder hvh = (HeaderViewHolder) viewHolder;
    Transaction transaction = s.transactions.getTransactions().get(sectionIndex);
    if (USE_DEBUG_APPEARANCE) {
        hvh.itemView.setBackgroundColor(0x55ffffff);
        hvh.dateHeader.setText(pad(sectionIndex * 2) + s.alpha);
    } else {
        hvh.dateHeader.setText(parseDate(transaction.getCreatedDate()));
    }
}

private String pad(int spaces) {
    StringBuilder b = new StringBuilder();
    for (int i = 0; i < spaces; i++) {
        b.append(' ');
    }
    return b.toString();
}


public class HeaderViewHolder extends SectioningAdapter.HeaderViewHolder {

    TextView dateHeader;

    public HeaderViewHolder(View itemView) {
        super(itemView);
        dateHeader = (TextView) itemView.findViewById(R.id.date);
    }
}

public class ItemViewHolder extends SectioningAdapter.ItemViewHolder {

    TextView description;
    TextView time;
    TextView ammount;
    TextView total;

    public ItemViewHolder(View itemView) {
        super(itemView);
        description = (TextView) itemView.findViewById(R.id.description);
        time = (TextView) itemView.findViewById(R.id.time);
        ammount = (TextView) itemView.findViewById(R.id.ammount);
        total = (TextView) itemView.findViewById(R.id.new_credits);
    }
}

}

因此,如果我这样做,它会按日期排序和创建标题/部分,但它将所有交易放在所有部分中,而不是在匹配日期内...

尼克·蒂托夫

如果项目应该有标题或没有标题,这似乎应该处理。就像,如果它是具有此日期的第一项,则返回 true,否则返回 false。

@Override
public boolean doesSectionHaveHeader(int sectionIndex) {
    return true;
}

编辑

您可以在设置之前制作过滤列表。例如对于带有姓名字母标题的地址簿:

public class AddressBookDemoAdapter extends SectioningAdapter {

    Locale locale = Locale.getDefault();
    static final boolean USE_DEBUG_APPEARANCE = false;

    private class Section {
        String alpha;
        ArrayList<Person> people = new ArrayList<>();
    }

    public class ItemViewHolder extends SectioningAdapter.ItemViewHolder {
        TextView personNameTextView;

        public ItemViewHolder(View itemView) {
            super(itemView);
            personNameTextView = (TextView) itemView.findViewById(R.id.personNameTextView);
        }
    }

    public class HeaderViewHolder extends SectioningAdapter.HeaderViewHolder {
        TextView titleTextView;

        public HeaderViewHolder(View itemView) {
            super(itemView);
            titleTextView = (TextView) itemView.findViewById(R.id.titleTextView);
        }
    }


    List<Person> people;
    ArrayList<Section> sections = new ArrayList<>();

    public AddressBookDemoAdapter() {
    }

    public List<Person> getPeople() {
        return people;
    }

    public void setPeople(List<Person> people) {
        this.people = people;
        sections.clear();

        // sort people into buckets by the first letter of last name
        char alpha = 0;
        Section currentSection = null;
        for (Person person : people) {
            if (person.name.last.charAt(0) != alpha) {
                if (currentSection != null) {
                    sections.add(currentSection);
                }

                currentSection = new Section();
                alpha = person.name.last.charAt(0);
                currentSection.alpha = String.valueOf(alpha);
            }

            if (currentSection != null) {
                currentSection.people.add(person);
            }
        }

        sections.add(currentSection);
        notifyAllSectionsDataSetChanged();
    }

    @Override
    public int getNumberOfSections() {
        return sections.size();
    }

    @Override
    public int getNumberOfItemsInSection(int sectionIndex) {
        return sections.get(sectionIndex).people.size();
    }

    @Override
    public boolean doesSectionHaveHeader(int sectionIndex) {
        return true;
    }

    @Override
    public boolean doesSectionHaveFooter(int sectionIndex) {
        return false;
    }

    @Override
    public ItemViewHolder onCreateItemViewHolder(ViewGroup parent, int itemType) {
        LayoutInflater inflater = LayoutInflater.from(parent.getContext());
        View v = inflater.inflate(R.layout.list_item_addressbook_person, parent, false);
        return new ItemViewHolder(v);
    }

    @Override
    public HeaderViewHolder onCreateHeaderViewHolder(ViewGroup parent, int headerType) {
        LayoutInflater inflater = LayoutInflater.from(parent.getContext());
        View v = inflater.inflate(R.layout.list_item_addressbook_header, parent, false);
        return new HeaderViewHolder(v);
    }

    @SuppressLint("SetTextI18n")
    @Override
    public void onBindItemViewHolder(SectioningAdapter.ItemViewHolder viewHolder, int sectionIndex, int itemIndex, int itemType) {
        Section s = sections.get(sectionIndex);
        ItemViewHolder ivh = (ItemViewHolder) viewHolder;
        Person person = s.people.get(itemIndex);
        ivh.personNameTextView.setText(capitalize(person.name.last) + ", " + capitalize(person.name.first));
    }

    @SuppressLint("SetTextI18n")
    @Override
    public void onBindHeaderViewHolder(SectioningAdapter.HeaderViewHolder viewHolder, int sectionIndex, int headerType) {
        Section s = sections.get(sectionIndex);
        HeaderViewHolder hvh = (HeaderViewHolder) viewHolder;

        if (USE_DEBUG_APPEARANCE) {
            hvh.itemView.setBackgroundColor(0x55ffffff);
            hvh.titleTextView.setText(pad(sectionIndex * 2) + s.alpha);
        } else {
            hvh.titleTextView.setText(s.alpha);
        }
    }

    private String capitalize(String s) {
        if (s != null && s.length() > 0) {
            return s.substring(0,1).toUpperCase(locale) + s.substring(1);
        }

        return "";
    }

    private String pad(int spaces) {
        StringBuilder b = new StringBuilder();
        for (int i = 0; i < spaces; i++) {
            b.append(' ');
        }
        return b.toString();
    }

}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在Android中对RecyclerView项目进行排序

如何对recyclerView进行排序

如何按关键字对 RecyclerView 项目进行排序?

如何对每个新项目的 RecyclerView 进行排序?

在 NSTableView 中,如何根据项目的选择对项目进行排序?

如何在RecyclerView中对数据进行排序

根据 Firebase 的最新日期将数据排序到 RecyclerView

如何根据日期对wordpress中的帖子进行分组和排序?

如何根据 Python 中的日期时间对字典列表进行排序

如何根据日期对SQL Server中的多列进行排序

如何在ListView中对项目进行排序?

如何根据日期对HashMap进行排序?

如何根据日期对 FASTA 文件进行排序?

如何按数据对recyclerview进行排序

如何从Recyclerview中删除项目

如何根据条件在recyclerView中隐藏子项?

如何确认recyclerview项目列表中的选定项目并在布局上进行选择

如何声明日期类型的变量并根据日期进行排序?

如何根据日期对日期进行分组?

根据多个条件对数组中的项目进行排序

如何隐藏 RecyclerView 项目

如何从Android中的recyclerView中删除项目

如何使卧式recyclerview项目显示在recyclerview的底部

如何在 Angular 中对列表中的项目进行排序?

如何根据 Textview 内容长度调整 Recyclerview 项目高度

如何根据布尔参数recyclerView Item并只显示真实的项目?

如何从RecyclerView中延迟删除项目

如何从使用diffutil的recyclerview中删除项目?

如何清除recyclerview中突出显示的项目?