listview封装处理
来源:互联网 发布:linux切换计算机目录 编辑:程序博客网 时间:2024/06/06 03:38
在日常开发中,经常会使用到listview,在使用listview的时候肯定会涉及到adapter的使用,如果每次使用一次就建立一个新的adapter这样就会造成代码的冗余,会多写很多没有必要的代码,在使用的时候应根据自己的需要进行封装,可以定义个DefaultAdapter去继承BaseAdapter,将有共性的代码写在这里面,不存在共性的使用抽象法让继承DefaultAdapter类去实现;同时定义一个抽象的BaseHolder让需要的类出实现它,具体代码如下:
/** * viewholder基类,后面的viewholder可以继承该类 * @author Administrator * * @param <Data> */public abstract class BaseHolder<Data> { private View convertView; private List<Data> list; private int pos; public BaseHolder() { convertView=initView(); convertView.setTag(this); } public View getConvertView() { return convertView; } @SuppressWarnings("unchecked") protected <T extends View> T findID(View v, int id) { return (T) v.findViewById(id); } public void setData(List<Data> list,int pos) { this.list = list; this.pos=pos; refreshView(list,pos); } public abstract void refreshView(List<Data> list,int pos);//初始化页面数据 public abstract View initView();//加载页面ui}
/** * 适配器基类,后面的适配器可以继承该类 * @author Administrator * * @param <Data> */public abstract class DefaultAdapter<Data> extends BaseAdapter { private Context context; protected List<Data> list; public DefaultAdapter(Context context,List<Data> list){ this.context = context; this.list = new ArrayList<Data>(); if(list!=null) { this.list.addAll(list); } } public List<Data> getDatas() { return list; } public void setDatas(List<Data> list) { this.list = list; } public void nodfiyData(List<Data> list){ if(list!=null) { this.list.clear(); this.list.addAll(list); } notifyDataSetChanged(); } @Override public int getCount() { return list == null ? 0 : list.size(); } @Override public Object getItem(int position) { return list.get(position); } @Override public long getItemId(int position) { return position; } @SuppressWarnings("unchecked") @Override public View getView(int position, View convertView, ViewGroup parent) { BaseHolder<Data> holder=null; if (convertView==null) { holder=getHolder(); }else{ holder=(BaseHolder<Data>) convertView.getTag(); } if (position<list.size()) { holder.setData(list,position); } refreshUi(holder.getConvertView(), position); return holder.getConvertView(); } protected abstract BaseHolder<Data> getHolder(); public abstract void refreshUi(View convertView,int position);//初始化页面数据}
以上就是主要的代码封装,其实在BaseHolder中还定义了一个findID的方法,该方法用于在布局中通过id获取对应的控件,并返回该对象,其实现在也有很多大牛了一些注解,可以很方便的通过id获取对应的控件;包括在BaseActivity中采用的也是这样的处理方式;
@SuppressWarnings("unchecked") protected <T extends View> T ID(int id) { return (T) super.findViewById(id); } @SuppressWarnings("unchecked") protected <T extends View> T ID(View v, int id) { return (T) v.findViewById(id); }
public class MainActivity extends BaseActivity { private ListView listview; private List<String> list=new ArrayList<String>(); private MyAdapter adapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initData(); initView(); } private void initView(){ listview=ID(R.id.listview); adapter=new MyAdapter(MainActivity.this, list); listview.setAdapter(adapter); } class MyAdapter extends DefaultAdapter<String>{ public MyAdapter(Context context, List<String> list) { super(context, list); } @Override protected BaseHolder<String> getHolder() { return new MyHolder(); } @Override public void refreshUi(View convertView, int position) { } } class MyHolder extends BaseHolder<String>{ TextView tv; @Override public void refreshView(List<String> list, int pos) { String string = list.get(pos); this.tv.setText(""+string); } @Override public View initView() { View convertView = View.inflate(MainActivity.this, R.layout.listview_item, null); this.tv=findID(convertView, R.id.tv); return convertView; } } private void initData(){ for (int i = 0; i < 20; i++) { list.add(""+i); } }}
大致实现方式就是这样的,效果如下:
源码地址:http://download.csdn.net/detail/wangwo1991/9746772
0 0
- listview封装处理
- ListView封装
- ListView封装
- 封装listview分页加载
- Listview的适配器封装
- Android ListView封装类
- listview的封装使用
- ListView的高级封装
- Android ListView封装
- ListView 通用Adapter封装
- ListView中数据的封装
- Android---封装ListView的Adapter
- ListView 及Recyclerview的封装
- ListView之ViewHolder类封装
- ListView 优化之ViewHolder封装
- ListView多布局Adapter封装
- 封装(驱动处理)
- C#封装二进制文件处理
- oAuth协议原理
- css3中的rem值与px之间的换算
- FAQ: Microsoft Dynamics AX Kernel Hotfixes
- 八数码难题
- ABBYY FineReader支持哪些文件格式
- listview封装处理
- elasticsearch-sql插件安装与使用
- Centos Linux 怎么清理磁盘占用空间大:/dev/xvda1
- 基础算法与常用格式
- 10008---临时急需马上说03
- 正则表达式
- 条形码--JsBarcode
- P1086 花生采摘
- 拷贝Python对象:深拷贝与浅拷贝