`
zhubin215130
  • 浏览: 142349 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

【转】Adapter应用总结

阅读更多

Adapter应用总结

首先来看一下Adapter的体系结构:

 

 

一个Adapter的对象扮演一个桥梁的角色。这个桥梁连接着一个AdapterView和它所包含的数据。Adapter提供了一个通到数据项的途径。Adapter还负责为在数据集里的每个数据生项生成一个View。它有一个重要的方法:public abstract View getView (int position,View convertView,ViewGroup parent)。这个方法被setListAdapter(adapter)间接地调用。getView 方法的作用是得到一个View,这个view显示数据项里指定位置的数据,你可以或者手动创建一个view或者从一个XML layout中inflate。当这个view被inflated,它的父view(如GridView,ListView等)将要使用默认的layout参数,除非你用inflate(int,android.view.ViewGroup,boolean)方法来指定一个根view并防止附着在根上。

 

下面分别讲一下它的几个常见的子类:

 

ListAdapter接口:继承于Adapter。ListAdapter是一个ListView和list上的数据之间的桥梁。数据经常来自于一个Cursor,但这不是必须的。ListView能显示任何数据,只要它是被一个ListAdapter包装的。

 

BaseAdapter抽象类:是一个实现了既能在ListView(实现了ListAdapter接口)和Spinner(实现了Spinner接口)里用的Adapter类的一般基类。

 

ArrayAdapter类:一个管理这样的ListView的ListAdapter:这个ListView被一个数组所支持。这个数组可装任意对象。默认状态下,这个类预期能这样:提供的资源id与一个单独的TextView相关联。如果你想用一个更复杂的layout,就要用包含了域id的构造函数。这个域id能够与一个在更大的layout资源里的TextView相关联。它将被在数组里的每个对象的toString()方法所填满。你可以添加通常对象的lists或arrays。重写你对象的toString()方法来决定list里哪一个写有数据的text将被显示。如果想用一些其它的不同于TextView的view来显示数组(比如ImageViews),或想有一些除了toString()返回值所填在views里的以外的数据,你就要重写getView(int,View,ViewGroup)方法来返回你想要的View类型。

 

SimpleAdapter类:一个使静态数据和在XML中定义的Views对应起来的简单adapter。你可以把list上的数据指定为一个Map范型的ArrayList。ArrayList里的每一个条目对应于list里的一行。Maps包含着每一行的数据。你先要指定一个XML,这个XML定义了用于显示一行的view。你还要指定一个对应关系,这个对应关系是从Map的keys对应到指定的views。绑定数据到views发生在两个阶段:

 

如果一个simpleAdapter.ViewBinder是可用的,那么SetViewValue(android.view.View,Object,String)要被调用。如果返回true,那么绑定发生了。如果返回false,那么如下views将被按顺序地尝试:

 

~实现了Checkable的View(如CheckBox),预期的绑定值是boolen

 

~TextView,预期的绑定值是String,并且SetViewText方法被调用

 

~ImageView,预期的绑定值是一个资源的id或String。并且SetViewImage方法被调用

 

如果没有合适的绑定被发现,一个IllegalStateException被抛出。

 

下面是一个SimpleAdapter的例子:

 

 

/*--------------------mail.xml---------------------------*/

 

 

 

 

xmlns:android="http://schemas.android.com/apk/res/android"

android:orientation="vertical"

android:layout_width="fill_parent"

android:layout_height="fill_parent">

 

android:layout_width="fill_parent"

android:layout_height="fill_parent"

android:id="@+id/MyListView">

 

 

 

 

 

/*--------------------simple_list_item_2.xml---------------------------*/

 

 

 

xmlns:android="http://schemas.android.com/apk/res/android"

android:id="@+id/widget0"

android:layout_width="fill_parent"

android:layout_height="fill_parent">

 

android:id="@+id/ItemImage"

android:layout_width="wrap_content"

android:layout_height="wrap_content">

 

 

android:id="@+id/ItemTitle"

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:text="TextView"

android:layout_x="50px"

android:textSize="15pt">

 

 

android:id="@+id/ItemText"

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:text="TextView"

android:layout_x="50px"

android:layout_y="40px">

 

 

android:id="@+id/ItemCheck"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_x="270px">

 

 

 

/*--------------------TestUIList.java---------------------------*/

 

public class TestUIList extends Activity {

 

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

 

ListView list = (ListView) findViewById(R.id.MyListView);

 

 

ArrayList> lstImageItem = new ArrayList>();

String[] str1 = { "row one", "row two", "row three", "row four" };

String[] str2 = { "第一行", "第二行", "第三行", "第四行" };

for (int i = 0; i < str1.length; i++) {

HashMap map = new HashMap();

map.put("ItemImage", R.drawable.icon);

map.put("ItemTitle", str1[i]);

map.put("ItemText", str2[i]);

lstImageItem.add(map);

}

 

 

SimpleAdapter saImageItems = new SimpleAdapter(this,

lstImageItem,

R.layout.simple_list_item_2,

 

new String[] { "ItemImage", "ItemTitle", "ItemText" },

new int[] { R.id.ItemImage, R.id.ItemTitle, R.id.ItemText });

 

list.setAdapter(saImageItems);

}

}

 

如果你的ListView的每一行想实现被点击后有响应事件。最省事发的方法是继承一个ListActivity。ListActivity是一个这样的Activity:这个Activity能通过绑定到一个像array或cursor这样的数据源来显示一些items的list,并且当用户选了一个item时,能够暴露事件句柄。

 

ListActivity拥有一个ListView对象。这个ListView对象能够被绑定到不同的数据源,特别是一个数组或者一个拥有查询结果的Cursor。ListActivity有三种用法,分别是Binding,Screen Layout和Row Layout。下面仅讨论一下Screen Layout:

 

ListActivity有一个默认的layout。这个 layout是由一个在屏幕中央的、单独的、全屏的list构成。然而,如果你想的话,你可以通过在onCreate()里调用setContentView()方法来设置你自己的view layout的方式制定屏幕layout。要这样做,你自己的view必须包含一个id为“@android:id/android:list”(或者在代码中有list对象)。

 

随意地,当你制定这个view是空的时,你能够包含任何类型的view对象来显示。这个“空list”通知者必须有一个id“android:empty”。

 

注意,最后一定要调用setListAdapter(adapter)方法来把通过Adapter绑定了数据的这个List显示出来。setListAdapter方法间接调用了Adapter的getView方法,其作用是返回你想要的view类型。而且当点击listView里的item时,会根据getView重画这个ListView。例子可参见《Android SDK开发大全》中的“资源管理器“的例子。

 

想要实现事件监听,就要重写 protected void onListItemClick(ListView l, View v, int position,long id)方法。

 

想要把在XML中自定义了一行的view逐行显示在ListActivity中自定义的ListView中,并且在每行动态绑定数据的话,一般要自己写一个MyAdapter类,这个Adapter继承BaseAdapter并且其构造函数中至少有一个List参数来实现动态绑定数据。有两个重要的步骤:

 

1)重写getView方法,其中一重要步骤就是用items.get(position)方法来获得被传入的数据。其中items是一个List,它被赋了传入的List参数的值。position是这个数据在ListView中的行数。Get返回的是E类型.即List中的模板类型。

 

2)写一个内部类private class ViewHolder。这个内部类只有成员变量,它们就是你想在ListView中的一行里要显示的小View成分。

 

要想在Adapter中动态传入其它类的数据,就要在构造函数中再增加一个(或更多)List参数。

 

最后我们给出自己些的MyAdapter配合ListActivity实现监听事件的例子:

 

 

/*--------------------MyHome.java-----------------------*/

 

 

package com.li.android.myhome;

 

import java.util.ArrayList;

import java.util.List;

 

import android.app.AlertDialog;

import android.app.ListActivity;

import android.content.DialogInterface;

import android.os.Bundle;

import android.view.View;

import android.widget.ListView;

 

public class MyHome extends ListActivity

{

 

private List items = null;

 

protected void onCreate(Bundle icicle)

{

 

super.onCreate(icicle);

 

setContentView(R.layout.main);

 

items = new ArrayList();

 

String[] titles =

{ "默认主题", "主题-A", "主题-B", "中秋佳节", "粉红女郎", "花样年华" };

 

for (int i = 0; i < titles.length; i++)

{

 

String title = titles[i];

items.add(title);

 

}

 

setListAdapter(new MyAdapter(this, items));

}

 

@Override

protected void onListItemClick(ListView l, View v, int position,

long id)

{

new AlertDialog.Builder(MyHome.this).setItems(

R.array.items_my_dialog, new DialogInterface.OnClickListener()

{

public void onClick(DialogInterface dialog, int whichcountry)

{

 

}

})

 

.show();

}

 

}

 

 

/*--------------------MyAdapter.java-----------------------*/

 

 

package com.li.android.myhome;

 

import java.util.List;

import android.content.Context;

import android.graphics.Bitmap;

import android.graphics.BitmapFactory;

import android.view.LayoutInflater;

import android.view.View;

import android.view.ViewGroup;

import android.widget.BaseAdapter;

import android.widget.ImageView;

import android.widget.TextView;

 

public class MyAdapter extends BaseAdapter

{

 

private LayoutInflater mInflater;

 

private Bitmap icom_theme;

 

private Bitmap icon_selected32;

 

private List items;

 

public MyAdapter(Context context, List it)

{

 

mInflater = LayoutInflater.from(context);

items = it;

 

icom_theme = BitmapFactory.decodeResource(context.getResources(),

R.drawable.theme);

icon_selected32 = BitmapFactory.decodeResource(context

.getResources(), R.drawable.selected32);

 

}

 

public int getCount()

{

return items.size();

}

 

public Object getItem(int position)

{

return items.get(position);

}

 

public long getItemId(int position)

{

return position;

}

 

public View getView(int position, View convertView, ViewGroup parent)

{

ViewHolder holder;

 

convertView = mInflater.inflate(R.layout.file_row, null);

 

holder = new ViewHolder();

holder.text = (TextView) convertView.findViewById(R.id.text);

holder.mTheme = (ImageView) convertView.findViewById(R.id.theme);

holder.mSelected32 = (ImageView) convertView

.findViewById(R.id.selected32);

 

holder.mTheme.setImageBitmap(icom_theme);

 

String title = items.get(position);

holder.text.setText(title);

 

holder.mSelected32.setImageBitmap(icon_selected32);

 

return convertView;

}

 

private class ViewHolder

{

TextView text;

ImageView mTheme;

ImageView mSelected32;

}

}

 

/*--------------------main.xml-----------------------*/

 

 

 

 

xmlns:android="http://schemas.android.com/apk/res/android"

android:orientation="vertical"

android:layout_width="fill_parent"

android:layout_height="fill_parent"

>

 

 

android:id="@android:id/list"

android:layout_width="fill_parent"

android:layout_height="wrap_content"

>

 

 

 

 

/*-------------------- file_row.xml-----------------------*/

 

 

xmlns:android="http://schemas.android.com/apk/res/android"

android:id="@+id/widget0"

android:layout_width="fill_parent"

android:layout_height="fill_parent" >

 

android:layout_width="wrap_content"

android:layout_height="wrap_content"

>

 

 

 

android:id="@+id/text"

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:layout_x="50px"

android:textSize="15pt">

 

 

android:id="@+id/selected32"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_x="270px">

 

 

 

 

 

/*--------------------string.xml-----------------------*/

 

 

Hello World, 仿熊猫

仿熊猫

 

应用主题

编辑主题

删除主题

分享到:
评论

相关推荐

    Android之Adapter用法总结

    ### Android之Adapter用法总结 #### 一、概念与作用 **Adapter** 是 Android 开发中连接后端数据和前端视图的一个关键组件。它作为数据和用户界面(UI)之间的桥梁,在Android开发中扮演着极其重要的角色。尤其是...

    android adapter 开发总结

    总结起来,Adapter在Android开发中扮演着不可或缺的角色,它们是连接数据和UI的桥梁,使得开发者可以轻松地将各种类型的数据转换为用户友好的视图。理解并熟练掌握Adapter的使用,对于提升Android应用的用户体验至关...

    android(Adapter)适配器用法总结

    在实际应用中,我们需要根据不同的需求选择合适的 Adapter,并正确地使用它,以便开发出高效、可靠的应用程序。 在本文中,我们讨论了 Android 中的 Adapter 的种类和应用场景,并对每种 Adapter 的特点和优缺点...

    Android自定义adapter的listview

    在实际应用中,自定义Adapter通常涉及以下技术点: - 视图复用:为了提高性能,ListView使用了convertView机制。在getView()中,如果convertView不为空,那么我们可以复用这个已经创建过的View,避免频繁地创建新...

    万能Adapter

    在Android开发中,...总结,万能Adapter是Android开发中一个实用的工具,它通过封装和抽象,简化了数据绑定和视图管理的过程,提高了开发效率。理解其工作原理并熟练运用,对于提升Android应用的开发质量大有裨益。

    android开发Adapter详解

    Adapter的存在极大地简化了开发者的工作,使得他们能够更加专注于应用程序的核心功能而不是细节实现。 #### 二、Adapter的基础理解 1. **网络适配器**:通常指的是网卡,用于将计算机与网络连接起来,实现数据在...

    自定义ViewGroup+Adapter

    总结,自定义`ViewGroup`和`Adapter`是Android开发中提升UI定制化程度的关键技术。通过自定义`ViewGroup`,可以实现独特的布局和交互效果;而`Adapter`则使得数据和视图解耦,方便数据更新和视图复用。两者结合,...

    Android应用开发-Adapter的使用.pptx

    总结起来,Adapter在Android应用开发中起着数据适配的作用,将各种数据源的数据适配到UI组件,使得数据能够正确地显示给用户。同时,理解并熟练运用MVC模式有助于构建清晰、可维护的代码结构。无论是基础的...

    Adapter继承关系结构图

    #### 五、总结 通过以上分析可以看出,`Adapter`和`View`的继承结构是Android开发中极其重要的一部分。理解这些类和接口之间的关系有助于开发者更好地构建复杂的应用界面,并有效地管理数据和视图之间的交互。此外...

    最简洁的adapter

    本篇文章将详细探讨“最简洁的Adapter”及其在Android开发中的应用,特别是在使用xUtils库时的情况。 首先,我们要理解Adapter的基本概念。Adapter是Android系统提供的一个接口,通过实现这个接口,开发者可以...

    C++ Adapter 模式

    总结来说,Adapter模式是解决接口不兼容问题的关键,它在C++中可以通过类适配器和对象适配器两种形式实现。适配器模式不仅有助于不同组件之间的协作,还能够保持原有组件的独立性,使得系统设计更具扩展性和灵活性。...

    recyclerViewAdapter

    在Android开发中,RecyclerView是一个非常重要的...熟练掌握RecyclerViewAdapter的使用,对于开发高效、用户体验良好的Android应用至关重要。在实际开发中,应根据具体需求灵活运用这些技巧,提高代码的质量和效率。

    ASP.NET的适配器设计模式(Adapter)应用详解

    总结来说,适配器设计模式在ASP.NET中的应用主要体现在以下几个方面: 1. **接口兼容性**:通过适配器,可以使得旧有的或第三方的组件与新的系统接口相匹配,避免大规模修改原有代码。 2. **灵活性**:适配器允许...

    前端项目-ember-data-django-rest-adapter.zip

    总结来说,ember-data-django-rest-adapter是连接Ember.js前端应用与Django REST后端服务的桥梁,简化了跨平台的数据交互,提高了开发效率和应用性能。通过理解并掌握这些知识点,开发者能够更好地在Ember.js和...

    浅析Android之Adapter用法总结

    这篇文章将深入探讨Adapter的用法,包括其概念、常见类型以及应用案例。 首先,Adapter的概念是连接数据源和UI组件的适配器接口。它负责将后台数据适配到前端的视图中,使得不同的数据类型能够适应多种视图的显示...

    Adapter加载动画源码

    总结,Adapter加载动画是提升用户体验的重要手段,通过在`onBindViewHolder()`中添加简单动画,或者监听RecyclerView滑动事件实现加载更多动画,开发者可以为用户创造更加流畅、有趣的交互体验。同时,利用Android的...

    Android Adapter的使用

    总结,Android的适配器机制是数据驱动界面的关键,而ViewPager则提供了流畅的页面滑动体验。理解并熟练掌握这两种组件的使用,对于开发高效的Android应用至关重要。通过实践和不断学习,初学者可以逐步提升在Android...

    适配器Adapter使用示例

    总结一下,这个示例主要展示了如何自定义一个Adapter,包括创建一个适配器类,重写关键方法以显示数据,以及使用ViewHolder优化性能。同时,还介绍了如何使用Handler进行Adapter与Activity之间的通信,以便在数据...

Global site tag (gtag.js) - Google Analytics