效果图:
开源框架使用的是GitHub上的开源项目 : PinnedSectionListview , 网上搜索了比较多例子都不太精简或者有所缺失,所以我这就写了一个简单精简的,方便看完可以快速投入项目使用的一个例子,希望可以帮助到大家
导入项目:
dependencies {
compile "de.halfbit:pinned-section-listview:1.0.0"
}
布局文件(和listview一样就可以了):
<de.halfbit.pinnedsection.PinnedSectionListView
android:id="@+id/listView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:divider="@color/sep3"
android:fadingEdge="none"
android:fadingEdgeLength="0dp"
android:groupIndicator="@null"
android:listSelector="@android:color/transparent"
android:overScrollMode="never"
android:scrollbars="none"/>
使用代码:
mListview = (PinnedSectionListView) view.findViewById(R.id.listView);
mAdapter = new VideoAdapter(mContext);
mListview.setAdapter(mAdapter);
重点逻辑:
对数据处理:
//拿到数组遍历,判断日期不同则集合添加数据,用来判断是否是悬浮头
for (int i = 0; i < list.size(); i++) {
long publishTime = list.get(i).publishTime;
if (ageTime != publishTime) {
VideoInfo videoInfo = new VideoInfo();
videoInfo.id_ = USELESSID;
videoInfo.publishTime = publishTime;
list.add(i, videoInfo);
i++;
}
ageTime = publishTime;
}
mVideoInfoList.addAll(list);
判断悬浮头的逻辑:
getItemViewType(int position) ; isItemViewTypePinned(int viewType); 这两个方法是需要重点注意的,用来处理是否是悬浮头的判断.
public class VideoAdapter extends BaseAdapter implements PinnedSectionListView.PinnedSectionListAdapter {
private Context context;
public VideoAdapter(Context context) {
this.context = context;
}
@Override
public int getCount() {
return mVideoInfoList.size();
}
@Override
public Object getItem(int position) {
return mVideoInfoList.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View converView, ViewGroup viewGrop) {
ViewHolder viewHolder = null;
VideoInfo videoInfo = mVideoInfoList.get(position);
//判断是加悬浮头还是内容
if (videoInfo.id_ == USELESSID) {
if ("".equals(classifys)) {
if (converView == null) {
converView = LayoutInflater.from(mContext).inflate(R.layout.item_video_group, null);
}
TextView txtTitle = (TextView) converView.findViewById(R.id.txtTitle);
String time = MissUtils.getVideoPublishTime(videoInfo.publishTime);
txtTitle.setText(time);
MissUtils.applyMissFont(mContext, view);
} else {
converView = new View(mContext);
}
} else {
if (converView == null) {
converView = LayoutInflater.from(mContext).inflate(R.layout.item_video_child, null);
viewHolder = new ViewHolder();
viewHolder.icon = (ImageView) converView.findViewById(R.id.icon);
viewHolder.txtTime = (TextView) converView.findViewById(R.id.txtTime);
viewHolder.txtTitle = (TextView) converView.findViewById(R.id.txtTitle);
viewHolder.txtDesc = (TextView) converView.findViewById(R.id.txtDesc);
viewHolder.tv = (TextView) converView.findViewById(R.id.item_video_child);
viewHolder.Imageholder = new BaseViewHolder();
converView.setTag(viewHolder);
}
viewHolder = (ViewHolder) converView.getTag();
if (classifys == "") {
viewHolder.tv.setText(videoInfo.classification + " / ");
}
viewHolder.Imageholder.displayColorImage2(mContext, videoInfo.photoUrl, viewHolder.icon);
viewHolder.txtTime.setText(videoInfo.strPlayTime);
viewHolder.txtTitle.setText(videoInfo.title);
viewHolder.txtDesc.setText(videoInfo.subtitle);
MissUtils.applyMissFont(mContext, converView);
}
return converView;
}
/**
* @param position
* @return 返回每个条目的类型 , 我这直接就用position来记录了,比较方便
*/
public int getItemViewType(int position) {
return position;
}
/**
* 判断类型是不是悬浮头 .
*
* @param viewType : getItemViewType方法的返回值
* @return true 表示是悬浮头 , false 表示不是 ;
*/
@Override
public boolean isItemViewTypePinned(int viewType) {
return mVideoInfoList.get(viewType).id_ == USELESSID;
}
}
class ViewHolder {
ImageView icon;
TextView txtTime;
TextView txtTitle;
TextView txtDesc;
TextView tv;
BaseViewHolder Imageholder;
}