效果图:
开源框架使用的是GitHub上的开源项目:PinnedSectionListview,网上搜索了比较多例子都不太精简或者有所缺失,所以我这就写了一个简单精简的,方便看完可以快速投入项目使用的一个例子,可以希望帮助到大家
导入项目:
dependencies { compile "de.halfbit:pinned-section-listview:1.0.0"}
布局文件(和列表视图一样就可以了):
<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; }