今天呢,我给大家带来的是BaseAdapter 和 SimpleAdapter 的区别 ,大家可能会在用到适配器的时候会对两种适配器进行一个区别性的对比,然后再决定用哪一种适配器。
这里呢!只是我平时在用的时候,自己总结的一些区别吧!
我将代码就一起附上,然后再进行说明!
先,我们开看一下简单的 adapter :这里是界面图:
Adapter可以是一个简单的数组:ArrayAdapter,也可以是游标:SimpleCursorAdapter
还可以采用继承BaseAdapter来自定义adapter来绑定数据进行显示。
package cn.android.app;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast;
public class ListViewActivity extends Activity {
private ListView myListView;
// to define a array to set the data
String[] listData = { "Exit this way", "Far away from home",
"from sarah with love", "God is a girl" };
@Override
protected void onCreate(Bundle savedInstanceState) {
// and there i define the listt view to get the data
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// to get the listview
myListView = (ListView) findViewById(R.id.listview);
setTitle("listview 示列 ");
First_initData();
}
private void First_initData() {
/***
*
*
* 实例化一个数组 adapter(arrayadapter) ,三个参数, this 表示当前引用上下文,第二个参数利用条目显示的布局
* 这里调用了系统自带的布局,第三个参数,绑定显示的数据 传入数组
*/
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_1, listData);
// 绑定 adapter
myListView.setAdapter(adapter);
// 添加点击事件
myListView.setOnItemClickListener(new OnItemClickListener() {
/**
* adapter 绑定的 adapter
*
* v 条目显示的内容
*
* position v 对应的位置
*
* id 条目的 id
*
*
* */
@Override
public void onItemClick(AdapterView<?> adapter, View v,
int position, long id) {
// 显示一句
new_Toast(v + "");
}
});
/**
*
* 当然这里我们还有直接去继承 listactivity 的,这样我们就可以
* 在绑定 adapter 的时候通过调用父类的 setlistadapter 来绑定 listview 与适配器adapter
* setListAdapter ( listData ); 这里我们省去了实例话 listview 的那一步
* 当然,这里我们布局文件里面的 listview 的属性必须要是实现了系统的才行
* android:id="@id/android:liat"; 不然会抛出找不到 listview 的异常。
* 在实现点击事件时直接重写 onlistitemclick 监听 liatview 列表条目的单击事 就 ok啦!
*
*
* 其实在实际的开发中,这些都是常用的方式,可是,我们会优先用继承listactivity 的那一种。因为代码会少一些!
* */
}
public void new_Toast(String str) {
// 这里我们把 toast 封装一下
Toast.makeText(this, str, Toast.LENGTH_SHORT).show();
}
}
其实最重要的就是 simpleadapter 相对于这个 Baseadapter 来说呢,就有点太 过于简单了!
这里的简单呢!不是说是他的用法以及否认他的级别,而是说呢在应用方面在某些方面
会有一些限制性。这些都是有图有真相的哦!
先看看这个:
然后再看看这个:
这下明白了吧!
但是对于 simpleadapter 的爱好者来,也许就不尽其然了。
所以,这里我们来看一下 simpleadapter 的用法吧:
先看看效果了:
然后,下面就是一些简单的代码:
package cn.android.app;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import android.app.Activity;
import android.os.Bundle;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.Toast;
public class ListViewSimple extends Activity {
private ListView myListView;
// to define a array to set the data
String[] listData = { "Exit this way", "Far away from home",
"from sarah with love", "God is a girl" };
int []img = { R.drawable.emoji_000, R.drawable.emoji_001,
R.drawable.emoji_002, R.drawable.emoji_003 };
@Override
protected void onCreate(Bundle savedInstanceState) {
// and there i define the listt view to get the data
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// to get the listview
myListView = (ListView) findViewById(R.id.listview);
setTitle("listview 示列");
initData();
}
private void initData() {
// 定义一个数组
ArrayList<Map<String, String>> list = new ArrayList<Map<String, String>>();
// 填充
for (int i = 0; i < img.length; i++) {
// 定义一个集合
Map<String, String> map = new HashMap<String, String>();
map.put("img", img[i]+"");
map.put("cont", listData[i]);
list.add(map);
}
// ImageView imgView;
// TextView textView;
// imgView=(ImageView) findViewById(R.id.imageview);
// textView=(TextView) findViewById(R.id.textview);
String []from={"img","cont"};
int []to={R.id.imageview,R.id.textview};
//new一个simpleadapter
SimpleAdapter adapter=new SimpleAdapter(this, list, R.layout.list_cell, from, to);
myListView.setAdapter(adapter);
}
public void new_Toast(String str) {
// 这里我们把toast封装一下
Toast.makeText(this, str, Toast.LENGTH_SHORT).show();
}
}
然后,我们来看一下 baseadapter :
这里我是利用他来实现的一个 gridview 里面的适配:
package cn.android.app;
import android.app.Activity;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.GridView;
import android.widget.ImageView;
import android.widget.TextView;
public class GridViewActivity extends Activity {
/** Called when the activity is first created. */
/**
*
* 这里我会演示一个GridView的实现,其实醉翁之意不在酒啦,我只是想看看看 baseadapter而已
*
*
* 有适配器的地方,大家都知道需要一个大的控件,然后再加一个可以填充这个控件的小布局
*
* 所以,这里我们有两个布局,一个布局是main,在那里面有控件GridView,然后
* 我还创建了一个布局,就是填充那个GridView的小布局,在那里面有一个文本 控件,还有一个 imageview,这个布局就是main_view
*
* */
private GridView myGridView;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// 得到gridview的实例
myGridView = (GridView) findViewById(R.id.gridview);
// to set the title
setTitle("GridView的使用");
// 这里创建一个绑定适配器的方法
bindAdapter();
}
private void bindAdapter() {
MyCarAdapter adapter = new MyCarAdapter();
myGridView.setAdapter(adapter);
}
// 自定义一个adapter,可以灵活的来控制gridview子控件的布局显示
// 这是一个内部类
class MyCarAdapter extends BaseAdapter {
// 图片的索引id
int[] img = { R.drawable.emoji_000, R.drawable.emoji_001,
R.drawable.emoji_002, R.drawable.emoji_003,
R.drawable.emoji_004, R.drawable.emoji_005,
R.drawable.emoji_006, R.drawable.emoji_007,
R.drawable.emoji_008 };
// 再定义一个数组,然后与之对应
String[] name = { "one", "two", "three", "four", "five", "six",
"seven", "eight", "nine" };
// 这里我们最好是重新写一下构造方法
public MyCarAdapter() {
}
// 获取条目的数量
@Override
public int getCount() {
// TODO Auto-generated method stub
return img.length;
}
// 返回子控件的内容
@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return img[position];
}
// 获取子控件的id
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return position;
}
// 重新加载view的方法
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
ImageView imageView = null;
if (convertView == null) {
// 通过layoutinflater类加载布局,返回一个view的实例对象
convertView = LayoutInflater.from(GridViewActivity.this)
.inflate(R.layout.main_view, null);
}
// 通过convertview调用findviewbyid方法根据其id返回相应的子控技
imageView = (ImageView) convertView.findViewById(R.id.image);
imageView.setImageResource(img[position]);
TextView textview = (TextView) convertView
.findViewById(R.id.text_name);
textview.setText(name[position]);
return convertView;
}
}
}
其实让我会有机会关注到他们两个的区别的还是在做项目的时候,所以。。。。作为程序员来说,做项目真的可以让我们看到许多看不到的瑕疵。
上次在做自己搭建服务端,但是需要对图片做许多迂回的操作的时候,到成功到达客户端的时候,去在显示到 listview 的时候,出现了一点问题,那就是我早做 listview需要的 adapter 的时候,我用的是 simpleadapter ,因为在这之前我可是从来没有选择用 baseadapter 哦!可是, simpleadapter 却在处理图片的时候出现了短路,我开始总以为是在传输的过程中遇到了一些问题导致了我的图片总是不会完整的显示在客户端,然后才知道是因为 simpleadapter 在转换图片的格式的时候,将图片损坏了,开始以为这是一个意外,但是,这个意外在我尝试了很多次后被定格为是必然的simpleadapter 的条件限制。虽然把集合里面的传送类型由 String 改了很多次,包括改成 object ,但是还是不行。毕竟不稳定。然后询问了一下教员,然后,教员就告诉我们 simpleadapter 太简了。所以,叫我们用 baseadapter ,那个就自带一个图片的接受,到时候就不会出现现在的这种情况了。后来一试试,还真的行了。
所以,大家还可以认真的区了解一下,当然,其实我觉得也许在这之间,我学到的更多地不是这个吧,而是让我明白了 listview ,这个控件的想象余地真的可以放大到好多倍!
我们一起加油,希望大家什么建议或则意见,我一定洗耳恭听咯!
谢谢!