Android 之Adapter

     在Android开发中,凡是进行多数据列表展示,如ListView , GridView等,那么它们是如何展示数据的呢?才能自动匹配,把数据一一对应放在我们想要它出现的位置,是什么东西完成了数据与UI完美适配?嗯,那就是Adapter。

      我们常用的Adapter有三种:

1)ArrayAdapter

2)  SimpleAdapter

3)  BaseAdapter

一 :ArrayAdapter

如果我们只是简单的展示文字列表,比如说联系人,文章列表等,这个是最好的选择。

用法:

main.xml

<relativelayout xmlns:android="http://schemas.android.com/apk/res/android" ...="" tools:context=".MainActivity">
    <listview android:id="@+id/listView1" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignparentleft="true" android:layout_alignparenttop="true">
    </listview>
 
</relativelayout>

MainActivity:

public class MainActivity extends Activity {
    private ListView mListView;
    @Override
    public void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        mListView = (ListView)findViewById(R.id.listView1);
        mListView.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item, getData()));
        
    } 
      
    private List<String> getData(){
        List<String> data = new ArrayList<String>();
        data.add("小王");
        data.add("小李");
        data.add("小张");          
        return data;
    }
}
关键部分重要是ArrayAdapter构造方法的三个参数
第一个是Context ,第二个是每一行数据展示的布局方式,第三个就是数据源,是一个List或者Array,里面每一个元素对应ListView一行数据。
android.R.layout.simple_list_item是安卓系统给定的布局样式。

 
 二,SimpleAdapter 

       前面ArrayAdapter 主要是用于显示单行文本,而SimpleAdapter则扩展性更好,每一行可以定义出各种布局风格,数据源包装形式是List<Map<String, Object>> 其中每一个HashMap构成的List对应列表的每一行,list中每一节中Map<String,Object>对应一个组件。

public class ImageListView extends ListActivity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
  
        SimpleAdapter adapter = new SimpleAdapter(this,getData(),R.layout.imagelayout,
                new String[]{"title","info","img"},
                new int[]{R.id.title,R.id.info,R.id.img});
        setListAdapter(adapter);
    }
    private List<Map<String, Object>> getData() {
        List<Map<String, Object>> mList = new ArrayList<Map<String, Object>>();   
        Map<String, Object> map = new HashMap<String, Object>();
        map.put("title", "小王");
        map.put("info", "北京");
        map.put("img", R.drawable.icon);
        mList.add(map);
  
        map = new HashMap<String, Object>();
        map.put("title", "小李");
        map.put("info", "武汉");
        map.put("img", R.drawable.icon2);
        list.add(map);           
        return list;
    }
}
     SimpleAdapter构造方法四个参数,第一个是Context 上下文,第二个是数据源,是包含Map对象的list,第三个参数是每一行各个组件的布局文件,第四个,第五个参数是一种映射,将数据源中Map的Key值与布局文件layout的id对应起来。
三,BaseAdapter

前面SimpleAdapter已经能自定义列表格式,扩展性很好,那为什么还要有一个BaseAdapter呢?这里你要考虑SimpleAdapter加载的每一行布局只是单纯的把布局文件引用过来,这个布局不是我们当前显示的主页面的布局,仅仅是定义列表每一行的布局,往往没有经过“实例化”,上面imagelayout布局中的组件只用于显示,不能添加附加操作,比如我们映射一个按钮,想要响应按钮的点击事件,但是没有办法用findViewByid,实例化按键,所以想要添加按键响应必须去重写SimpleAdapter类,在getView里面去获得按键,添加响应事件,其实如果是这样,用法和BaseAdapter一样了。

java代码里:(将手机app图标和名称以gridView形式展示)

private List<ResolveInfo> gridlist;
mdapter = new Launcher_Grid_adapter(this, gridlist);
gridview.setAdapter(mdapter);
gridview.setOnItemClickListener(new ItemClickListener());
public class Launcher_Grid_adapter extends BaseAdapter
{
	private List<ResolveInfo> mApps ;
	private Context context ;
	private LayoutInflater mInflate ;
	public Launcher_Grid_adapter(Context context ,List<ResolveInfo> apps)
	{
		super();
		this.context = context ;
		mInflate = LayoutInflater.from(context);
		this.mApps = apps ;
	}
	@Override
	public int getCount() {
		return mApps.size();
	}
	@Override
	public Object getItem(int position)
	{
		return mApps.get(position);
	}
	@Override
	public long getItemId(int position)
	{
		return position ;
	}
	@Override
	public View getView(int position ,View convertView , ViewGroup parent)
	{
		ViewHolder holder ;
		if(convertView == null)
		{
			holder = new ViewHolder();
			convertView = mInflate.inflate(R.layout.grid_adapter, null);
			holder.iv=(ImageView)convertView.findViewById(R.id.ItemImage);
			holder.tv = (TextView)convertView.findViewById(R.id.ItemText);
			convertView.setTag(holder);
		}
		else
		{
			holder = (ViewHolder)convertView.getTag();
		}
		ResolveInfo info = mApps.get(position);
		holder.iv.setImageDrawable(info.activityInfo.loadIcon(context.getPackageManager()));
		String text = (String) info.activityInfo.loadLabel(context.getPackageManager());
		holder.tv.setText(text);
		return convertView;
	}
}
 class ViewHolder
{
	TextView tv ;
	ImageView iv ;
}
grid_adapter.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    >
    <ImageView
        android:id="@+id/ItemImage"
        android:layout_width="100dp"
        android:layout_height="100dp"
        android:layout_centerHorizontal="true"
        android:contentDescription="@string/app_name"/>
    <TextView 
        android:id="@+id/ItemText"
        android:layout_below="@id/ItemImage"
        android:layout_centerHorizontal="true"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="24sp"
        android:layout_marginTop="10dp"
        android:maxEms="12"
        android:singleLine="true"
        android:ellipsize="end"
        android:textColor="#ffff0000"
        />

</RelativeLayout>
getView根据getCount返回的个数,调用对应次数,绘制每一行。

这里用到了ViewHolder缓存机制,增加UI响应速度。这里不做说明。


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值