什么情况下需要封装mi wlan adapter下载

2517人阅读
ViewPager是android的support库中的一个控件,也是一个在许多应用开发中都用得比较多的控件。目前为止,对ViewPager的使用,我一般是用ViewPager + Fragment的组合,偶尔也有ViewPager加View的组合。关于ViewPager + Fragment的使用,已经有FragmentAdapter的实现可以帮助我们快速进行开发了,但是每次使用ViewPager + View都要自己去继承PagerAdapter并实现,重写那些我们写过一次又一次的方法,于是决定对其进行封装。
代码如下:
* Date: 14-8-18
* Project: Access-Control-V2
package cn.irains.access_
import android.support.v4.view.PagerA
import android.util.SparseA
import android.view.V
import android.view.ViewG
import java.util.L
* 抽象的PagerAdapter实现类,封装了内容为View的公共操作.
* Author: msdx ()
* Time: 14-8-18 下午2:34
public abstract class AbstractViewPagerAdapter&T& extends PagerAdapter {
protected List&T& mD
private SparseArray&View& mV
public AbstractViewPagerAdapter(List&T& data) {
mViews = new SparseArray&View&(data.size());
public int getCount() {
return mData.size();
public boolean isViewFromObject(View view, Object object) {
return view ==
public Object instantiateItem(ViewGroup container, int position) {
View view = mViews.get(position);
if (view == null) {
view = newView(position);
mViews.put(position, view);
container.addView(view);
public abstract View newView(int position);
public void destroyItem(ViewGroup container, int position, Object object) {
container.removeView(mViews.get(position));
public T getItem(int position) {
return mData.get(position);
在该类中,使用了泛型来支持它的扩展复用。然后是定义了两个成员变量,一个是List&T& mData,用于存放待填充的数据,另一个是SparseArray&View& mView,用于存放已经初始化的每个位置的view,key是其对应的位置。
在该抽象类中,定义了一个抽象方法:public abstract View newView(int position);用于在从mView中取不到对应的view时,从这里创建。
而关于instantiateItem方法的实现则很简单,如下:
public Object instantiateItem(ViewGroup container, int position) {
View view = mViews.get(position);
if (view == null) {
view = newView(position);
mViews.put(position, view);
container.addView(view);
先从mViews中取出对应的view,如果取不到就调用newView(position)来创建,并加入mViews,如果取到了,就加进容器中,并返回。
在该类中,还新增了一个getItem(int position)的方法,用于返回对应位置的对象。
封装之后,以后使用起来就很方便了,直接继承这个类,并实现newView(int position)的抽象方法,如下:
class OpenResultAdapter extends AbstractViewPagerAdapter&OpenResult& {
public OpenResultAdapter(List&OpenResult& data) {
super(data);
public View newView(int position) {
View view = View.inflate(mContext, R.layout.view_remote_capture, null);
ImageView imageView = (ImageView) view.findViewById(R.id.image_view);
UIUtil.setLayoutParamsHeight(imageView, R.dimen.padding_common, 4, 3);
imageView.setAdjustViewBounds(true);
mImageLoader.displayImage(UrlUtil.imageUrl(getItem(position).getImgUrl()), imageView);
是不是感觉代码简洁了很多呢?
版权声明:本文为博主原创文章,未经博主允许不得转载。
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:418837次
积分:5983
积分:5983
排名:第1924名
原创:100篇
译文:52篇
评论:417条
Android高级开发群:
Andriod Studio 伪官方群:
文章:21篇
阅读:37723
文章:31篇
阅读:26166
文章:12篇
阅读:50768
(4)(4)(4)(9)(4)(4)(1)(9)(14)(21)(5)(5)(4)(14)(4)(7)(7)(6)(2)(5)(2)(8)(8)(3)简单的adapter封装
在开发中listview是每个项目肯定要使用的控件,用到listview就必须用到BaseAdapter,一般老大搭框架的时候会把一些重用的东西抽取出来,方便每个开发人员使用并且复用性很强,那么必须封装的好,今天简单的写一个平时使用到的,把BaseAdapter封装下,
MyBaseAdapter.java
public abstract class MyBaseAdapter extends BaseAdapter {
private List
public MyBaseAdapter(List datas, Context context) {
this.datas =
this.context =
public int getCount() {
return datas.size();
public Object getItem(int position) {
return datas.get(position);
public long getItemId(int position) {
public abstract View getView(int position, View arg1, ViewGroup arg2);
其实我们在使用adapter的时候其他三个方法 返回值都是一样的,因此这个可以在父类就处理好,唯一每个子类不知道实现的就是getView()方法的实现,因此只要让每个子类实现自己的getView()方法即可,因此就抽取成上面的MyBaseAdapter类了,现在写一个类简单实用这个框架
MainActivity.java
public class MainActivity extends Activity {
private ListV
private ArrayList
private LayoutI
private MyA
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
listview = (ListView) findViewById(R.id.listview);
inflater = LayoutInflater.from(this);
initData();
adapter = new MyAdapter(datas,this);
listview.setAdapter(adapter);
private void initData() {
datas = new ArrayList();
for(int i=0;i<100;i++){
datas.add("测试-------");
class MyAdapter extends MyBaseAdapter{
public MyAdapter(List datas, Context context) {
super(datas, context);
public View getView(int position, View converView, ViewGroup arg2) {
ViewHolder holder =
if(converView==null){
converView = inflater.inflate(R.layout.item, null);
holder = new ViewHolder();
holder.tvContent = (TextView) converView.findViewById(R.id.tvContent);
converView.setTag(holder);
holder = (ViewHolder) converView.getTag();
holder.tvContent.setText(datas.get(position));
return converV
class ViewHolder{
TextView tvC
其实看开源的框架还是自己项目中的框架,一般框架都用到,接口,抽象类,接口回调,泛型,继承,内部类等,多写几遍,其实框架也没那么难5134人阅读
解决的问题:
适配器模式把一个类的接口变换成客户端所期待的另一种接口,从而使原本接口不匹配而无法在一起工作的两个类能够在一起工作。比如说我的hp笔记本,美国产品,人家美国的电压是的,而我们中国的电压是,要在中国能使用,必须找个变压器转一下电压才可以。这个变压器就是个适配器。
适配器模式有类适配器和对象适配器两种模式,我们将分别讨论。
类适配器:
由图中可以看出,Adaptee类没有Request方法,而客户期待这个方法。为了使客户能够使用Adaptee类,提供一个中间环节,即类Adapter类,Adapter类实现了Target接口,并继承自Adaptee,Adapter类的Request方法重新封装了Adaptee的SpecificRequest方法,实现了适配的目的。
因为Adapter与Adaptee是继承的关系,所以这决定了这个适配器模式是类的。
该适配器模式所涉及的角色包括:
目标(Target)角色:这是客户所期待的接口。因为C#不支持多继承,所以Target必须是接口,不可以是类。
源(Adaptee)角色:需要适配的类。
适配器(Adapter)角色:把源接口转换成目标接口。这一角色必须是类
& & 简单实现:
#include&iostream&
// &ITarget&
class Target
// Methods
virtual void Request(){};
// &Adaptee&
class Adaptee
// Methods
void SpecificRequest()
cout&&&Called SpecificRequest()&&&
// &Adapter&
class Adapter : public Adaptee, public Target
// Implements ITarget interface
void Request()
// Possibly do some data manipulation
// and then call SpecificRequest
this-&SpecificRequest();
int main()
// Create adapter and place a request
Target *t = new Adapter();
t-&Request();
对象适配器:
从图中可以看出:客户端需要调用Request方法,而Adaptee没有该方法,为了使客户端能够使用Adaptee类,需要提供一个包装(Wrapper)类Adapter。这个包装类包装了一个Adaptee的实例,从而将客户端与Adaptee衔接起来。由于Adapter与Adaptee是委派关系,这决定了这个适配器模式是对象的。
该适配器模式所涉及的角色包括:
目标(Target)角色:这是客户所期待的接口。目标可以是具体的或抽象的类,也可以是接口。
源(Adaptee)角色:需要适配的类。
适配器(Adapter)角色:通过在内部包装(Wrap)一个Adaptee对象,把源接口转换成目标接口。
简单实现:
#include&iostream&
// &ITarget&
class Target
// Methods
virtual void Request(){};
// &Adaptee&
class Adaptee
// Methods
void SpecificRequest()
cout&&&Called SpecificRequest()&&&
// &Adapter&
class Adapter : public Target
adaptee = new Adaptee();
// Implements ITarget interface
void Request()
// Possibly do some data manipulation
// and then call SpecificRequest
adaptee-&SpecificRequest();
int main()
// Create adapter and place a request
Target *t = new Adapter();
t-&Request();
缺省适配器:
缺省适配器模式是一种特殊的适配器模式,但这个适配器是由一个抽象类实现的,并且在抽象类中要实现目标接口中所规定的所有方法,但很多方法的实现都是平庸的实现,也就是说,这些方法都是空方法。而具体的子类都要继承此抽象类。&
简单实现:
#include&iostream&
class Target {
virtual void f1(){};
virtual void f2(){};
virtual void f3(){};
class DefaultAdapter : public Target
void f1() {
void f2() {
void f3() {
class MyInteresting :public DefaultAdapter
void f3(){
cout&&&呵呵,我就对f3()方法感兴趣,别的不管了!&&&
int main()
// Create adapter and place a request
Target *t = new MyInteresting();
实现要点:
1.模式主要应用于希望复用一些现存的类,但是接口又与复用环境要求不一致的情况,在遗留代码复用、类库迁移等方面非常有用。
2.模式有对象适配器和类适配器两种形式的实现结构,但是类适配器采用多继承的实现方式,带来了不良的高耦合,所以一般不推荐使用。对象适配器采用对象组合的方式,更符合松耦合精神。
3.模式的实现可以非常的灵活,不必拘泥于中定义的两种结构。例如,完全可以将模式中的现存对象作为新的接口方法参数,来达到适配的目的。
4.模式本身要求我们尽可能地使用面向接口的编程风&#26684;,这样才能在后期很方便的适配。
使用场景:
在以下各种情况下使用适配器模式:
1.系统需要使用现有的类,而此类的接口不符合系统的需要。
2.想要建立一个可以重复使用的类,用于与一些彼此之间没有太大关联的一些类,包括一些可能在将来引进的类一起工作。这些源类不一定有很复杂的接口。
3.(对对象适配器而言)在设计里,需要改变多个已有子类的接口,如果使用类的适配器模式,就要针对每一个子类做一个适配器,而这不太实际。
LCL_data原创于CSDN.NET【】
版权声明:本文为博主原创文章,未经博主允许不得转载。
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:300304次
积分:4259
积分:4259
排名:第3382名
原创:97篇
评论:191条
文章:25篇
阅读:118215
(1)(2)(3)(3)(4)(2)(6)(8)(1)(1)(1)(2)(1)(3)(1)(3)(5)(2)(1)(1)(1)(1)(1)(2)(4)(3)(2)(6)(2)(1)(4)(4)(5)(2)(4)(1)(4)(4)(1)(2)当前访客身份:游客 [
当前位置:
发布于 日 23时,
封装了HolderView的Adapter,适用于ListView和GridView
代码片段(2)
1.&[代码][Java]代码&&&&
//使用本类的例子
public void test(){
//在ViewCreator接口中实现ListView中的子项目View的创建和更新。
ViewCreator&String& creator = new ViewCreator&String&() {
public View createView(LayoutInflater inflater, int position,
String data) {
//可以直接new各种Android控件,或者通过inflater根据XML布局文件创建
public void updateView(View view, int position, String data) {
//将数据更新到 view 即可。这里的view对象是createView所创建的对象。
HolderAdapter&String& adapter = new HolderAdapter&String&(getLayoutInflater(), creator);
//布局文件中的ListView,取得其引用
ListView list =
//建立适配器
list.setAdapter(adapter);
List&String& data =
//更新到适配器中
adapter.update(data);
2.&[代码][Java]代码&&&&
* Copyright (C) 2012 ToolkitForAndroid Project
* Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
package chen.android.toolkit.
import java.util.ArrayL
import java.util.L
import android.view.LayoutI
import android.view.V
import android.view.ViewG
import android.widget.BaseA
* &/br&&b&name : &/b&
HolderAdapter
* &/br&&b&description :&/b&TODO
* &/br&@author :
桥下一粒砂
* &/br&&b&e-mail : &/b&
* &/br&&b&weibo : &/b&
@桥下一粒砂
* &/br&&b&date : &/b&
下午10:56:11
public class HolderAdapter&E& extends BaseAdapter {
* &/br&&b&name : &/b&
ViewCreator
* &/br&&b&description :&/b&创建View和更新View的接口
* &/br&@author :
桥下一粒砂
* &/br&&b&e-mail : &/b&
* &/br&&b&weibo : &/b&
@桥下一粒砂
* &/br&&b&date : &/b&
上午12:35:05
* @param &E&
public interface ViewCreator&E&{
* &/br&&b&title : &/b&
* &/br&&b&description :&/b&创建View,HolderAdapter需要创建View时,会调用此方法创建View。
* &/br&&b&time :&/b&
下午11:03:47
* @param inflater
* @param position
* @param data
View createView(LayoutInflater inflater,int position,E data);
* &/br&&b&title : &/b&
* &/br&&b&description :&/b&更新View
* &/br&&b&time :&/b&
下午11:04:30
* @param view
* @param position
* @param data
void updateView(View view,int position,E data);
* &/br&&b&name : &/b&
ViewHolder
* &/br&&b&description :&/b&一个持有View引用对象的静态类,用以减少View的创建次数
* &/br&@author :
桥下一粒砂
* &/br&&b&e-mail : &/b&
* &/br&&b&weibo : &/b&
@桥下一粒砂
* &/br&&b&date : &/b&
上午12:31:56
private static class ViewHolder{
* 数据缓存
private List&E& mDataC
* 用于从XML文件中创建Layout
private LayoutInflater mI
* View创建器
private ViewCreator&E& mC
public HolderAdapter(LayoutInflater inflater,ViewCreator&E& creator){
mInflater =
mCreator =
* &/br&&b&title : &/b&
更新数据集
* &/br&&b&description :&/b&更新数据集
* &/br&&b&time :&/b&
下午11:06:40
* @param data
public void update(List&E& data){
mDataCache =
notifyDataSetChanged();
* &/br&&b&title : &/b&
添加数据集
* &/br&&b&description :&/b&添加数据集
* &/br&&b&time :&/b&
下午10:19:45
* @param set
public void add(List&E& set){
if( null == mDataCache ) mDataCache = new ArrayList&E&();
mDataCache.addAll(set);
notifyDataSetChanged();
* &/br&&b&title : &/b&
添加数据元素
* &/br&&b&description :&/b&添加数据元素
* &/br&&b&time :&/b&
下午10:19:51
* @param item
public void add(E item){
if( null == mDataCache ) mDataCache = new ArrayList&E&();
mDataCache.add(item);
notifyDataSetChanged();
/* (non-Javadoc)
* @see android.widget.Adapter#getCount()
public int getCount() {
return null == mDataCache ? 0 : mDataCache.size();
/* (non-Javadoc)
* @see android.widget.Adapter#getItem(int)
public E getItem(int position) {
return null == mDataCache ? null : mDataCache.get(position);
/* (non-Javadoc)
* @see android.widget.Adapter#getItemId(int)
public long getItemId(int position) {
/* (non-Javadoc)
* @see android.widget.Adapter#getView(int, android.view.View, android.view.ViewGroup)
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder =
if (convertView == null) {
holder = new ViewHolder();
convertView = mCreator.createView(mInflater, position, getItem(position));
convertView.setTag(holder);
holder.view = convertV
holder = (ViewHolder)convertView.getTag();
mCreator.updateView(holder.view,position, getItem(position));
return convertV
开源中国-程序员在线工具:
updateView方法内部是不是今后还要调用用过findViewById?
2楼:陈小锅 发表于
引用来自“hasszhao”的评论updateView方法内部是不是今后还要调用用过findViewById?这个类是一个Adapter,只是集成了HolderView的设计模式,并把创建View的操作通过ViewCreator接口由外部实现。
3楼:sdgfsdg 发表于
&IT职业交流& ,任意交流,欢迎加入!
4楼:yangfei3169725 发表于
java交流群,期待你的加入。群号:
5楼:张宗伟 发表于
你好,看了你的代码很受启发。但也发现了一个问题,在creatView中创建的布局,在updateView中还需要findViewById一下,这个过程是每次生成一个item都要执行的,会比较耗时间。能不能考虑把holder也独立出来,小弟愚见,望多指教!
6楼:陈小锅 发表于
引用来自“张宗伟”的评论你好,看了你的代码很受启发。但也发现了一个问题,在creatView中创建的布局,在updateView中还需要findViewById一下,这个过程是每次生成一个item都要执行的,会比较耗时间。能不能考虑把holder也独立出来,小弟愚见,望多指教!在 updateView(View view,int pos,E data){ TextView title = (TextView)view.findViewById(R.id.title); //这里是在view里findViewById,对性能影响不大。如果你的要求比较高,可以把Adapter的泛型改成你需要的具体类型,并ViewHolder内添加你需要findViewById索引的View。 // 你把holder独立出来的建议非常不错,有空把它整理上去。 }
7楼:oldfeel 发表于
8楼:wj037 发表于
弄了一下午 & 结果没搞定 &,看了这篇文章 明白那里错了 谢啦
开源从代码分享开始
陈小锅的其他代码

我要回帖

更多关于 android adapter封装 的文章

 

随机推荐