注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

东东的博客

江南烟雨,同大家一起分享

 
 
 

日志

 
 

Adapter应用总结  

2009-10-15 10:39:41|  分类: android相关 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

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


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

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

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

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

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

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

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

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

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

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

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

   下面是一个SimpleAdapter的例子:


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


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">
    <ListView
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:id="@+id/MyListView">
    </ListView>


</LinearLayout>

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

<?xml version="1.0" encoding="utf-8"?>
<AbsoluteLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/widget0"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">    
    <ImageView
        android:id="@+id/ItemImage"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content">
    </ImageView>
    <TextView
        android:id="@+id/ItemTitle"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="TextView"
        android:layout_x="50px"
        android:textSize="15pt">
    </TextView>
    <TextView
        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">
    </TextView>
    <CheckBox
        android:id="@+id/ItemCheck"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_x="270px">
    </CheckBox>
</AbsoluteLayout>

/*--------------------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<HashMap<String, Object>> lstImageItem = new ArrayList<HashMap<String, Object>>();
        String[] str1 = { "row one", "row two", "row three", "row four" };
        String[] str2 = { "第一行", "第二行", "第三行", "第四行" };
        for (int i = 0; i < str1.length; i++) {
            HashMap<String, Object> map = new HashMap<String, Object>();
            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的每一行想实现被点击后有响应事件。最省事发的方法是继承一个ListActivityListActivity是一个这样的Activity:这个Activity能通过绑定到一个像arraycursor这样的数据源来显示一些itemslist,并且当用户选了一个item时,能够暴露事件句柄。

   ListActivity拥有一个ListView对象。这个ListView对象能够被绑定到不同的数据源,特别是一个数组或者一个拥有查询结果的CursorListActivity有三种用法,分别是Binding,Screen LayoutRow 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方法间接调用了AdaptergetView方法,其作用是返回你想要的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<E>参数来实现动态绑定数据。有两个重要的步骤:

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

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

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

   最后我们给出自己些的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<String> items = null;

  protected void onCreate(Bundle icicle)
  {

    super.onCreate(icicle);

    setContentView(R.layout.main);

    items = new ArrayList<String>();

    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<String> items;

  public MyAdapter(Context context, List<String> 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-----------------------*/


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
>

  <ListView
    android:id="@android:id/list"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
  >
  </ListView>
</LinearLayout>


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

<?xml version="1.0" encoding="utf-8"?>
<AbsoluteLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
     android:id="@+id/widget0"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"    >
  <ImageView android:id="@+id/theme"
    android:layout_width="wrap_content"
        android:layout_height="wrap_content"
  >
  </ImageView>

      <TextView
        android:id="@+id/text"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_x="50px"
        android:textSize="15pt">
    </TextView>
    <ImageView
        android:id="@+id/selected32"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_x="270px">
    </ImageView>
</AbsoluteLayout>



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

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="hello">Hello World, 仿熊猫</string>
    <string name="app_name">仿熊猫</string>
          <array name="items_my_dialog">
    <item>应用主题</item>
    <item>编辑主题</item>
    <item>删除主题</item>
  </array>
</resources>

  评论这张
 
阅读(1234)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017