今天呢,我给大家带来的是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表示当前引用上下文,第二个参数利用条目显示的布局 * 这里调用了系统自带的布局,第三个参数,绑定显示的数据 传入数组 */ ArrayAdapteradapter = new ArrayAdapter (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的用法吧:
先看看效果了:
然后,下面就是一些简单的代码:
1 package cn.android.app; 2 3 4 5 import java.util.ArrayList; 6 7 import java.util.HashMap; 8 9 import java.util.Map; 10 11 12 13 import android.app.Activity; 14 15 import android.os.Bundle; 16 17 import android.widget.ListView; 18 19 import android.widget.SimpleAdapter; 20 21 import android.widget.Toast; 22 23 24 25 public class ListViewSimple extends Activity { 26 27 private ListView myListView; 28 29 // to define a array to set the data 30 31 String[] listData = { "Exit this way", "Far away from home", 32 33 "from sarah with love", "God is a girl" }; 34 35 int []img = { R.drawable.emoji_000, R.drawable.emoji_001, 36 37 R.drawable.emoji_002, R.drawable.emoji_003 }; 38 39 40 41 @Override 42 43 protected void onCreate(Bundle savedInstanceState) { 44 45 46 47 // and there i define the listt view to get the data 48 49 super.onCreate(savedInstanceState); 50 51 setContentView(R.layout.main); 52 53 // to get the listview 54 55 myListView = (ListView) findViewById(R.id.listview); 56 57 setTitle("listview 示列"); 58 59 60 61 initData(); 62 63 64 65 } 66 67 68 69 private void initData() { 70 71 // 定义一个数组 72 73 ArrayList
然后,我们来看一下baseadapter:
这里我是利用他来实现的一个gridview里面的适配:
1 package cn.android.app; 2 3 4 5 import android.app.Activity; 6 7 import android.os.Bundle; 8 9 import android.view.LayoutInflater; 10 11 import android.view.View; 12 13 import android.view.ViewGroup; 14 15 import android.widget.BaseAdapter; 16 17 import android.widget.GridView; 18 19 import android.widget.ImageView; 20 21 import android.widget.TextView; 22 23 24 25 public class GridViewActivity extends Activity { 26 27 /** Called when the activity is first created. */ 28 29 /** 30 31 * 32 33 * 这里我会演示一个GridView的实现,其实醉翁之意不在酒啦,我只是想看看看 baseadapter而已 34 35 * 36 37 * 38 39 * 有适配器的地方,大家都知道需要一个大的控件,然后再加一个可以填充这个控件的小布局 40 41 * 42 43 * 所以,这里我们有两个布局,一个布局是main,在那里面有控件GridView,然后 44 45 * 我还创建了一个布局,就是填充那个GridView的小布局,在那里面有一个文本 控件,还有一个 imageview,这个布局就是main_view 46 47 * 48 49 * */ 50 51 private GridView myGridView; 52 53 54 55 @Override 56 57 public void onCreate(Bundle savedInstanceState) { 58 59 super.onCreate(savedInstanceState); 60 61 setContentView(R.layout.main); 62 63 // 得到gridview的实例 64 65 myGridView = (GridView) findViewById(R.id.gridview); 66 67 // to set the title 68 69 setTitle("GridView的使用"); 70 71 // 这里创建一个绑定适配器的方法 72 73 bindAdapter(); 74 75 } 76 77 78 79 private void bindAdapter() { 80 81 MyCarAdapter adapter = new MyCarAdapter(); 82 83 myGridView.setAdapter(adapter); 84 85 } 86 87 88 89 // 自定义一个adapter,可以灵活的来控制gridview子控件的布局显示 90 91 // 这是一个内部类 92 93 class MyCarAdapter extends BaseAdapter { 94 95 // 图片的索引id 96 97 int[] img = { R.drawable.emoji_000, R.drawable.emoji_001, 98 99 R.drawable.emoji_002, R.drawable.emoji_003, 100 101 R.drawable.emoji_004, R.drawable.emoji_005, 102 103 R.drawable.emoji_006, R.drawable.emoji_007, 104 105 R.drawable.emoji_008 }; 106 107 108 109 // 再定义一个数组,然后与之对应 110 111 String[] name = { "one", "two", "three", "four", "five", "six", 112 113 "seven", "eight", "nine" }; 114 115 116 117 // 这里我们最好是重新写一下构造方法 118 119 public MyCarAdapter() { 120 121 122 123 124 125 } 126 127 128 129 // 获取条目的数量 130 131 @Override 132 133 public int getCount() { 134 135 // TODO Auto-generated method stub 136 137 return img.length; 138 139 } 140 141 142 143 // 返回子控件的内容 144 145 @Override 146 147 public Object getItem(int position) { 148 149 // TODO Auto-generated method stub 150 151 return img[position]; 152 153 } 154 155 156 157 // 获取子控件的id 158 159 @Override 160 161 public long getItemId(int position) { 162 163 // TODO Auto-generated method stub 164 165 return position; 166 167 } 168 169 170 171 // 重新加载view的方法 172 173 @Override 174 175 public View getView(int position, View convertView, ViewGroup parent) { 176 177 // TODO Auto-generated method stub 178 179 ImageView imageView = null; 180 181 if (convertView == null) { 182 183 184 185 // 通过layoutinflater类加载布局,返回一个view的实例对象 186 187 convertView = LayoutInflater.from(GridViewActivity.this) 188 189 .inflate(R.layout.main_view, null); 190 191 } 192 193 // 通过convertview调用findviewbyid方法根据其id返回相应的子控技 194 195 imageView = (ImageView) convertView.findViewById(R.id.image); 196 197 imageView.setImageResource(img[position]); 198 199 TextView textview = (TextView) convertView 200 201 .findViewById(R.id.text_name); 202 203 textview.setText(name[position]); 204 205 206 207 return convertView; 208 209 } 210 211 212 213 } 214 215 216 217 } 218 219 220 221
其实让我会有机会关注到他们两个的区别的还是在做项目的时候,所以。。。。作为程序员来说,做项目真的可以让我们看到许多看不到的瑕疵。
上次在做自己搭建服务端,但是需要对图片做许多迂回的操作的时候,到成功到达客户端的时候,去在显示到listview的时候,出现了一点问题,那就是我早做listview需要的adapter的时候,我用的是simpleadapter,因为在这之前我可是从来没有选择用baseadapter哦!可是,simpleadapter却在处理图片的时候出现了短路,我开始总以为是在传输的过程中遇到了一些问题导致了我的图片总是不会完整的显示在客户端,然后才知道是因为simpleadapter在转换图片的格式的时候,将图片损坏了,开始以为这是一个意外,但是,这个意外在我尝试了很多次后被定格为是必然的simpleadapter的条件限制。虽然把集合里面的传送类型由String改了很多次,包括改成object,但是还是不行。毕竟不稳定。然后询问了一下教员,然后,教员就告诉我们simpleadapter太简了。所以,叫我们用baseadapter,那个就自带一个图片的接受,到时候就不会出现现在的这种情况了。后来一试试,还真的行了。
所以,大家还可以认真的区了解一下,当然,其实我觉得也许在这之间,我学到的更多地不是这个吧,而是让我明白了listview,这个控件的想象余地真的可以放大到好多倍!
我们一起加油,希望大家什么建议或则意见,我一定洗耳恭听咯!
谢谢!