一、实现效果:头部停留 不断一直保持在顶部
二、实现步骤:
1、导入Libary:
compile'se.emilsjolander:stickylistheaders:2.7.0'
2、代码实现:
package com.example.mac.stickylistheadersdemo;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.AdapterView;
import android.widget.Toast;
import java.util.ArrayList;
import java.util.List;
import se.emilsjolander.stickylistheaders.StickyListHeadersListView;
public class MainActivity extends AppCompatActivity {
private StickyListHeadersListView stickyListHeadersListView;
private MainAdapter mainAdapter;
private List<String> headList;
private List<String> bodyList;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//初始化
stickyListHeadersListView = (StickyListHeadersListView) findViewById(R.id.sl_list);
mainAdapter = new MainAdapter(this);
//设置头部的数据
headList = new ArrayList<>();
for (int i = 0; i < 100; i++) {
headList.add("头部停留 " + i);
}
mainAdapter.setHeadList(headList);
//设置内容的数据
bodyList = new ArrayList<>();
for (int i = 0; i < 100; i++) {
bodyList.add("内容 " + i);
}
mainAdapter.setBodyList(bodyList);
//设置头部的点击事件
stickyListHeadersListView.setOnHeaderClickListener(new StickyListHeadersListView.OnHeaderClickListener() {
@Override
public void onHeaderClick(StickyListHeadersListView l, View header, int itemPosition, long headerId, boolean currentlySticky) {
Toast.makeText(MainActivity.this, "headerId:" + headerId, Toast.LENGTH_SHORT).show();
}
});
//设置内容的点击事件
stickyListHeadersListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
Toast.makeText(MainActivity.this, "i:" + i, Toast.LENGTH_SHORT).show();
}
});
//设置头部改变的监听
stickyListHeadersListView.setOnStickyHeaderChangedListener(new StickyListHeadersListView.OnStickyHeaderChangedListener() {
@Override
public void onStickyHeaderChanged(StickyListHeadersListView l, View header, int itemPosition, long headerId) {
Toast.makeText(MainActivity.this, "itemPosition:" + itemPosition, Toast.LENGTH_SHORT).show();
}
});
stickyListHeadersListView.setAdapter(mainAdapter);
}
}
3、适配器的编写:
package com.example.mac.stickylistheadersdemo;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;
import java.util.List;
import se.emilsjolander.stickylistheaders.StickyListHeadersAdapter;
/**
* Created by li on 17-11-20.
*/
public class MainAdapter extends BaseAdapter implements StickyListHeadersAdapter {
private Context context;
private List<String> headList;
private List<String> bodyList;
public MainAdapter(Context context, List<String> headList, List<String> bodyList) {
this.context = context;
this.headList = headList;
this.bodyList = bodyList;
}
public void setHeadList(List<String> headList) {
this.headList = headList;
notifyDataSetChanged();
}
public void setBodyList(List<String> bodyList) {
this.bodyList = bodyList;
notifyDataSetChanged();
}
//设置数据的个数
@Override
public int getCount() {
return bodyList.size();
}
//设置item的条数
@Override
public Object getItem(int i) {
return bodyList.get(i);
}
//获得相应数据集合中特定位置的数据项
@Override
public long getItemId(int i) {
return i;
}
//(绑定每个条目对应的head的id)
@Override
public long getHeaderId(int position) {
// return badyList.get(position).headId; //一般写项目的时候;
//测试
if (position < 5) {
return 0;
} else if (position < 10) {
return 1;
} else if (position < 15) {
return 2;
}else {
return 3;
}
}
//绑定内容的数据
@Override
public View getView(int i, View view, ViewGroup viewGroup) {
BodyHolder bodyHolder = null;
if (view == null) {
view = LayoutInflater.from(context).inflate(R.layout.item_body, viewGroup, false);
bodyHolder = new BodyHolder(view);
view.setTag(bodyHolder);
} else {
bodyHolder = (BodyHolder) view.getTag();
}
//设置数据
bodyHolder.bodyTv.setText(bodyList.get(i));
return view;
}
//绑定头部的数据
@Override
public View getHeaderView(int position, View convertView, ViewGroup parent) {
HeadHolder headHolder = null;
if (convertView == null) {
convertView = LayoutInflater.from(context).inflate(R.layout.item_head, parent, false);
headHolder = new HeadHolder(convertView);
convertView.setTag(headHolder);
} else {
headHolder = (HeadHolder) convertView.getTag();
}
//设置数据
headHolder.headTv.setText(headList.get(position));
return convertView;
}
//头部的内部类
class HeadHolder {
private TextView headTv;
public HeadHolder(View itemHeadView) {
headTv = (TextView) itemHeadView.findViewById(R.id.item_head_tv);
}
}
//内容的内部类
class BodyHolder {
private TextView bodyTv;
public BodyHolder(View itemBodyView) {
bodyTv = (TextView) itemBodyView.findViewById(R.id.item_body_tv1);
}
}
}
StickyListHeadersListView的用法和listview一致,在布局文件的xml就不写,效果图是copy过来的,大致差不多。