Adapter适配器

2024-06-16 10:18
文章标签 适配器 adapter

本文主要是介绍Adapter适配器,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

         在Android中,使用到了一些可重复性的有规律的列表数据展示时,基本上都离不开了Adapter。

        Adapter中文意思是 适配器,适配器听起来相对比较抽象。字面上的概念:   Adapter是获取到服务器API数据和前端UI列表显示的适配器接口,是数据和UIView)之间一个重要的纽带。在常见的复杂控件View(List View,Grid View)等地方都需要用到Adapter

   

  Adapter大致结构如上图。Adapter分为 ListAdapter、SpinnerAdapter 2个抽象类,这两大类的基本相似,但是我们最常用的ArrayAdapter,SimpleAdapter,SimpleCursorAdapter,以及重写BaseAdapter等方法。

  ArrayAdapter:相对比较简单,用于一般得ArrayList的数据集,但它只能用于显示文字。

     SimpleAdapter:一般用来展示一些例子数据,不需要自己去设置UI的详细样式。

    SimpleCursorAdapter:Cursor(游标)用来读取手机SQLite数据库的数据,然后显示到UI界面中,则可常用于数据库中读取数据显示在列表上。

    BaseAdapter:是开发中使用最多的,有很强的扩展性,可以根据自己的需求设置样式UI的展现,设置数据集合的类型等等。

   ArrayAdapter的Demo使用如下:

   /**

 * ArrayAdapterActivity.java [V 1..0.0]

 * classes : com.hb56.MyAndroidUtil.ArrayAdapterActivity

 * zhangyx Create at 2015-2-2 下午1:51:14

 */

package com.hb56.MyAndroidUtil;

import java.util.ArrayList;

import com.lidroid.xutils.ViewUtils;

import com.lidroid.xutils.view.annotation.ViewInject;

import android.app.Activity;

import android.os.Bundle;

import android.widget.ArrayAdapter;

import android.widget.ListView;

/**

 *com.hb56.MyAndroidUtil.ArrayAdapterActivity

 * @author Admin-zhangyx

 *

 * create at 2015-2-2 下午1:51:14

 */

public class MyArrayAdapterActivity extends Activity{

   @ViewInject(R.id.lvData)

    private ListView lvData;

    private ArrayList<String> listStr = new ArrayList<String>();


    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_arrayAdapter);

        ViewUtils.inject(this);

        lvData.setAdapter(new ArrayAdapter<String>(this,                            android.R.layout.simple_expandable_list_item_1, getData()));

    }

    //创建本地数据

    private ArrayList<String> getData() {

    for(int i=1;i<=5;i++){

    listStr.add("测试数据"+i);

    }

        return listStr;

    }

}

对于activity_arrayAdapter布局代码,很简单就一个ListView布局,我就不贴出代码了。


ArrayAdapter方法分析如下:

public ArrayAdapter (Context context, int textViewResourceId, T[] objects)

其中Context为当前的环境变量,可以显示一行文字的一个布局文件,和一个List的集合,也就是数据源。

布局文件可以自己写,也可以用系统的,我这里是用的系统的。自己写的布局中包含一个TextView就可以了,当然系统中也有包含一个TextView的布局文件:就是 android.R.layout.simple_expandable_list_item_1,调用这个比较方便。


SimpleCursorAdapter适配器的Demo如下:

SimpleCursorAdapter用于列表绑定手机SQLite数据库数据。

/**
 * SimpleCursorAdapter.java [V 1..0.0]
 * classes : com.hb56.MyAndroidUtil.SimpleCursorAdapter
 * zhangyx Create at 2015-2-2 下午2:07:48
 */
package com.hb56.MyAndroidUtil;
import com.lidroid.xutils.ViewUtils;
import com.lidroid.xutils.view.annotation.ViewInject;
import android.database.Cursor;
import android.os.Bundle;
import android.provider.Contacts.People;
import android.widget.ListView;
/**
 *com.hb56.MyAndroidUtil.SimpleCursorAdapter
 * @author Admin-zhangyx
 *
 * create at 2015-2-2 下午2:07:48
 */
public class MySimpleCursorAdapterActivity extends Activity {
@ViewInject(R.id.lvData)
    private ListView lvData;//展示UI列表
    private Cursor mCursor;//本地数据
    private SimpleCursorAdapter mAdapter;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_simpleCursor);
        ViewUtils.inject(this);
        mCursor = getContentResolver().query(People.CONTENT_URI, null, null, null, null);
        mAdapter = new SimpleCursorAdapter(this, android.R.layout.simple_expandable_list_item_1, mCursor, new String[]{People.NAME}, new int[]{android.R.id.text1});
        lvData.setAdapter(mAdapter);
    }
}

分析代码:

mCursor = getContentResolver().query(People.CONTENT_URI, null, null, null, null);是先获得一个指向系统联系人的Cursor。


其中前面的2个参数跟ArrayAdapter中是一样的,第三个参数是传个来的参数, 其实也是数据源,后面的2个参数是2个数组,前一个是String【】类型的,而后一个是int【】类型的,说明前一个参数中的值对应的是从数据库中的字 段,后一个是布局文件中和这个字段对应的id,也就是说这个字段对应得值要显示在哪里(比如说我们这里查到的联系人中的NAME字段,要显示在一个对应的 TextView上面)。


SimpleAdapter的Demo:

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;


import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.view.KeyEvent;
import android.view.View;
import android.widget.AdapterView;
import android.widget.SimpleAdapter;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.Toast;
import com.example.listviewshangxia.XListView.IXListViewListener;
/***
 * 
 *com.example.listviewshangxia.MainActivity
 * @author Admin-zhangyx
 *
 * create at 2015-2-2 下午2:18:53
 */
public class MySimpleAdapterActivity extends Activity implements IXListViewListener {
private XListView mListView;
private SimpleAdapter mAdapter1;
private Handler mHandler;
private ArrayList<HashMap<String, Object>> dlist;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
/** 下拉刷新,上拉加载 */
dlist = new ArrayList<HashMap<String, Object>>();
mListView = (XListView) findViewById(R.id.techan_xListView);// 这个listview是在这个layout里面
mListView.setPullLoadEnable(true);// 设置让它上拉,FALSE为不让上拉,便不加载更多数据
mAdapter1 = new SimpleAdapter(MainActivity.this, getData(),
R.layout.scenic_item_list, new String[] { "name", "img",
"content" }, new int[] { R.id.title, R.id.img,
R.id.content });
mListView.setAdapter(mAdapter1);
mListView.setXListViewListener(this);
mHandler = new Handler();
mListView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
Toast.makeText(getApplicationContext(), "您点击了"+data[position-1], Toast.LENGTH_LONG).show();
}
});
}

/** 初始化本地数据 */
String data[] = new String[] { "三块石国家森林公园", "关山湖国家水利风景区", "小鹿沟青龙寺景区",
"天女山风景区", "后安腰堡采摘园" };
String data1[] = new String[] { "抚顺县救兵乡王木村", "抚顺县救兵乡王木村", "抚顺县救兵乡王木村",
"抚顺县救兵乡王木村", "抚顺县救兵乡王木村" };


private ArrayList<HashMap<String, Object>> getData() {


for (int i = 0; i < data.length; i++) {
HashMap<String, Object> map = new HashMap<String, Object>();
map.put("name", data[i]);
map.put("content", data1[i]);
map.put("img", R.drawable.ic_launcher);
dlist.add(map);
}
return dlist;
}

 分析代码:

SimpleAdapter与SimpleCursorAdapter的参数设置差不多,唯一的区别在于数据的类型上。


BaseAdapter:是开发中最常用的适配器。

Demo代码如下:

public class DataAdapter extends BaseAdapter {


private LayoutInflater mInflater;
private List<JobModel> jobLists;
private Context context;


public DataAdapter(Context c, List<JobModel> jobLists) {
this.context = c;
this.mInflater = LayoutInflater.from(c);
this.jobLists = jobLists;
}


@Override
public int getCount() {
return jobLists.size() == 0 ? 0 : jobLists.size();// 固定显示50行数据
}


@Override
public Object getItem(int position) {
return jobLists.get(position);
}


@Override
public long getItemId(int position) {
return position;
}


@SuppressLint("ResourceAsColor")
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder = null;
if (convertView == null) {
holder = new ViewHolder();
convertView = mInflater.inflate(
R.layout.fragment_planreservation_lv_item, null);
holder.boxType = (TextView) convertView.findViewById(R.id.boxType);
holder.pire = (TextView) convertView.findViewById(R.id.pire);
holder.desc = (TextView) convertView.findViewById(R.id.desc);
holder.time = (TextView) convertView.findViewById(R.id.time);
holder.date = (TextView) convertView.findViewById(R.id.date);
holder.tv_Surplus = (TextView) convertView
.findViewById(R.id.tv_Surplus);
holder.planSurplus = (TextView) convertView
.findViewById(R.id.planSurplus);
holder.ll_root = (LinearLayout) convertView
.findViewById(R.id.ll_root);
holder.boxImg = (ImageView) convertView.findViewById(R.id.boxImg);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
// 设置字体大小
holder.boxType.setTextSize(Constants.FORNT_SIZE);
holder.pire.setTextSize(Constants.FORNT_SIZE - 2);
holder.date.setTextSize(Constants.FORNT_SIZE - 2);
holder.tv_Surplus.setTextSize(Constants.FORNT_SIZE - 2);
holder.planSurplus.setTextSize(Constants.FORNT_SIZE - 2);
holder.desc.setTextSize(Constants.FORNT_SIZE - 4);
holder.time.setTextSize(Constants.FORNT_SIZE - 2);

// 设置值
JobModel job = jobLists.get(position);
holder.boxType.setText(job.getJobType());
holder.pire.setText(job.getPire());
holder.date.setText(job.getPlanDate());
holder.desc.setText(job.getCartonsDescription());
holder.time.setText(job.getTime());
//设置字体颜色
holder.time.setTextColor(context.getResources().getColor(
R.color.title_color));
// 处理 剩余的预约数
if (job.getPlanSurplus().equals("0")) {
holder.planSurplus.setTextColor(context.getResources().getColor(
R.color.red));
} else {
holder.planSurplus.setTextColor(context.getResources().getColor(
R.color.black));
}
holder.planSurplus.setText(job.getPlanSurplus());
// 设置 Item 作业类型
if (Constants.INTO_HEAVYBOX == job.getTypeId()) {// 进重箱
//holder.boxImg.setBackgroundResource(R.drawable.type2);
holder.boxType.setTextColor(context.getResources().getColor(
R.color.Green));
} else if (Constants.LIFT_HEAVYBOX == job.getTypeId()) {// 提重箱
//holder.boxImg.setBackgroundResource(R.drawable.type1);
holder.boxType.setTextColor(context.getResources().getColor(
R.color.red));
} else if (Constants.MENTION_EMPTY == job.getTypeId()) {// 提空箱
//holder.boxImg.setBackgroundResource(R.drawable.type3);
holder.boxType.setTextColor(context.getResources().getColor(
R.color.Blue));
}
// 设置Item的点击
if (Constants.CLICKED == job.getTag()) {
holder.ll_root.setBackgroundResource(R.drawable.click);
} else if (Constants.UNCLICKED == job.getTag()) {
holder.ll_root.setBackgroundResource(R.drawable.unclick);
}
return convertView;
}


class ViewHolder {
private TextView boxType, desc, time, pire, date, planSurplus,
tv_Surplus;
private LinearLayout ll_root;
private ImageView boxImg;


}
}

  分析:可以根据需求设置自己的代码。

   BaseAdapter 需要实现这几个方法:

   getCount(): 返回数据集合的Size()数目

   getItem(int position): 返回数据集合的单个实体

   getItemId(int position):返回数据集合中单个实体在数据集合的位置Id

    getView(int position, View convertView, ViewGroup parent):这是BaseAdapter最重要的方法。

         position :表示将显示的是第几 行

         convertView:从布局文件中inflate来的布局。我们写一个类来描述布局文件中的各个组件,比如                                     ImageView,TextView 等,然后判断convertView是否为空,如果为空就从inflate中                              拿到布局,并新建一个ViewHolder,然后从convertView中 拿到布局中的各个组件,同                            时把ViewHolder放到tag中去,下次就不用重写new了,直接从tag中拿就可以了,然后                            把布局中的各个组件都设上对 应的值,这里的Position对应到含有HashMap的List中的                               position。


综合上面的这4种适配器,常用到的是BaseAdapter进行自己的UI数据扩展,SimpleCursorAdapter使用上主要是针对手机SQLite的数据时使用到。



这篇关于Adapter适配器的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1066187

相关文章

C++ STL 适配器

系列文章目录 模板特例化,偏特化,左右值引用 https://blog.csdn.net/surfaceyan/article/details/126794013 C++ STL 关联容器 https://blog.csdn.net/surfaceyan/article/details/127414434 C++ STL 序列式容器(二) https://blog.csdn.net/surfac

超越IP-Adapter!阿里提出UniPortrait,可通过文本定制生成高保真的单人或多人图像。

阿里提出UniPortrait,能根据用户提供的文本描述,快速生成既忠实于原图又能灵活调整的个性化人像,用户甚至可以通过简单的句子来描述多个不同的人物,而不需要一一指定每个人的位置。这种设计大大简化了用户的操作,提升了个性化生成的效率和效果。 UniPortrait以统一的方式定制单 ID 和多 ID 图像,提供高保真身份保存、广泛的面部可编辑性、自由格式的文本描述,并且无需预先确定的布局。

漫谈设计模式 [6]:适配器模式

引导性开场 菜鸟:老鸟,我最近在项目中遇到一个问题,我们的系统需要集成一个新的第三方库,但这个库的接口和我们现有的代码完全不兼容。我该怎么办? 老鸟:这是个常见的问题,很多开发者都会遇到这种情况。你有没有听说过适配器模式? 菜鸟:适配器模式?没有,能详细说说吗? 老鸟:当然可以!这就是我们今天要讨论的主题。适配器模式是一个设计模式,可以帮助我们解决你现在遇到的问题。 渐进式介绍概念 老

java设计模式day03--(结构型模式:代理模式、适配器模式、装饰者模式、桥接模式、外观模式、组合模式、享元模式)

5,结构型模式 结构型模式描述如何将类或对象按某种布局组成更大的结构。它分为类结构型模式和对象结构型模式,前者采用继承机制来组织接口和类,后者釆用组合或聚合来组合对象。 由于组合关系或聚合关系比继承关系耦合度低,满足“合成复用原则”,所以对象结构型模式比类结构型模式具有更大的灵活性。 结构型模式分为以下 7 种: 代理模式 适配器模式 装饰者模式 桥接模式 外观模式 组合模式

【扩散模型(十)】IP-Adapter 源码详解 4 - 训练细节、具体训了哪些层?

系列文章目录 【扩散模型(一)】中介绍了 Stable Diffusion 可以被理解为重建分支(reconstruction branch)和条件分支(condition branch)【扩散模型(二)】IP-Adapter 从条件分支的视角,快速理解相关的可控生成研究【扩散模型(三)】IP-Adapter 源码详解1-训练输入 介绍了训练代码中的 image prompt 的输入部分,即 i

《GOF设计模式》—适配器(ADAPTER)—Delphi源码示例:可插入的Adapter(参数化的适配器)

 示例:可插入的Adapter(参数化的适配器) 实现: c)、参数化的适配器 用一个或多个模块对适配器进行参数化。模块构造支持无子类化的适配。一个模块可以匹配一个请求,并且适配器可以为每个请求存储一个模块。 在本例中意味着,TreeDisplay存储的一个模块用来将一个节点转化成为一个GraphicNode,另外一个模块用来存取一个节点的子节点。   例如,当对一个目录

《GOF设计模式》—适配器(ADAPTER)—Delphi源码示例:可插入的Adapter(使用代理对象)

 示例:可插入的Adapter(使用代理对象) 实现: b)、使用代理对象 在这种方法中,TreeDisplay将访问树结构的请求转发到代理对象。TreeDisplay的客户进行一些选择,并将这些选择提供给代理对象,这样客户就可以对适配加以控制,如下图所示。 例如,有一个DirectoryBrowser,它像前面一样使用TreeDisplay。DirectoryBrows

《GOF设计模式》—适配器(ADAPTER)—Delphi源码示例:可插入的Adapter(使用抽象操作)

 示例:可插入的Adapter(使用抽象操作) 说明: 当其他的类(如A)使用一个类(如C)时,如果所需的假定条件越少,这个类(如C)就更具可复用性。如果将接口匹配构建为一个类(如B),就不需要假定对其他的类可见的是一个相同的接口(如C接口)。也就是说,接口匹配使得我们可以将自己的类(如C)加入到一些现有的系统中去,而这些系统对这个类(如C)的接口可能会有所不同。 A  =〉 C

《GOF设计模式》—适配器(ADAPTER)—Delphi源码示例:绘图编辑器

 示例:绘图编辑器 说明: 有时,为复用而设计的工具箱类不能够被复用的原因仅仅是因为它的接口与专业应用领域所需要的接口不匹配。 例如,有一个绘图编辑器,这个编辑器允许用户绘制和排列基本图元(线、多边型和正 文等)、生成图片和图表。这个绘图编辑器的关键抽象是图形对象。图形对象有一个可编辑的形状,并可以绘制自身。图形对象的接口由一个称为Shape的抽象类定义。绘图编辑器为每一种图形对

《GOF设计模式》—适配器(ADAPTER)—Delphi源码示例:适配器接口

 示例:适配器接口 说明: (1)、定义 将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。 (2)、结构 对象匹配器依赖于对象组合,如下图所示。 目标Target:定义Client使用的与特定领域相关的接口。 适配器Adapter:对Adaptee的接口与Target接口进行适配。 被适配者A