BaseAdapter和SimpleAdapter的区别

 今天呢,我给大家带来的是BaseAdapterSimpleAdapter的区别,大家可能会在用到适配器的时候会对两种适配器进行一个区别性的对比,然后再决定用哪一种适配器。

这里呢!只是我平时在用的时候,自己总结的一些区别吧!

我将代码就一起附上,然后再进行说明!

   先,我们开看一下简单的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的用法吧:

先看看效果了:

然后,下面就是一些简单的代码:

  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<Map<String, String>> list = new ArrayList<Map<String, String>>();
 74 
 75  
 76 
 77 // 填充
 78 
 79 for (int i = 0; i < img.length; i++) {
 80 
 81 // 定义一个集合
 82 
 83 Map<String, String> map = new HashMap<String, String>();
 84 
 85 map.put("img", img[i]+"");
 86 
 87 map.put("cont", listData[i]);
 88 
 89 list.add(map);
 90 
 91  
 92 
 93 }
 94 
 95 //  ImageView imgView;
 96 
 97 // TextView textView;
 98 
 99 // imgView=(ImageView) findViewById(R.id.imageview);
100 
101 // textView=(TextView) findViewById(R.id.textview);
102 
103 String []from={"img","cont"};
104 
105 int []to={R.id.imageview,R.id.textview};
106 
107  
108 
109 //new一个simpleadapter
110 
111 SimpleAdapter adapter=new SimpleAdapter(this, list, R.layout.list_cell, from, to);
112 
113 myListView.setAdapter(adapter);
114 
115 }
116 
117  
118 
119 public void new_Toast(String str) {
120 
121 // 这里我们把toast封装一下
122 
123 Toast.makeText(this, str, Toast.LENGTH_SHORT).show();
124 
125 }
126 
127  
128 
129 }
130 
131  

然后,我们来看一下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,这个控件的想象余地真的可以放大到好多倍!

我们一起加油,希望大家什么建议或则意见,我一定洗耳恭听咯!

谢谢!

 

 

 

一切只是为了充实自己!!stay hungry and stay foolish!!
原文地址:https://www.cnblogs.com/Catherine-Brain/p/3543773.html