我的问题不是在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项目的视图一起回收?
不应该有一种方法可以简单地说某些视图必须始终保持在最顶层,只有在我们明确告诉他们更新而不使用任何第三方库时才会更新?
答案 0 :(得分:1)
嗯,您提供的链接中提供了整个库的代码。来吧看一看!
他们建立了正常的ListView
,所以这个想法完全相同。您仍然拥有保存数据的adapter
,然后将其添加到您的自定义ListView
。 ListView
仍然只能保存与屏幕上显示的一样多的视图(为了更高效)。区别在于添加项目的处理方式。
您传入的每个项目(通过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;
}
}