自定义Sticky标头如何在Android Listviews中工作?

时间:2015-02-19 19:10:02

标签: android listview android-listview

我的问题不是在Android中ListView添加Sticky标头,我想问一下它是如何工作的?

我知道github上有很多可用的粘贴头库,

http://applidium.github.io/HeaderListView/#how_to_use

https://github.com/emilsjolander/StickyListHeaders

我知道android中的ListView的视图被回收,这意味着只有足够的视图才能填充屏幕+一个用于前一个,一个用于下一个,这些当我们向上和向下滚动时,视图被回收并重新使用。

但为什么有人需要编写一个完整的库只是为了在List视图中添加一个简单的Section Header为什么不能更简单地完成它,这些section header如何工作?

它们是否与List项目的视图一起回收?

不应该有一种方法可以简单地说某些视图必须始终保持在最顶层,只有在我们明确告诉他们更新而不使用任何第三方库时才会更新?

1 个答案:

答案 0 :(得分:1)

嗯,您提供的链接中提供了整个库的代码。来吧看一看!

他们建立了正常的ListView,所以这个想法完全相同。您仍然拥有保存数据的adapter,然后将其添加到您的自定义ListViewListView仍然只能保存与屏幕上显示的一样多的视图(为了更高效)。区别在于添加项目的处理方式。

您传入的每个项目(通过adapter)都会返回一个"标题ID"它被映射到哪个。具有相同标头ID的项目在同一标头下分组。这些标头是根据您传入的数据在适配器中使用getHeaderView()方法创建的。

示例代码从library link

中很好地展示了这一点
public class MyAdapter extends BaseAdapter implements StickyListHeadersAdapter {

    private String[] countries;
    private LayoutInflater inflater;

    public TestBaseAdapter(Context context) {
        inflater = LayoutInflater.from(context);
        countries = context.getResources().getStringArray(R.array.countries);
    }

    @Override
    public int getCount() {
        return countries.length;
    }

    @Override
    public Object getItem(int position) {
        return countries[position];
    }

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

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder;

        if (convertView == null) {
            holder = new ViewHolder();
            convertView = inflater.inflate(R.layout.test_list_item_layout, parent, false);
            holder.text = (TextView) convertView.findViewById(R.id.text);
            convertView.setTag(holder);
        } else {
            holder = (ViewHolder) convertView.getTag();
        }

        holder.text.setText(countries[position]);

        return convertView;
    }

    @Override 
    public View getHeaderView(int position, View convertView, ViewGroup parent) {
        HeaderViewHolder holder;
        if (convertView == null) {
            holder = new HeaderViewHolder();
            convertView = inflater.inflate(R.layout.header, parent, false);
            holder.text = (TextView) convertView.findViewById(R.id.text);
            convertView.setTag(holder);
        } else {
            holder = (HeaderViewHolder) convertView.getTag();
        }
        //set header text as first char in name
        String headerText = "" + countries[position].subSequence(0, 1).charAt(0);
        holder.text.setText(headerText);
        return convertView;
    }

    @Override
    public long getHeaderId(int position) {
        //return the first character of the country as ID because this is what headers are based upon
        return countries[position].subSequence(0, 1).charAt(0);
    }

    class HeaderViewHolder {
        TextView text;
    }

    class ViewHolder {
        TextView text;
    }

}