Android(安卓)PinnedSectionListView实现滚动标题置顶/联系人列表效果
16lz
2021-01-26
首先PinnedSectionListView是Github上的一个开源项目,项目地址:https://github.com/beworker/pinned-section-listview,由于原始的效果并不是我想要的,所以加以修改,先上效果图:
下面开始讲解:
1.首先自定义一个adapter,继承自BaseAdapter,安装接口PinnedSectionListAdapter,这也是这个案例中最重要的类
public class PinnedSectionAdapter extends BaseAdapter implements PinnedSectionListView.PinnedSectionListAdapter { private ArrayList list; private Context context; public ArrayList getList() { return list; } public void setList(ArrayList list) { if(list!=null){ this.list = list; }else{ list=new ArrayList(); } } public PinnedSectionAdapter(Context context, ArrayList list){ this.setList(list); this.context=context; } @Override public boolean isItemViewTypePinned(int viewType) { //置顶的栏目 return viewType==Content.SECTION; } @Override public int getViewTypeCount() { return 2; } @Override public int getItemViewType(int position) { return (getItem(position)).type; } @Override public int getCount() { return list.size(); } @Override public Content getItem(int position) { return list.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder vh=null; //对listview进行缓存 if(convertView==null){ vh=new ViewHolder(); convertView= LayoutInflater.from(context).inflate(R.layout.item, null); vh.title=(TextView)convertView.findViewById(R.id.title); vh.content= (TextView) convertView.findViewById(R.id.content); vh.imageView=(ImageView)convertView.findViewById(R.id.imageView1); convertView.setTag(vh); }else{ vh=(ViewHolder) convertView.getTag(); } Content content= getItem(position); vh.title.setText(content.title); vh.content.setText(content.content); vh.imageView.setImageResource(content.imageViewId); if (content.type == Content.SECTION) { vh.title.setBackgroundResource(R.drawable.bg); //隐藏置顶栏图片 vh.imageView.setVisibility(View.GONE); vh.title.setTextSize(14); //隐藏置顶栏的内容 vh.content.setVisibility(View.GONE); }else{ vh.title.setBackgroundResource(R.drawable.bg2); vh.imageView.setVisibility(View.VISIBLE); } return convertView; } class ViewHolder { public TextView title; public TextView content; public ImageView imageView; }}
2.新建一个内容实体类
public class Content { public static final int ITEM = 0; public static final int SECTION = 1; public final int type; public final String title; public final String content; public int imageViewId; //修改构造器,可自定义内部控件 public Content(int type, int imageViewId, String title, String content) { this.type = type; this.imageViewId=imageViewId; this.title = title; this.content=content; } @Override public String toString() { return null; } //设置控件的内容 public static ArrayList getData(){ ArrayList list=new ArrayList(); list.add(new Content(SECTION,R.drawable.ic_launcher ,"Title 1","")); list.add(new Content(ITEM,R.drawable.a , "标题1","内容1")); list.add(new Content(SECTION,R.drawable.ic_launcher ,"Title 2","")); list.add(new Content(ITEM,R.drawable.b , "标题2","内容2")); list.add(new Content(ITEM,R.drawable.c , "标题3","内容3")); list.add(new Content(ITEM,R.drawable.d , "标题4","内容4")); list.add(new Content(SECTION,R.drawable.ic_launcher ,"Title 3","")); list.add(new Content(ITEM,R.drawable.e , "标题5","内容5")); list.add(new Content(ITEM,R.drawable.f , "标题6","内容6")); list.add(new Content(ITEM,R.drawable.g , "标题7","内容7")); list.add(new Content(ITEM,R.drawable.h , "标题8","内容8")); list.add(new Content(ITEM,R.drawable.i , "标题9","内容9")); list.add(new Content(SECTION,R.drawable.ic_launcher ,"Title 4","")); list.add(new Content(ITEM,R.drawable.j , "标题10","内容10")); list.add(new Content(ITEM,R.drawable.k , "标题11","内容11")); list.add(new Content(ITEM,R.drawable.l , "标题12","内容12")); list.add(new Content(SECTION,R.drawable.ic_launcher ,"Title 5","")); list.add(new Content(ITEM,R.drawable.m , "标题13","内容13")); list.add(new Content(ITEM,R.drawable.n , "标题14","内容14")); list.add(new Content(ITEM,R.drawable.o , "标题15","内容15")); list.add(new Content(SECTION,R.drawable.ic_launcher ,"Title 6","")); list.add(new Content(ITEM,R.drawable.p , "标题16","内容16")); return list; }}
3.最后修改MainActivity
public class MainActivity extends Activity { private PinnedSectionListView listView; private PinnedSectionAdapter mAdapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); listView= (PinnedSectionListView) findViewById(R.id.listview); mAdapter=new PinnedSectionAdapter(this, Content.getData()); listView.setAdapter(mAdapter); listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { Content content=mAdapter.getItem(position); if(content.type==Content.ITEM){ Toast.makeText(MainActivity.this, content.title, Toast.LENGTH_SHORT).show(); } if(content.type==Content.SECTION){ Toast.makeText(MainActivity.this, content.title, Toast.LENGTH_SHORT).show(); } } }); }}
代码总体还是比较简单的,布局文件就不上传了,如果觉得看得还不过瘾,可以 点我下载项目。
如果有什么建议可以留言一起讨论,谢谢。
更多相关文章
- [置顶] 100多个Android(安卓)Demo的整合
- 国内四个不错的技术团体博客
- Android常用工具之对字符串String进行MD5加密
- [置顶] android学习系列-短信发送器与电话拨号器调用(3)
- android开发之读取xml文件
- Android:自定义标题栏
- [置顶] android 系统图片剪裁
- android中添加通过内容提供者添加联系人
- Android中自定义标题栏(一)