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
原创粉丝点击